Problema relacionado con la máquina FSM

0

Estoy tratando de escribir un código verilog para un generador de secuencias de Fibonacci. Su salida será el número n de Fibonacci, donde n es la salida del conteo. El código funciona para count = 2. Pero cuando el conteo aumenta, todos los valores de registro especificados van a 0. Sospecho que el error podría estar en el bloque siempre que contiene la declaración del caso. ¿Cómo puedo resolver el problema?

module fib(clk, reset, count, out, prev,present, temp);
// This module generates nth fibonacchi number, where n is the output of the count
    input clk, reset;
    output reg[7:0] count;
    output [7:0]out;
    output reg [7:0]prev, present, temp;
    //state register
    always @(posedge clk)
        if(reset==1) count = 1;
        else count = count + 1;

    //next state logic
    always @(count[0])
    case(count)
    8'b00000001:begin
                prev = 8'bxxxxxxxx; present = 8'bxxxxxxxx;
                end
    8'b00000010:begin
                prev = 8'b00000000; present = 8'b00000001;
                end
    default: begin
                temp = present;
                present = present + prev;
                prev = temp;
            end
    endcase

    //output logic

    assign out = present;

endmodule
    
pregunta user308177

1 respuesta

3

Estás escribiendo Verilog como si fuera un lenguaje de programación estándar. Los lenguajes HDL funcionan bastante diferentes.

  1. En tu sección de conteo usa asignaciones no bloqueantes.

  2. En tu sección de siempre estás generando pestillos. Toda la sección 'siempre' debe ser controlada por un reloj, ya que tiene elementos de 'memoria' allí: desea que los valores de prev, temp y present sean 'recordados'.

  3. Es una práctica (buena) común usar siempre las secciones de principio-fin. En su caso, funciona porque tiene una sola declaración ( if y case ).

  4. La secuencia de Fibonacci comienza con 1,1 que no está en su código.

  5. Si usa asignaciones no bloqueantes, ya no necesita la variable 'temp':

prev    <= present
present <= present + prev;

Notas al margen:

  1. Un nombre como 'out' no es muy descriptivo. Incluso si escribe fragmentos de prueba cortos use nombres descriptivos.
  2. Es una mala práctica usar siempre @ (variable) en estos días. Puede conducir a desajustes de síntesis de simulación. Debes usar always @( * ) o alway_comb.
  3. Comentar como en la parte inferior de su ejemplo es bastante superfluo:

//output logic   
assign out = present;
    
respondido por el Oldfart

Lea otras preguntas en las etiquetas