Pregunta
Estoy intentando escribir un BCD Adder en Verilog, pero estoy teniendo problemas con uno de los módulos. En concreto, el sumador que toma dos dígitos BCD y los añade. Por lo tanto, la idea es que si la suma de los dos dígitos es menor o igual a nueve, entonces es correcto. Sin embargo, si es mayor, entonces un desplazamiento de 6 tiene que ser añadido. Aquí está mi código Verilog hasta ahora:
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output reg COUT,
output reg [3:0] SUM
);
wire s2, c2;
always @ ( * )
begin
assign {c2, s2} = IN_A + IN_B + CIN;
if(s2 <= 9 && c2 == 0) begin
assign {COUT, SUM} = {c2, s2};
end
else if({c2, s2} > 9) begin
assign {COUT, SUM} = {c2, s2 + 6};
end
end
endmodule
De todas formas, cuando trato de sintetizarlo en Xilinx, consigo los errores siguientes:
ERROR: HDLCompilers: 247 - "DIGITADD.v" línea 33 de referencia para escalar 'c2' de alambre no es un reg legal o variable lvalue
ERROR: HDLCompilers: 247 - "DIGITADD.v" línea 33 de referencia para alambre escalar 's2' no es un reg legal o variable lvalue
ERROR: HDLCompilers: 42 - line "DIGITADD.v" 33 lado Ilegal mano izquierda de asignación de procedimiento
He intentado cambiar algunas cosas, como cambiar de alambre para reg, pero todavía no puedo conseguir que funcione. Cualquier ayuda es apreciada.
Solución
De acuerdo, lo he descubierto, el código correcto se encuentra por debajo. Básicamente, ver el comentario que hice en mi pregunta para algunos consejos a tener en cuenta. Es curioso cómo mucho más simple esto se compara con el lío que tenía antes.
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output COUT,
output [3:0] SUM
);
reg [4:0] s2;
assign SUM = s2[3:0];
assign COUT = s2[4];
always @ ( * )
begin
s2 = IN_A + IN_B + CIN;
if (s2 > 9)
begin
s2 = s2 + 6;
end
end
endmodule
Otros consejos
En texto plano, no tienen una asignación continua como la declaración "Asignar" en un bloque procedimental es decir, siempre o inicial.
Recuerde la regla y la vida es buena: -)