sum verilog hdl bcd

sum - BCD Adder en Verilog



hdl (1)

Intento escribir un Adden BCD en Verilog, pero estoy teniendo problemas con uno de los módulos. Específicamente, el sumador que toma dos dígitos BCD y los agrega. Entonces, la idea es si la suma de los dos dígitos es menor o igual que nueve, entonces es correcto. Sin embargo, si es mayor, se debe agregar un desplazamiento de 6. Aquí está mi código Verilog hasta el momento:

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 todos modos, cuando intento sintetizarlo en Xilinx, obtengo los siguientes errores:

ERROR: HDLCompilers: 247 - "DIGITADD.v" línea 33 La referencia al cable escalar ''c2'' no es un registro legal o variable lvalue

ERROR: HDLCompilers: 247 - "DIGITADD.v" línea 33 Referencia al cable escalar ''s2'' no es un valor legal o variable lvalue

ERROR: HDLCompilers: 42 - "DIGITADD.v" línea 33 Mano izquierda ilegal de asignación de procedimiento

Traté de cambiar algunas cosas, como cambiar el cable a registro, pero todavía no puedo hacer que funcione. Cualquier ayuda es apreciada.


De acuerdo, lo descubrí, el código correcto está debajo. Básicamente, vea el comentario que hice sobre mi pregunta para algunos consejos para recordar. Es curioso lo simple que es comparado con el desastre que tuve 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