Verilog-Zuweisung

#1052145
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
#1052182
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
Gast #1052204
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;
Persönliche Seite #1052749
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/

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren