ALU de ocho bits con Desbordamiento en Verilog [cerrado]

-3

Tengo la asignación anterior y esto es lo que tengo hasta ahora en verilog:

module eightbit_palu(input [7:0]a,
                     input [7:0]b,
                     input [1:0]sel,
                     output [7:0]f,
                     output ovf);
     reg (f, ovf);
     always @ (a, b, sel);
     case(sel)
         2’b00: f = a + b;
         2’b01: f = ~b;
         2’b10: f = a & b;
         2’b11: f = a | b;
     endcase
endmodule

Soy nuevo en verilog, así que no estoy seguro de si esto es correcto o qué debo hacer con respecto al valor de desbordamiento. ¿Algún consejo / sugerencia?

    
pregunta smd

1 respuesta

1

Dado que has demostrado esfuerzo y has hecho la mayor parte del mismo, algunos consejos:

  1. Declaración del módulo ANSI:

    La forma estándar de declarar módulos es la siguiente:

    module <name> (input  <wire>        <width> <name>,
                   output <reg or wire> <width> <name>
                  );
    

    Entonces, por ejemplo:

    module test (input       [7:0] a, //Input 8 bits wide
                 input wire        b, //Input 1 bit wide - 'wire' is optional
                 output reg  [2:0] c, //Output register 3 bits wide
                 output reg        d, //Output register 1 bit wide
                 output wire [4:0] e, //Output wire 5 bits wide
                 output      [4:0] f  //Same as above - 'wire' is optional
                );
    

    De la forma en que lo has hecho, el uso de la directiva reg adicional en el cuerpo del módulo puede funcionar en algunos sintetizadores, pero definitivamente no funcionará en todos, algunos se quejarán de la redeclaración de los puertos ANSI.

  1. Obteniendo el desbordamiento de una adición

    Hay varias formas de obtener el desbordamiento de una adición. En primer lugar, crear un módulo que hace además con desbordamiento. En segundo lugar, crea una función que haga lo mismo. En tercer lugar, y probablemente lo más simple, use concatenación.

    Para la tercera opción, algo como esto es bastante posible. Este es un ejemplo de un sumador de 4 bits que se lleva a cabo.

    wire       cout;
    wire [3:0] sum;
    wire [3:0] a;
    wire [3:0] b;
    
    assign {cout,sum} = {1'b0,a} + {1'b0,b};
    

    Te permitiré convertir eso en tu código. Pero esencialmente, lo que hace es hacer que las entradas a y b 5 bits de ancho concatenen 1 bit de 0 como el MSB. La salida de la adición será entonces de 5 bits. La salida de esta adición se alimenta a continuación tanto en cout como en sum . Debido a que los dos están concatenados, el sum obtiene los 4 bits más bajos de la adición, y el cout obtendrá el bit superior.

respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas