Ringoszillator auf FPGA für TRNG

Ich implementiere ein TRNG auf einem FPGA. Dieses TRNG basiert auf Jitter, der vom Ringoszillator erzeugt wird, und ich würde gerne wissen, wie der gegebene Ringoszillator auf dem FPGA implementiert wird, damit Jitter erzeugt wird.

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

Dies ist mein Code für den Ringoszillator.

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

Dies ist der Code für Testbench.

Die Ausgabe ist jetzt don't care.

Haben Sie versucht, einige der Oszillatoren zu implementieren, und es gab keinen Jitter?
Ich habe es versucht und es gibt keine Ausgabe auf Simulation. Der Ausgang ist Z oder befindet sich im hochohmigen Zustand.
Nun, ich würde keinen Jitter bei der Simulation erwarten, da sie deterministisch ist. Möglicherweise möchten Sie der Frage Ihren Code und die Simulationsergebnisse hinzufügen.
Ich würde nicht erwarten, dass diese Implementierung Z ergibt, sondern "X" - unbekannter Zustand, da Sie keine Anfangswerte für die zu berücksichtigenden Werte für Ihre Simulation haben.
Beachten Sie, dass es sehr, sehr schwierig ist, diese Art von Struktur mit einem FPGA aufzubauen. Selbst wenn Sie KEEP-this und KEEP-that verwenden, optimiert das Tool fast alle Ihre Gates. Überprüfen Sie das Ergebnis nach der Implementierung, was wirklich, wirklich am Ende von Ihren Toren übrig geblieben ist!! Und NEIN, es wird Ihnen kein TRNG geben. Wenn es so einfach wäre, ein TRNG zu erstellen, würden mehr Leute es verwenden. Beispielsweise werden Ihre Ringoszillatoren durch das von Ihrer Systemuhr und einander erzeugte Leistungsrauschen beeinflusst.
Ich weiß, dass dies kein TRNG sein wird. Was ich versuche, ist, zuerst einen Ringoszillator zu erstellen.
Die Ausgabe habe ich auch angehängt.
Die Port-Order in mynotist falsch. Sie definieren es als Eingabe, Ausgabe, instanziieren jedoch die Verbindungsreihenfolge als Ausgabe, Eingabe. Hense r_outhat keine Quelle. Ich bin überrascht, dass es kompiliert wurde, da (r_out&start)es sich um eine illegale Ausgangszuweisung handelt. Zu Ihrer Information, selbst mit der Korrektur der Port-Reihenfolge kann es aufgrund der Compiler-Optimierung immer noch nicht oszillieren.
Entschuldigung für diesen Fehler. Ich habe den Code und die Ausgabe aktualisiert. Kannst du das jetzt bitte überprüfen?
Ihre Simulation wird niemals die Ausgabe eines Ringoszillators zeigen. Ein Ringoszillator beruht auf endlichen Verzögerungen zwischen den Logikelementen, die während der RTL-Simulation nicht berücksichtigt werden (was Sie anscheinend tun).
Danke für die Antwort. Das habe ich aus meiner Simulation geschlossen und dieser Code funktioniert perfekt auf FPGA.
Übrigens steht X in der Simulation nicht für don't care. Dies bedeutet, dass das Ausgangssignal q von mehreren Quellen getrieben wird, die vom Simulator nicht aufgelöst werden können.
Ich bin mir darüber nicht sicher. Aber ich habe einen neuen Testbench geschrieben, in dem ich zuerst Start 0 belassen habe und ihn dann nach 50 ns auf 1 geändert habe. Dadurch blieb meine Simulation bei 50 ns hängen und zu diesem Zeitpunkt oszillierte der Ausgang weiter.
Vielleicht haben Sie Recht mit dem X. Ich bin mit VHDL besser vertraut als mit Verilog und habe möglicherweise eine Vermutung darüber angestellt, wie Ihr Simulator funktioniert. Hey ho. Aber wie Sie sagen, es funktioniert auf dem FPGA, also warum machen Sie sich Sorgen?
Ich habe diese Frage gestellt, als ich diesen dummen Fehler gemacht und die Frage dann nicht notiert habe.

Antworten (1)

Dies ist kein Ringoszillator, da r0 unbekannt ist. Sie meinten wahrscheinlich r_out:

and a(n6,r_out,start);

Siehe auch: Router vs. r_out.

Wenn Sie Ihre Topologie korrigieren, werden Sie auf ein weiteres Problem stoßen: Eine Timing- (Delta-) Schleife, im Grunde ein korrekter Ringoszillator ohne Verzögerungen, wird Ihren Simulator zum Zeitpunkt 0 aufhängen. Sie müssen eine Verzögerung in Ihr "mynot"-Makro einfügen, um das Verlassen der Delta-Schritte ab Zeit 0 zu ermöglichen.