Ich beobachte ein ziemlich seltsames Verhalten eines IS62WV51216BLL-55TLI SRAM-Chips, der mit einem FPGA verbunden ist. Wenn ich es mit den kürzestmöglichen Lesezyklen ausführe, funktioniert es wie erwartet:
(hier lese ich den erwarteten Wert 0xCF9C3063. Ein Tick ist 6,25 ns)
Wenn ich jedoch versuche, längere Lesezyklen zu verwenden, schlägt dies auf mysteriöse Weise fehl: (hier lese ich den Wert 0x136000D0 anstelle von 0x1360EC9F. Ein Tick ist 6,25 ns)
Wie Sie sehen, erscheinen irgendwann die richtigen Daten auf dem Datenbus, werden aber schnell durch einen falschen Wert ersetzt. Dies passiert sporadisch jedes Mal an einer anderen Adresse, und das erneute Lesen derselben Adresse ein zweites Mal funktioniert gut:
(Hier lese ich beim ersten Mal den Wert 0x18E06439 und beim zweiten Mal den erwarteten Wert 0x18E0E71F)
Hat jemand eine vernünftige Erklärung dafür? Stimmt etwas mit meinem Lesezyklus nicht? Hier ist der Lesezyklus aus dem obigen Datenblatt als Referenz:
Alle meine Diagramme wurden mit SignalTap (im FPGA integrierter Logikanalysator) mit 160 MHz erstellt. Alle Ausgangspins des SRAM-Controllers werden registriert:
// ** Output Pin tcm_address_out
reg tcm_address_outen_reg;
always@(posedge clk) begin
if( reset ) begin
tcm_address_outen_reg <= 'b0;
end
else begin
tcm_address_outen_reg <= 'b1;
end
end
reg [ 19 : 0 ] tcm_address_out_reg;
always@(posedge clk) begin
tcm_address_out_reg <= tcs_tcm_address_out[ 19 : 0 ];
end
assign tcm_address_out[ 19 : 0 ] = tcm_address_outen_reg ? tcm_address_out_reg : 'z ;
Das tcm_address_out
Signal wird dann mit den sram_addr
in den obigen Diagrammen gezeigten Pins verbunden, die wiederum mit den A0
- A18
Pins des SRAM-ICs verbunden sind. Andere Stifte sind auf ähnliche Weise verbunden. Die Länge der Drähte/Leiterbahnen zwischen einem FPGA-Pin und einem SRAM-Pin beträgt etwa 10 cm. Der SRAM IC hat 1uF + 100nF Keramikkappen zwischen den GND- und VDD-Pins auf beiden Seiten.
PS. Ich habe versucht zu halten die ganze Zeit behauptet, was die Sache nicht besserte. Ich habe auch eine Modifikation ausprobiert, wo wird 12,5 ns später geltend gemacht und wird für 12,5 ns zwischen aufeinanderfolgenden Lesevorgängen deaktiviert (unter Beibehaltung ). Das hat nicht geholfen:
Dmitry, um die Lösung für Ihr Problem zu erhalten, müssen Sie es systematisch beheben. TonyM, Trevor, Dave, Michael und Gregory lieferten mehrere Vermutungen, die in Ihrem Design systemisch qualifiziert werden müssen. Nachfolgend stelle ich Ihnen eine Zusammenfassung zur Verfügung:
Schauen wir uns die Konfiguration an:
always@(posedge clk) begin
if( reset ) begin
Bei Ihren Analysatormesswerten fehlt das Rücksetzsignal. Sie müssen nachweisen, dass das reset
Signal immer niedrig ist, wenn ein Problem auftritt.
Schauen wir uns nun die Diagramme an. Wie Sie bemerkt haben, ändert sich der Wert E0A0 -> ECA0 -> EC9F -> 00D0, wobei die Änderung auf 00D0 innerhalb des Lesezyklus erfolgt und ein von Ihnen gemeldetes Problem darstellt. Dieses SRAM ist nicht in seinen Eingangs- und E/A-Pins registriert, daher können mehrere Probleme auftreten, wenn es anfängt, falsche Signale auszugeben:
Ich würde dir folgendes empfehlen:
Benutzer76844
Benutzer76844
Benutzer76844
Benutzer76844
Benutzer76844
Michael Karas
Michael Karas
Dmitri Grigorjew
Michael Karas
Toni M
Dmitri Grigorjew
Dmitri Grigorjew
sram_x
verbunden .x
Und würden sich die Transienten nicht während dieser 150 ns einpendeln?Toni M
Dmitri Grigorjew
Peter Schmidt
Dmitri Grigorjew
Trevor_G
Michael Karas
Michael Karas
Trevor_G
Trevor_G
Trevor_G
David Tweed
Toni M
Dmitri Grigorjew
Toni M
Trevor_G
Dmitri Grigorjew
Dmitri Grigorjew