Diseño de Sumador Completo en Verilog: Guía de Implementación
Un sumador es un componente digital que realiza la suma de dos números. Es el componente principal dentro de una ALU de un procesador y se usa para incrementar direcciones, índices de tablas, punteros de buffer y en muchos otros lugares donde se requiere suma.
Un sumador completo añade una entrada de acarreo junto con otros números binarios de entrada para producir una suma y una salida de acarreo.
Tabla de Verdad
| 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 |
Diseño
Ejemplo de un sumador de 4 bits que acepta dos números binarios por las señales a y b (ambas de 4 bits). Al ser un circuito combinacional, puede modelarse en Verilog con asignación continua assign o bloque always con lista de sensibilidad que incluya todas las entradas. El código abajo usa el primer enfoque.
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
El código siguiente usa bloque always que se ejecuta cuando cualquiera de sus entradas cambia.
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 Hardware
Testbench
module tb_fulladd;
reg [3:0] a;
reg [3:0] b;
reg c_in;
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 (i = 0; i < 5; i = i+1) begin
#10 a <= $random; b <= $random; c_in <= $random;
end
end
endmodule
Cuando a y b suman más de 4 bits, la suma desborda a cero y c_out se vuelve 1. Por ejemplo, la línea resaltada suma 0x11; los 4 bits bajos van a sum y el bit #4 a c_out.
Registro de simulación
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: La simulación ha finalizado.
Verilog
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar