2016-04-23 19 views
1

Ich studiere Verilog als Teil meines Studium aber mein Modul Dozent links, so war ich hier für einige Hilfe der Hoffnung,Verilog Datentypen

Ein Beispiel haben wir für ein parametrischer n-Bit-Grau zu Binärcode gegeben worden Wandler wie folgt:

module bin_n_gray #(parameter n=4) (input [n-1 : 0] gray, output [n-1 : 0] bin); 

    integer i; 
    always @ (*) 
     for(i = 0; i < n; i = i+1) 
      bin[i] = ^(gray >> i); 

endmodule 

Meine Frage:

da die bin[i] Variable auf der linken Seite einer Zuweisungsanweisung innerhalb eines @ always Block ist, sollte nicht diese Variable alsdeklariert werden?

Als ich dachte, dass eine Variable auf der linken Seite einer Zuweisungsanweisung eines Prozessblocks, d. H. always/initial sollte als reg Datentyp deklariert werden?

+0

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 –

Antwort

0

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 
+0

Ich bin verwirrt! Könntest du es vereinfacht erklären, da ich gerade erst dieses Zeug lerne! –

+0

@AndyWest werde ich froh sein, aber ich kann es leider in diesem Moment nicht. Wäre es ein Problem, wenn ich meine Antwort in einer halben Stunde zu ungefähr Stunde aktualisiere? – hexafraction

+0

Der erste Teil Ihrer Antwort scheint, als ob Sie sagen, ja es sollte als reg deklariert werden, aber der zweite Teil scheint wie Ihr Sprichwort Draht ist in Ordnung, –