2012-04-15 2 views
1

Das folgende ist eine einfache Verilog Beispiel über einen D-FF mit Synchronfreigabeüber Ausgabelogik für einfache FSM

module d-ff-en_2seg 
(
input wire clk,reset, 
input wire en, 
input wire d, 
output reg q 
); 
    // signal declaration 
    IU reg r_reg, r_next; 
    // body 
    // D FF 
    always @(posedge clk, posedge reset) 
     if (reset) 
      r_reg <= 1'bO; 
     else 
      r_reg <= r_next; 
    // next-state logic 
    always @* 
     if (en) 
      r_next = d; 
     else 
      r_next = r_reg; 
    // output logic 
    always @* 
     q = r_reg; 
endmodule 

Meine Frage ist, warum wir die Ausgangslogik hier brauchen? Können wir es ignorieren? Definieren Sie einfach r_reg als Ausgabe-ID?

+1

Es sieht so aus, als wäre deine Copy'n'Paste furchtbar schlecht geworden. Dieser Code wird nicht kompiliert. Was ist 'Q *'? "IU"? – toolic

+0

@toolic sorry, sollte es @ – fiftyplus

Antwort

2

In Verilog ist es völlig legal und üblich, DFFs als Ausgänge zu verwenden.

In VHDL ist es unzulässig, von Ausgangssignalen zu lesen. http://vhdl.renerta.com/mobile/source/vhd00051.htm

Also in diesem Fall die Zeile "r_next = r_reg;" könnte illegal sein, wenn Sie diese Zeile in VHDL umgewandelt haben und r_reg eine Ausgabe war.

Aus diesem Grund bestehen die RTL-Kodierungsrichtlinien, die sowohl für Verilog als auch für VHDL konsistent sein sollen, darauf, dass alle Ausgänge in einem separaten Abschnitt "Ausgangslogik" zugewiesen werden. Dies würde (ein wenig) helfen, wenn Sie den Code in VHDL neu schreiben wollten.

+0

Was ist mit der Ausgabe q, es sieht sehr redundent, was ist, wenn ich q mit r_reg ersetzen? Was ist der Grund dafür, dass q auf den ersten Platz gesetzt wird? – fiftyplus

+0

In Verilog haben Sie Recht. Der Ausgang q ist redundant. Sie können q durch r_reg ersetzen. q ist wahrscheinlich nur in erster Linie für den stilistischen Grund in der Antwort definiert. –

+0

Sie * können * Ausgaben in VHDL lesen (ab VHDL-2008) –