Oscilador en anillo en FPGA para TRNG

Estoy implementando un TRNG en un FPGA. Este TRNG se basa en la fluctuación creada por el oscilador en anillo y me gustaría saber cómo implementar el oscilador en anillo dado en FPGA para que se genere la fluctuación.

module rng(start, r_out);
input start /* synthesis keep */;
reg rout /* synthesis keep */;
output r_out;
wire n0 /* synthesis keep */;
wire n1 /* synthesis keep */;
wire n2 /* synthesis keep */;
wire n3 /* synthesis keep */;
wire n4 /* synthesis keep */;
wire n5 /* synthesis keep */;
wire n6 /* synthesis keep */;
and a(n6,r0,start);
mynot x1(n6,n0);
mynot x2(n0,n1);
mynot x3(n1,n2);
mynot x4(n2,n3);
mynot x5(n3,n4);
mynot x6(n4,n5);
mynot x7(n5,r_out);
endmodule

module mynot(
    input x,
    output wire y
    );
    not(y,x);
endmodule

Este es mi código para el oscilador de anillo.

module rng_tb;
reg start;
wire q;
rng uut(start,q);
initial
begin
start=0;
#50 start=1;
end
endmodule

Este es el código para el banco de pruebas.

La salida ahora es no me importa.

¿Ha intentado implementar algunos de los osciladores y no hubo fluctuaciones?
Lo he probado y no hay salida en la simulación. La salida es Z o está en estado de alta impedancia.
Bueno, no esperaría tener ningún nerviosismo en la simulación, ya que es determinista. Es posible que desee agregar su código y los resultados de la simulación a la pregunta.
No esperaría que esta implementación produzca Z, sino "X": estado desconocido, ya que no tiene valores iniciales para los valores que debe considerar su simulación.
Tenga en cuenta que es muy, muy difícil construir ese tipo de estructura con un FPGA. Incluso usando KEEP-this y KEEP-that, la herramienta tiende a optimizar casi todas sus puertas. ¡Comprueba el resultado posterior a la implementación de lo que realmente ha quedado de tus puertas al final! Y NO, no te dará TRNG. Si fuera tan fácil hacer un TRNG, más personas lo usarían. por ejemplo, sus osciladores de anillo se verán influenciados por el ruido de potencia generado por el reloj de su sistema y entre ellos.
Sé que esto no será un TRNG. Lo que intento hacer es crear primero un oscilador en anillo.
He adjuntado la salida también.
El orden de puerto mynotes incorrecto. Lo define como entrada, salida pero instancia el orden de conexión como salida, entrada. Hense r_outno tiene fuente. Me sorprende que se haya compilado como (r_out&start)una asignación de salida ilegal. Para su información, incluso con la corrección del orden de los puertos, es posible que aún no oscile debido a la optimización del compilador.
Lo siento por ese error. He actualizado el código y la salida. ¿Puedes comprobar esto ahora, por favor?
Su simulación nunca mostrará la salida de un oscilador de anillo. Un oscilador en anillo se basa en retrasos finitos entre los elementos lógicos que no se tienen en cuenta durante la simulación RTL (que es lo que parece estar haciendo).
Gracias por la respuesta. Eso es lo que concluí de mi simulación y este código funciona perfectamente en FPGA.
Por cierto, X en simulación no significa no me importa. Significa que la señal de salida q está siendo impulsada por múltiples fuentes que el simulador no puede resolver.
No estoy seguro de eso. Pero escribí un nuevo banco de pruebas en el que al principio mantuve el inicio en 0 y luego de 50 ns lo cambié a 1. Esto hizo que mi simulación se atascara en 50 ns y en ese momento la salida seguía oscilando.
Tal vez tenga razón sobre la X. Estoy más familiarizado con VHDL que con Verilog y podría haber hecho una suposición sobre cómo funciona su simulador. hola hola Pero como dices, funciona en el FPGA, ¿por qué te preocupas?
Hice esta pregunta cuando cometí ese estúpido error y luego no eliminé la pregunta.

Respuestas (1)

Este no es un oscilador en anillo, porque r0 es desconocido. Probablemente quisiste decir r_out:

and a(n6,r_out,start);

Ver también: rout vs r_out.

Si corrige su topología, se encontrará con otro problema: un bucle de tiempo (delta), básicamente un oscilador de anillo correcto sin demoras, colgará su simulador en el tiempo 0. Deberá introducir un retraso en su macro "mynot" para permitir salir de los pasos delta desde el tiempo 0.