Verilog-Volladdierer
Ein Addierer ist eine digitale Komponente, die die Addition von zwei Zahlen durchführt. Es ist die Hauptkomponente innerhalb einer ALU eines Prozessors und wird zum Inkrementieren von Adressen, Tabellenindizes, Pufferzeigern und an vielen anderen Stellen verwendet, an denen eine Addition erforderlich ist.
Ein Volladdierer addiert einen Übertragseingang zusammen mit anderen eingegebenen Binärzahlen, um eine Summe und einen Übertragsausgang zu erzeugen.
Wahrheitstabelle
A | B | Cin | Cout | Summe |
---|---|---|---|---|
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 |
Gestaltung
Unten ist ein Beispiel eines 4-Bit-Addierers gezeigt, der zwei Binärzahlen durch die Signale a und b akzeptiert, die beide 4 Bit breit sind. Da ein Addierer ein kombinatorischer Schaltkreis ist, kann er in Verilog unter Verwendung einer kontinuierlichen Zuweisung mit assign
modelliert werden oder eine always
Block mit einer Empfindlichkeitsliste, die alle Eingänge umfasst. Der unten gezeigte Code ist der des früheren Ansatzes.
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, wenn einer seiner Eingänge den Wert ä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-Schema
Testbench
module tb_fulladd;
// 1. Declare testbench variables
reg [3:0] a;
reg [3:0] b;
reg c_in;
wire [3:0] sum;
integer i;
// 2. Instantiate the design and connect to testbench variables
fulladd fa0 ( .a (a),
.b (b),
.c_in (c_in),
.c_out (c_out),
.sum (sum));
// 3. Provide stimulus to test the design
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);
// Use a for loop to apply random values to the input
for (i = 0; i < 5; i = i+1) begin
#10 a <= $random;
b <= $random;
c_in <= $random;
end
end
endmodule
Beachten Sie, dass, wenn sich a und b zu einer Zahl mit einer Breite von mehr als 4 Bits addieren, die Summe auf Null übergeht und c_out 1 wird. Beispielsweise ergibt die gelb hervorgehobene Zeile 0x11 und die unteren 4 Bits werden zugewiesen sum und Bit#4 zu c_out.
Simulationsprotokollncsim> 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