Asignación de Verilog

1

Estoy diseñando un convertidor de Fahrenheit a Celsius usando máquinas de estado algorítmico. Estoy intentando que se ejecute el siguiente código, pero todo lo que obtengo para la salida es 0.

module FtoC(clk, F_input, C_output);
input clk;
input [8:0]F_input;

output [6:0]C_output;
reg [6:0] C_output = 0;

reg [1:0] state =0;
reg [8:0] A, R;


always @ (posedge clk)
case (state)
0: begin state <= 1; C_output <= 0; A <= F_input; R <= 0; end
1: begin state <=2; R <= ({(A - 32), 2'b00} + A); end
2: if (R>9) begin R <= R - 9; C_output <= C_output + 1; end  

       // else state <= 0;

endcase

endmodule
    
pregunta Sagistic

2 respuestas

2

En primer lugar, debe incluir su banco de pruebas, ya que es tan importante como su diseño, especialmente cuando las cosas no funcionan como se espera.

En segundo lugar, la línea R <= ({(A - 32), 2'b00} + A); es incorrecta. Como ya señaló alex.forencich, quieres (A-32)*5 = 5A-160 , pero en realidad estás haciendo (A-32)*4+A = 5A-128 , que no es lo mismo.

En su lugar, R <= ({A, 2'b00} + A) - 160; debería funcionar.

Para simulaciones simples, puedes usar el simulador en línea edaplayground.com .

Aquí hay una instantánea de su código (usando edaplayground) con la corrección y un banco de pruebas, que muestra el valor de salida correcto de C = 37 cuando la entrada es F = 100:

    
respondido por el apalopohapa
0

Revise su banco de pruebas. Lo tengo para correr, a excepción de un par de problemas menores. Primero, iverilog se atragantó en {(A-32), 2'b00} ya que (A-32) no tiene un ancho definido. Puede utilizar una variable temporal para solucionar este problema. En segundo lugar, supongo que está tratando de hacer (A-32) * 5, pero en cambio está haciendo (A-32) * 4 + A, que termina dándole el resultado equivocado. Corrigí estos dos problemas agregando un registro temporal y usando t = (A - 32); R < = ({t, 2'b00} + t); . Probé con F_input = 100 y obtuve el resultado esperado de C_output == 37, después de unos cuantos ciclos de reloj.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas