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.

¿Fue útil?

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: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top