Verilog Volledige Adder
Een opteller is een digitale component die de optelling van twee getallen uitvoert. Het is het belangrijkste onderdeel in een ALU van een processor en wordt gebruikt om adressen, tabelindexen, bufferaanwijzers en op veel andere plaatsen te verhogen waar toevoeging vereist is.
Een volledige opteller voegt een carry-invoer toe samen met andere binaire invoergetallen om een som en een carry-uitvoer te produceren.
Waarheidstabel
A | B | Cin | Cout | Som |
---|---|---|---|---|
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 |
Ontwerp
Hieronder ziet u een voorbeeld van een 4-bits opteller die twee binaire getallen accepteert via de signalen a en b die beide 4-bits breed zijn. Aangezien een opteller een combinatorisch circuit is, kan het in Verilog worden gemodelleerd met behulp van een continue toewijzing met assign
of een always
blok met een gevoeligheidslijst die alle ingangen omvat. De onderstaande code is die van de vorige aanpak.
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
De onderstaande code gebruikt een always
blok dat wordt uitgevoerd wanneer een van zijn ingangen van waarde verandert.
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
Hardwareschema
Testbank
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
Merk op dat wanneer a en b optellen om een getal te geven dat meer dan 4 bits breed is, de som naar nul rolt en c_out wordt 1. Bijvoorbeeld, de in geel gemarkeerde lijn telt op om 0x11 te geven en de onderste 4 bits worden toegewezen aan som en bit #4 naar c_out.
Simulatielogboekncsim> 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