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
| A | B | Cin | Cout | Sum |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
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
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design
- Verilog $timeformat meistern: Präzision und Anzeigesteuerung
- Verilog Timescales an jedem Scope verstehen und ausgeben