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

Verilog Volladdierer Design & Implementierungsleitfaden

Ein Addierer ist eine digitale Komponente, die die Addition zweier Zahlen durchführt. Er ist die Hauptkomponente innerhalb einer ALU eines Prozessors und wird verwendet, um Adressen, Tabellenindizes, Buffer-Pointer und an vielen anderen Stellen zu inkrementieren, wo Addition erforderlich ist.

Ein Volladdierer addiert einen Übertragseingang zusammen mit den anderen binären Eingabezahlen, um eine Summe und einen Übertragsausgang zu erzeugen.

Wahrheitstabelle

ABCinCoutSum
00000
00101
01001
01110
10001
10110
11010
11111

Design

Ein Beispiel für einen 4-Bit-Addierer wird unten gezeigt, der zwei Binärzahlen über die Signale a und b akzeptiert, die beide 4 Bit breit sind. Da ein Addierer eine kombinatorische Schaltung ist, kann er in Verilog entweder mit einer kontinuierlichen Zuweisung mittels assign oder mit einem always-Block mit einer Empfindlichkeitsliste aller Eingänge modelliert werden. Der unten gezeigte Code verwendet den ersten Ansatz.

module fulladd (
  input [3:0] a,
  input [3:0] b,
  input c_in,
  output c_out,
  output [3:0] sum
);
  assign {c_out, sum} = a + b + c_in;
endmodule

Der unten gezeigte Code verwendet einen always-Block, der ausgeführt wird, wann immer sich einer der Eingänge ändert.

module fulladd (
  input [3:0] a,
  input [3:0] b,
  input c_in,
  output reg c_out,
  output reg [3:0] sum
);
  always @ (a or b or c_in) begin
    {c_out, sum} = a + b + c_in;
  end
endmodule

Hardware-Schaltplan

Testbench

module tb_fulladd;
  reg [3:0] a;
  reg [3:0] b;
  reg c_in;
  wire c_out;
  wire [3:0] sum;
  integer i;
  
  fulladd fa0 (
    .a(a), .b(b), .c_in(c_in), .c_out(c_out), .sum(sum)
  );
  
  initial begin
    a <= 0; b <= 0; c_in <= 0;
    $monitor("a=0x%0h b=0x%0h c_in=0x%0h c_out=0x%0h sum=0x%0h", a, b, c_in, c_out, sum);
    
    // For-Schleife für zufällige Eingabewerte
    for (i = 0; i < 5; i = i+1) begin
      #10 a <= $random; b <= $random; c_in <= $random;
    end
  end
endmodule

Beachten Sie, dass wenn a und b eine Zahl ergeben, die mehr als 4 Bit breit ist, die Summe auf null überläuft und c_out 1 wird. Beispielsweise addiert die gelb markierte Zeile zu 0x11, wobei die unteren 4 Bits sum und Bit #4 c_out zugewiesen werden.

Simulations-Log:

ncsim> run
a=0x0 b=0x0 c_in=0x0 c_out=0x0 sum=0x0
a=0x4 b=0x1 c_in=0x1 c_out=0x0 sum=0x6
a=0x3 b=0xd c_in=0x1 c_out=0x1 sum=0x1
a=0x5 b=0x2 c_in=0x1 c_out=0x0 sum=0x8
a=0xd b=0x6 c_in=0x1 c_out=0x1 sum=0x4
a=0xd b=0xc c_in=0x1 c_out=0x1 sum=0xa
ncsim: *W,RNQUIE: Simulation is complete.

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. Verilog Clock Generator: Design & Implementierungsleitfaden
  8. Verilog Math Functions meistern für effizientes Hardware-Design
  9. Verilog $timeformat meistern: Präzision und Anzeigesteuerung
  10. Verilog Timescales an jedem Scope verstehen und ausgeben