Verilog 8 Bit ALU

0

Esto es lo que tengo hasta ahora, pero no sé qué hacer con los valores de f para los dos últimos y si la sintaxis de la instrucción if es correcta. ¿Algún consejo?

module eightbit_alu (input signed [7:0]a,
                     input signed [7:0]b,
                     input [2:0]sel,
                     output signed [7:0]f,
                     output ovf,
                     output take_branch);

    reg [7:0]f;
    reg ovf;
    reg take_branch;

    always @(a, b, sel)
    begin
      f = 0;
      ovf = 0;
      take_branch = 0;
      case(sel)
         3'b000 : begin f=a+b;
         ovf=(a[7] & b[7] & ~f[7]) | (~a[7] & ~b[7] & f[7]);
         end
         3'b001 : f=~b;
         3'b010 : f=a&b;
         3'b011 : f=a|b;
         3'b100 : f=a >>> 1;
         3'b101 : f=a <<< 1;
         3'b110 : begin f=
            if (a==b)
              take_branch=1;
         end
         3'b111 : begin f=
              if (a!=b)
              take_branch=1;
         end
       endcase
     end
 endmodule
    
pregunta dms94

1 respuesta

3

El valor devuelto para f en los últimos dos casos son a==b y a!=b respectivamente. No dice explícitamente lo que debería ser, hay algunas opciones:

  1. Pídale a su profesor una aclaración (quizás la más sensata)
  2. Suponga que el resultado no está definido y devuelva algo sensible como a , o b , o incluso 0 .
  3. Pregúntese si conoce alguna función bitwise que represente == . En realidad hay uno, se llama XNOR. ¿Por qué? Observar:

     a0 b0 | f0
    -------+----
      0  0 | 1
      0  1 | 0
      1  0 | 0
      1  1 | 1
    

    ¿Observa cómo la salida de XNOR es equivalente a igual? (es un 1 cuando las entradas son las mismas). Esto se puede lograr en Verilog usando el XOR a nivel de bits ( a ^ b ) seguido de un no a modo de bits ( ~() ).

    Para la función != , ¿cuál es el opuesto de XNOR? (Lo dije en la línea de arriba).

    Así que esto le daría un resultado razonable, representando el bitwise != así como el lógico != (y lo mismo para == ).

Como nota al margen,

take_branch = 0;
...
if (a==b) 
    take_branch=1;

es equivalente a

take_branch = (a==b);

Además, su declaración de módulo no está siguiendo correctamente el estilo ANSI (o incluso el no ANSI). Si bien puede funcionar en el sintetizador que está utilizando, no funcionará en todos (obtendrá errores sobre la redeclaración de los puertos ANSI).

El siguiente sería el formato ANSI:

module eightbit_alu (input signed [7:0]a,
                     input signed [7:0]b,
                     input [2:0]sel,
                     output reg signed [7:0]f,
                     output reg ovf,
                     output reg take_branch);

Observe cómo se incluye reg como parte de la declaración del puerto ANSI, por lo que no es necesario volver a declarar el puerto como un registro dentro del módulo.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas