Da die Variable bin [i] auf der linken Seite einer Zuweisungsanweisung innerhalb eines '@ always' Blocks steht, sollte diese Variable nicht als 'output reg [n-1: 0] bin deklariert werden?
Ja, sollte es die reg
benötigen, wie Sie sagen, zumindest nach Xilinx XST. Der Code, der in Ihrer Frage angegeben wird, wird fehlerhaft, wenn er mit diesem Tool synthetisiert wird (und ein nicht verknüpftes Semikolon fehlt).
Beginnen wir zunächst damit, zu verstehen, was ein prozeduraler Block in Verilog genau ist (unter der Annahme, dass wir Verilog für die Entwicklung von Hardware verwenden, z. B. einen FPGA-Entwurf). Verfahrensblöcke sind always
Blöcke (von zwei Arten, kombinatorische und sequentielle) sowie einige andere Arten von Blöcken, die wir hier nicht behandeln werden. Das erste, was zu wissen ist, dass in einem prozeduralen Block, die einzigen Zuweisungen sind diejenigen, die eine reg
auf der linken Seite haben.
Dies bedeutet nicht unbedingt, dass ein physisches Register/Flipflop erstellt wird. In diesem Fall wird man nicht sein. Der Grund ist die Deklaration des Blocks als always @ (*)
. Diese Deklaration bedeutet, dass der Prozess kombinatorisch ist (d. H. Nicht sequentiell ist und keinen internen Zustand oder kein Taktsignal aufweist). Daher werden keine physischen Flip-Flops erstellt.
Alternativ können Sie einen Prozedurblock als always @ (posedge some_clock_signal)
deklarieren lassen. Dies bedeutet, dass sequentielle Logik erzeugt wird, und physikalische Flip-Flops (oder andere Speichermittel wie der verteilte Speicher in FPGA-Lookup-Tabellen) können verwendet werden. Das Mitnehmen ist, dass Sie immer noch als reg
dort deklarieren, aber jetzt erstellen Sie tatsächlich Register.
Es gibt einen Fall, wo man wire
(oder output
) verwendet werden, die durch kontinuierliche Aufgabe ist (beispielsweise assign a = b & c
), die außerhalb eines Verfahrensblock fällt. In diesem Beispiel verwende ich generate
die gleiche Sache wie die Schleife in Ihrem ursprünglichen Code zu tun:
module bin_n_gray #(parameter n=4) (input [n-1 : 0] gray, output [n-1 : 0] bin);
genvar i;
generate
for (i=0; i < n; i=i+1)
begin: graydecoder // arbitrary label needed by generate syntax
assign bin[i] = ^(gray >> i);
end
endgenerate
endmodule
Ja, ich glaube, dass der reg Typs sein sollte, da sie nicht kontinuierlich zugeordnet ist, und müssen unter Umständen um seinen Wert zu behalten –