Problema al reiniciarse en RingCounter en Verilog

0

Bueno, sigo teniendo este problema en muchos módulos y nunca me molestó porque estaba experimentando. Sin embargo, ahora estoy tratando de ser 100% correcto, así que ... Tengo este contador de anillo, por ejemplo, y le doy a la salida 8 leds de un FPGA. Está bien, funciona como un encanto, pero la condición de reinicio es defectuosa. Cuando alimente el binario en el FPGA, se inicia correctamente desde MSB = 1 y el resto de los bits son 0. Sin embargo, cuando presiono restablecer, el patrón de LED simplemente se congela y continúa la operación cuando suelto el botón. El problema en algunos módulos fue que tontamente tuve el mismo reinicio para el contador y el reloj, así que fue obvio por qué esto fue un problema. Sin embargo, ahora solo lo manejo desde otro botón de resistencia desplegable y sigo teniendo este problema.

module Ringcounter # ( parameter LENGTH = 8) (
input clk, rst,
output [LENGTH-1:0]q
    );
reg [LENGTH-1:0] f;
genvar i;
for (i = 0; i < LENGTH; i = i+1) 
assign q[i]=f[i];

always @ (posedge clk)begin
if (rst) begin f[LENGTH-1]=1'b1; f[LENGTH-2:0]=0; end
else
f={f[0],f[LENGTH-1:1]};
end
endmodule 
    
pregunta Nick Alexis

1 respuesta

1

Usted usa reinicio síncrono, por lo tanto, el reinicio alto solo será efectivo en el siguiente flanco positivo del reloj.

¿Por qué necesitas este for aquí? Considera lo siguiente:

module Ringcounter # ( parameter LENGTH = 8) (
input wire clk,
input wire rst,
output reg [LENGTH-1:0] f
);

always @ (posedge clk) begin
    if (rst) begin f[LENGTH-1] <= 1'b1; f[LENGTH-2:0] <= 0; end
    else
        f <= {f[0],f[LENGTH-1:1]};
end

endmodule

Se cambió la nota que hice: (1) quité q completamente, en lugar de enviar f como registro; (2) se han cambiado las asignaciones de bloqueo a las no bloqueadas.

Editar: ok, si no te gusta el registro de salida, lo siguiente:

module Ringcounter # ( parameter LENGTH = 8) (
input wire clk,
input wire rst,
output wire [LENGTH-1:0] q
);

reg [LENGTH-1:0] f;
assign q [LENGTH-1:0]  = f[LENGTH-1:0];

always @ (posedge clk) begin
    if (rst) begin f[LENGTH-1] <= 1'b1; f[LENGTH-2:0] <= 0; end
    else
        f <= {f[0],f[LENGTH-1:1]};
end

endmodule

pero no cambia nada, el resultado es el mismo.

Si dicha modificación no ayuda, entonces, lo más probable es que usted simplemente detenga el reloj cuando el reinicio esté activo.

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas