Abschneiden und andere Operationen für die Konstante in Verilog

Sehr einfaches Beispiel, bei dem ich feststecke. Ich möchte, dass in Verilog geschriebenes Design ein Jahr, das in der Quelle als 16-Bit-Format definiert ist , mit zwei Bytes an die Außenwelt zurückgibt .

`define MY_YEAR 16'd2017

dann muss ich diese Konstante irgendwie in zwei Bytes aufteilen, um so etwas auszuführen

wire [7:0] w_year_byte = w_current_byte ? (`MY_YEAR >> 8) : (`MY_YEAR & 8'hff);

Für mich sind die obigen Ausdrücke mit MY_YEAR nicht korrekt, da ihr Ergebnis immer noch 16-Bit ist. Und diese Aussage kompiliert überhaupt nicht ...

Ich weiß, wie man es mit Vektoren macht, aber ich habe es noch nie mit Konstanten gemacht; habe im Internet mehrere Antworten auf ähnliche Fragen gesehen, aber immer noch unklar, wie man die Dinge richtig macht . Kann sich herausstellen, dass mein Ansatz völlig falsch ist, werde mich sehr über Aufklärung freuen.

Update: Meine Verilog-Quelle ist relativ groß, und die Hauptidee war, die Definition dieses Jahres ganz am Anfang der Quelldatei in der ersten Zeile zu haben, da sie häufig geändert wird und ich nicht nach unten gehen müsste, um sie zu finden Wert zu ändern.

Als ich die Antwort von Tom Carpenter überprüfte, wurde mir klar, dass ich einen dummen Fehler gemacht hatte, als ich versuchte, Parameter, lokale Parameter oder Drähte außerhalb des Moduls zu deklarieren (ganz oben in der Quelle, vor der Deklaration des Moduls), also folge ich seinem Vorschlag

`define MY_YEAR 16'd2017

in der ersten Zeile der Quelle und dann irgendwo nach der Moduldeklaration

wire [15:0] c_MY_YEAR = `MY_YEAR;

und dann mit c_MY_YEAR[7:0]und c_MY_YEAR[15:8]wie gewohnt. Danke Tom!

Antworten (1)

Verwenden Sie besser localparamals 'define.

Zum Beispiel:

module blah (

);

localparam MY_YEAR = 16'd2017; //This is a local parameter which cannot be seen or changed outside the module

wire [7:0] w_year_byte = w_current_byte ? MY_YEAR[15:8] : MY_YEAR[7:0];

...

endmodule

Denken Sie daran, dass Sie bei Verilog nicht mit Computerprogrammen arbeiten, Sie tun die Dinge nicht auf prozedurale Weise, sondern beschreiben Hardware. Wenn Sie auf die MSBs oder die LSBs zugreifen möchten, können Sie dies einfach beschreiben - greifen Sie direkt mit dem Bereichsauswahloperator ( [MSB:LSB]) oder Teilauswahloperator ( [LSB+:WIDTH]) darauf zu.

Lokale Parameter haben gegenüber `Defins den Vorteil, dass sie als konstante Verbindungen behandelt werden können - Sie können auf den Wert derselben genauso zugreifen wie auf den Wert einer Verbindung.

localparamAußerdem könnten Sie Ihre einfach in a ändern, parameterwodurch Sie den Wert des Parameters ändern können, wenn Sie das Modul instanziieren - dies ist einer der Bausteine ​​wiederverwendbarer parametrisierter Module. Wenn Sie die Parameter am Anfang der Datei haben möchten, kann dies mit Moduldeklarationen im ANSI-Stil von Verilog 2001 erreicht werden:

module blah #(
    parameter MY_YEAR = 16'd2017
)(
    input whatever,
    output bob,
    input cheese
);
...

Wenn Sie Ihr Herz auf ein `define gesetzt haben, können Sie darauf zugreifen, indem Sie es in einen Draht umwandeln. Zum Beispiel:

wire [15:0] my_year_wire = `MY_YEAR;

Sobald Sie einem Draht zugewiesen sind, können Sie darauf genauso zugreifen wie auf die obige Parameterversion:

wire [7:0] w_year_byte = w_current_byte ? my_year_wire[15:8] : my_year_wire[7:0];
Es gibt einen Fehler, wenn das Projekt SystemVerilog sein soll. Ich hatte das gleiche für wire [15:0] MY_YEAR = 16'd2017.
@Anonymous eerm, das ist eine vollkommen gültige Verilog-Syntax - welchen Compiler verwenden Sie?
Oh, ich habe gerade meinen Fehler bemerkt. Ich habe versucht zu erklären localparamund wireaußerhalb des Moduls!
@Anonymous alles muss in einer module. moduleist der Baustein von allem in Verilog.
Nun, die Hauptidee von using definewar, die Konstanten ganz am Anfang des Textes zu haben, in der ersten Zeile, noch vor der Moduldeklaration.
Wenn Sie Parameter verwenden, können Sie dies auch mit einer Portdeklaration im ANSI-Stil erreichen. Ich aktualisiere nur meine Antwort.