Pregunta

Estoy tratando de diseñar un restador sumador de 4 bits en verilog. Esto es solo la segunda cosa que he escrito en verilog, y todavía no conozco la sintaxis correcta. Este es el módulo que tengo hasta ahora:

module Question3(carryin, X, Y, Z, S, carryout, overflow);
    parameter n = 4;
    input carryin, Z;
    input [n-1:0]X, Y;
    output reg [n-1:0]S;
    output reg carryout, overflow;

    if(Z==0)
    begin
        Y = not(y) + 4'b0001;
    end

    always @(X, Y, carryin)
        begin
            {carryout, S} = X + Y + carryin;
            overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
        end

endmodule

Mi compilador (xilinx 10.1), sigue diciendo "Error de sintaxis cerca de si". He intentado muchas formas diferentes de hacer la conversión, incluido el uso de un Caso que toma Y como argumento, luego verifica todas las combinaciones posibles de 4 bits y las convierte al complemento de dos.

Z es lo que determina si el sumador hace una resta o suma. Si es 0, significa resta, y quiero convertir y en el complemento de dos, luego simplemente sumar. Estoy seguro de que el resto del sumador es correcto, simplemente no sé qué es lo que está mal en la parte en la que estoy tratando de convertir.

¿Fue útil?

Solución

reg [n-1:0] Y_compl;

always @( Z, Y, X, carryin ) begin
  Y_ = ( ~Y + 4'b0001 );
  if ( Z == 1'b0 ) begin
    {carryout, S} = X + Y_compl + carryin;
    overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
  end
  else begin
    {carryout, S} = X + Y + carryin;
    overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
  end

end

Un par de puntos importantes.

  1. Coloca la instrucción if dentro del bloque always. No utilice dos bloques siempre, creará una condición de carrera en el simulador.
  2. Creé una nueva variable, Y_ porque el uso de Y, que es una entrada, recuerde, en el lado izquierdo de una tarea probablemente inferiremos pestillos o haremos algo más desagradable cuando sintetice.
  3. Sugiero usar el operador de inversión a nivel de bits '~' para invertir Y en lugar de 'no' primitivo. La herramienta de síntesis tiene más libertad para optimizar su código de esta manera.
  4. Vuelva a verificar los resultados correctos, ha pasado un tiempo desde que construí un sumador.

Otros consejos

Estás usando una minúscula " y " en " Y = not (y) + 4'b0001; "

Además, estás usando más adiciones de las que necesitas. X-Y es lo mismo que NOT (NOT (X) + Y).

coloca la sentencia if dentro de un bloque inicial
http://www.asic-world.com/verilog/vbehave1.html

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