Problema del oscilador en anillo Verilog

0

Estoy tratando de hacer un oscilador de anillo dentro de un CPLD CoolRunner-II de Xilinx y estoy tratando de medir cuántos ciclos de oscilador de anillo caben dentro de la mitad baja del reloj externo de 10MHz. A continuación se muestra el código simple que hice con 5 inversores.

module Top(
    input clk,
    input trig,
    output TXD
    );

 wire node1;
 wire node2;
 wire node3;
 wire node4;
 wire node5;
 wire node6;
 wire node7;

reg[31:0] counter;
reg[31:0] counterBuf;

assign node1 = ~node7;
assign node2 = ~node1;
assign node3 = ~node2;
assign node4 = ~node3;
assign node5 = ~node4;
assign node6 = ~node5;
assign node7 = ~node6;

always @(posedge node5) begin //use ring counter clock
    //increase counter only during low period of clock
    if(clk==0) counter = counter + 1;
    else begin
        counterBuf = counter;//save counter value for later use
        counter = 0;//restart counter
    end
end

Sin embargo, trato de leer counterBuf, siempre lee 0. Si comento "contador = 0;", counterBuf muestra algún cambio en el valor. ¿Es incorrecto el código al establecer el contador?

¿Cómo puedo implementar de otra manera usando verilog?

    
pregunta Steve

1 respuesta

3

Comprueba tus registros del compilador. Es casi seguro que encontrará algo que diga "Se eliminó el bucle combinatorio": las herramientas de síntesis no lo permitirán a menos que específicamente le diga que mantenga cada una como una LUT separada. Eche un vistazo a la lista de redes posterior al ajuste y vea qué produce el sintetizador.

Los osciladores no son buenos para los FPGA ya que, dependiendo de la longitud de la cadena y los retrasos de propagación, puede obtener fácilmente varios cientos de MHz, si no señales de GHz que pueden quemar el dispositivo con corrientes de conmutación excesivas.

Incluso si mantiene el bucle, es casi seguro que obtendrás un comportamiento extraño. El oscilador alternará tan rápido y con tanta inestabilidad que violará los tiempos de configuración y retención de su contador, lo que resultará en un comportamiento extraño.

Luego, si lo está comparando con un reloj (que tampoco es bueno) de 10MHz, eso significa que el contador se reiniciará por 50 ns en cada 100. Porque este oscilador y el reloj externo son asíncronos sin sincronización , volverá a terminar violando los tiempos de configuración y retención del registro de salida y provocará que llegue a 0 metaestable; quién sabe qué generará entonces.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas