Forum: FPGA, VHDL & Co. Verilog-Zuweisung


von Heinze (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

habe folgende Verilog-Zeilen in einer Testbench: siehe Anhang

Kann mir jemand dabei helfen, die Verilog-Beschreibung zum besseren 
Verständnis in VHDL umzuschreiben ?

vielen dAnk.

gruss,
Heinze

von Inkassounternehmer (Gast)


Lesenswert?

Bei Aldec.com gibt es ein schönes Verilog-Tutorial (interaktiv). Das hat 
mir auch schon geholfen, Verilog-Beschreibungen passend zu meinen 
Anwendungen zu modifizieren.

von Heinze (Gast)


Lesenswert?

Na dann dürfte das ja kein Problem für dich sein ... für mich schon,
deswegen frage ich hier

von Günter -. (guenter)


Lesenswert?

Schau mal im Verilog Artikel unter:

Verkettung:

http://www.mikrocontroller.net/articles/Verilog#Skalar.2C_Vektor.2C_Bit-Splitting.2C_Verkettung.2C_Wiederholung

Entscheidungsoperator:

http://www.mikrocontroller.net/articles/Verilog#Entscheidungsoperation_mit_if-else_und_.3F_:

Das ganz sind Multiplexer. Die tx_data_gen slices werden mit 0 gemuxed. 
Das Ergebnis wird verkettet und bildet den Eingang zum Ausgangsmux. Der 
muxed die Verkettung mit dem ganzen tx_data_gen.

Das ganze sieht etwa so aus:

1
tx_data_gen[7:0] -->M      
2
                    M--------|
3
               0 -->M        |
4
                             |
5
tx_data_gen[15:8]-->M        |
6
                    M--------|
7
               0 -->M        |
8
                             |
9
tx_data_gen[23:16]-->M       |
10
                     M-------|
11
                0 -->M       |
12
                             |
13
tx_data_gen[31:24]-->M       |---->M
14
                     M-------|     M
15
                0 -->M             M
16
                                   M
17
                                   M
18
                                   M
19
                                   M
20
                                   M---> data
21
                                   M
22
                   tx_data_gen --->M

von Günter -. (guenter)


Lesenswert?

tx_data_gen wird also data zugewiesen und durch die Multiplexer ist es 
möglich immer 8-bit slices auf 0 zu setzen.

von Inkassounternehmer (Gast)


Lesenswert?

Hätte ja sein können, dass es dich nur am Rande so interessiert. Ehe ich 
in Regress genommen werde, wollte ich es dir selbst ans Herzchen legen.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

<verilog>
assign #1 data =  (err_word == err_cnt) ?
({(err_byte == 4'h3) ? 8'b0 : tx_data_gen[31:24],
 (err_byte == 4'h2) ? 8'b0 : tx_data_gen[23:16],
 (err_byte == 4'h1) ? 8'b0 : tx_data_gen[15:8],
 (err_byte == 4'h0) ? 8'b0 : tx_data_gen[7:0]})
  : tx_data_gen;
</verilog>
Syntax-Highlighting scheint hier nicht zu gehen ?

Das #1 ist anscheinend das Verzögerungszeichen #, das kenne ich aus der 
Synthese nicht, das braucht man nur zur Simulation.

Da sind zwei Entscheidungsoperationen ineinandergeschachtelt - sehr 
übersichtlich! Zuerst kommt die Zuweisung falls wahr, nach dem 
Doppelpunkt falls falsch.
data wird gleich tx_data_gen  wenn  err_word ungleich err_cnt

bei Gleichheit werden je 4 Bit von err_byte abgefragt und je 8 Bit der 
32 Bit von data entweder Null oder aus je 8Bit von tx_data_gen (32Bit 
breit) gebildet

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

nein data ist natürlich 8 Bit breit
und falls err_byte tatsächlich ein Byte breit ist, wird nur die untere 
Hälfte benutzt

von Heinze (Gast)


Lesenswert?

Hallo,

danke für die Erklärungen. Ist jetzt klar.

In VHDL also in etwa so:


process(tx_data_gen, err_word, err_cnt, err_byte)
begin
   data <= tx_data_gen;

   if err_word = err_cnt then

      if err_byte="0011" then
         data(31 downto 24) <= (others => '0');
      end if;

      if err_byte="0010" then
         data(23 downto 16) <= (others => '0');
      end if;

      if err_byte="0001" then
         data(15 downto 8) <= (others => '0');
      end if;

      if err_byte="0000" then
         data(7 downto 0) <= (others => '0');
      end if;

   end if;
end process;

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Achtung: Der Verilog Conditional Operator (?:) hat die Eigenschaft, 
unbekannte Werte entsprechend durchzureichen (x-propagation). Das war 
möglicherweise auch der Grund für den Autor, das in dieser Form zu 
formulieren. Diese Fähigkeit in VHDL nachzubilden, kann etwas längeren 
Code erfordern.

Aber falls es darauf nicht ankommt, ist der Code oben schon OK. Ich 
würde wahrscheinlich eine case-Anweisung bevorzugen.

Gruß
Marcus
http://www.doulos.com/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.