Verilog Full Adder Ontwerp & Implementatie Gids
Een opteller is een digitaal component dat optelling van twee getallen uitvoert. Het is het hoofdbestanddeel in een ALU van een processor en wordt gebruikt voor adresverhoging, tabelindices, buffer pointers en veel andere plaatsen waar optelling nodig is.
Een full adder voegt een carry input toe aan de andere binaire inputs om een som en een carry output te produceren.
Waarheidstabel
| 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 |
Ontwerp
Een voorbeeld van een 4-bit opteller die twee binaire getallen accepteert via signalen a en b (beide 4-bits). Aangezien een opteller een combinatorische schakeling is, kan het in Verilog gemodelleerd worden met een continue toewijzing via assign of een always blok met een gevoeligheidslijst van alle inputs. Hieronder de assign benadering:
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 volgende code gebruikt een always blok dat uitgevoerd wordt wanneer een van de inputs 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
Hardware Schema
Gesynthetiseerd schema van de 4-bit full adder
Testbench
module tb_fulladd;
reg [3:0] a;
reg [3:0] b;
reg c_in;
wire [3:0] sum;
wire c_out;
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 (i = 0; i < 5; i = i+1) begin
#10 a <= $random; b <= $random; c_in <= $random;
end
end
endmodule
Let op dat wanneer a en b optellen tot een getal breder dan 4 bits, de som terugrolt naar nul en c_out 1 wordt. Bijvoorbeeld, de geleverde regel optelt tot 0x11: de lagere 4 bits gaan naar sum en bit #4 naar c_out.
Simulatie 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.
Golfformaat van de full adder
Verilog
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog concatenatie beheersen: Een praktische gids
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog-functies beheersen voor efficiënt RTL-ontwerp
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
- Verilog Clock Generator: Ontwerp & Implementatie Gids
- Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
- Verilog $timeformat beheersen: Precisie en Weergave-controle
- Verilog Timescales begrijpen en printen in elke Scope
- Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten