Adicionador Completo Verilog
Um somador é um componente digital que realiza a adição de dois números. É o principal componente dentro de uma ALU de um processador e é usado para incrementar endereços, índices de tabela, ponteiros de buffer e em muitos outros lugares onde a adição é necessária.
Um somador completo adiciona uma entrada de transporte junto com outros números binários de entrada para produzir uma soma e uma saída de transporte.
Tabela Verdade
A | B | Cin | Cout | Soma |
---|---|---|---|---|
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 |
Projeto
Um exemplo de um somador de 4 bits é mostrado abaixo, que aceita dois números binários através dos sinais a e b, ambos com 4 bits de largura. Como um somador é um circuito combinacional, ele pode ser modelado em Verilog usando uma atribuição contínua com
assign
ou um always
bloco com uma lista de sensibilidade que compreende todas as entradas. O código mostrado abaixo é o da abordagem anterior.
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
O código mostrado abaixo usa um
always
bloco que é executado sempre que qualquer uma de suas entradas muda de valor.
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
Esquema de hardware
Banco de teste
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
Observe que quando a e b somam para dar um número com mais de 4 bits de largura, a soma rola para zero e c_out se torna 1. Por exemplo, a linha destacada em amarelo soma para dar 0x11 e os 4 bits inferiores são atribuídos a soma e bit#4 para c_out.
Registro de simulação
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