Mostrando números negativos en Verilog

-2

Estoy escribiendo un programa para un sumador de arrastre de 16 bits y tropiezo un poco al final. Cuando ejecuto mi código (que incluye números negativos), está haciendo los cálculos correctos, pero dándome todas las respuestas positivas. Por ejemplo: -59 + -16 aparece en la consola como 65477 + 65520 = 65461 en lugar de -59, -16, -75 (que sé que es correcto para la aritmética binaria sin signo). ¿Cómo consigo la consola para mostrarme los números negativos apropiados?

Aquí está mi código si es necesario:

module adder ();

    reg[15:0] a, b;  
    wire[15:0] s;    
    wire c_out;     


    fulladder FA0(c1, s[0], a[0], b[0], 1'b0);
    fulladder FA1(c2, s[1], a[1], b[1], c1);
    fulladder FA2(c3, s[2], a[2], b[2], c2);
    fulladder FA3(c4, s[3], a[3], b[3], c3);
    fulladder FA4(c5, s[4], a[4], b[4], c4);
    fulladder FA5(c6, s[5], a[5], b[5], c5);
    fulladder FA6(c7, s[6], a[6], b[6], c6);
    fulladder FA7(c8, s[7], a[7], b[7], c7);
    fulladder FA8(c9, s[8], a[8], b[8], c8);
    fulladder FA9(c10, s[9], a[9], b[9], c9);
    fulladder FA10(c11, s[10], a[10], b[10], c10);
    fulladder FA11(c12, s[11], a[11], b[11], c11);
    fulladder FA12(c13, s[12], a[12], b[12], c12);
    fulladder FA13(c14, s[13], a[13], b[13], c13);
    fulladder FA14(c15, s[14], a[14], b[14], c14);
    fulladder FA15(c_out, s[15], a[15], b[15], c15);

    initial begin                   

$monitor ($time, "a = %d, b = %d, s = %d, cout = %b", a, b, s, c_out);
            a=0; b=0;               
            #100 $display ($time);  
            #100 $display ($time); 
            #900 a=-10; b=100;
            #100 $display ($time);
            #900 a=63; b=127;
            #100 $display ($time);
            #900 a=15; b=95;
            #100 $display ($time);
            #900 a=-32; b=79;
            #100 $display ($time);
            #900 a=-59; b=-16;
            #100 $display ($time);
            #900 a=1000; b=2001;
            #100 $display ($time);
            #900 a=-3210; b=15;
            #100 $display ($time);

    end                                     

endmodule                                      

/* 1 Bit Full adder module */

module fulladder (cout, si, ai, bi, cin);

    parameter delay2=1, delay3=2, delay4=3;

    input ai, bi, cin;                      
    output cout, si;                        

    and #delay3 (si1, ~ai, ~bi, cin),       
                (si2, ~ai, bi, ~cin),      
                (si3, ai, ~bi, ~cin),       
                (si4, ai, bi, cin);        
    or #delay3 (si, si1, si2, si3, si4);    

    and #delay2 (ci1, ai, bi),              
                (ci2, ai, cin),             
                (ci3, bi, cin);            
    or #delay3 (cout, ci1, ci2, ci3);       

endmodule
    
pregunta user104693

1 respuesta

1

Esto es Verilog, no VHDL.
Declare su registro como firmado y obtendrá los resultados correctos.

reg signed [15:0] a, b;
    
respondido por el Claudio Avi Chami

Lea otras preguntas en las etiquetas