Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog Scalars und Vectors verstehen: Bits, Register, Net-Typen

Verilog muss einzelne Bits und Bitgruppen darstellen. Ein einzelnes sequenzielles Element = Flipflop (1 Bit). 16-Bit-sequenzielles Element = Register (16 Bits). Dafür gibt es scalar und vector Nets und Variables.

Scalar und Vector

Net oder reg ohne Bereichsangabe = 1 Bit breit = Scalar. Mit Bereichsangabe = Multibit-Entität = Vector.

wire o_nor;        // 1-Bit Scalar Net
wire [7:0] o_flop; // 8-Bit Vector Net
reg parity;        // 1-Bit Scalar Variable
reg [31:0] addr;   // 32-Bit Vector Variable für Adresse

Der Bereich ermöglicht Adressierung einzelner Bits im Vektor. MSB (Most Significant Bit) = linker Wert im Bereich, LSB (Least Significant Bit) = rechter Wert.

wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority;   // msb=15, lsb=0
wire [my_msb:2] prior;  // Illegal: msb/lsb müssen konstante Ausdrücke sein

MSB/LSB können beliebige Integer sein (positiv, negativ, null). LSB kann größer, gleich oder kleiner als MSB sein.

Bit-Selektion (Bit-Selects)

Einzelnes Bit in einem Vektor kann selektiert und zugewiesen werden. Out-of-bounds oder x/z Selektion → Rückgabewert x.

reg [7:0] addr; // Bits [7,6,5,4,3,2,1,0]
addr[0] = 1;    // Bit 0 auf 1
addr[3] = 0;    // Bit 3 auf 0
addr[8] = 1;    // Illegal: Bit 8 existiert nicht

Teil-Selektion (Part-Selects)

Zusammenhängender Bitbereich. Zwei Arten: Constant Part-Select und Indexed Part-Select.

reg [31:0] addr;
addr[23:16] = 8'h23; // Bits 23 bis 16 ersetzt durch 0x23 (Constant)

Variable Part-Select (effektiv in Loops): Startbit variabel, Breite konstant.

[ +: ] // inkrementiert von Startbit
[ -: ] // dekrementiert von Startbit
module des;
    reg [31:0] data;
    int i;
    initial begin
        data = 32'hFACE_CAFE;
        for (i = 0; i < 4; i++) begin
            $display("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
        end
        $display("data[7:0]   = 0x%0h", data[7:0]);
        $display("data[15:8]  = 0x%0h", data[15:8]);
        $display("data[23:16] = 0x%0h", data[23:16]);
        $display("data[31:24] = 0x%0h", data[31:24]);
    end
endmodule

Simulationslog:

data[8*0 +: 8] = 0xfe
data[8*1 +: 8] = 0xca
data[8*2 +: 8] = 0xce
data[8*3 +: 8] = 0xfa
data[7:0]   = 0xfe
data[15:8]  = 0xca
data[23:16] = 0xce
data[31:24] = 0xfa

Häufige Fehler

module tb;
    reg [15:0] data;
    initial begin
        $display("data[0:9] = 0x%0h", data[0:9]); // Error: Reversed part-select index ordering
    end
endmodule

Part-Select-Indizes müssen in der gleichen Reihenfolge wie die Deklaration (MSB:LSB) angegeben werden.

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  4. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  5. Verilog Functions meistern für effizientes RTL-Design
  6. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  7. Inter- und Intra-Assignment Delays in Verilog verstehen
  8. Verilog Clock Generator: Design & Implementierungsleitfaden
  9. Verilog Math Functions meistern für effizientes Hardware-Design
  10. Verilog $timeformat meistern: Präzision und Anzeigesteuerung