RAM-Schreibsimulation in VHDL

Das Schreiben eines Werts in den RAM ist ein kleiner Teil meines Projekts, alles funktioniert, aber ich kann eine Sache im Zusammenhang mit RAM / digitalem Timing nicht erklären.

Ich werde eine Beschreibung in Bezug auf das Bild schreiben, das ich hinzugefügt habe.

  • macc_out geht zu data_in des RAM
  • address_ram ist die Adresse der RAM-Zelle
  • out_temp ist die Ausgabe des RAM
  • write_en_ram ist write_en des RAM

Soweit ich die Idee von RAM hatte, schreibt es direkt auf die steigende Flanke der Uhr. Daten, die auf data_in an der steigenden Taktflanke gesehen werden, werden also in den RAM geschrieben. Selbst wenn sich data_in im selben Takt ändert wie write_high wird, werden die alten Daten geschrieben. Erster FallWarum schreibt RAM dann in meinem Fall -36 und nicht -10.

zweiteJetzt habe ich versucht, den data_in-Wert mit einem Uhrwert (0/1) zu ändern, und jetzt tut es so, wie es tun sollte. Was ist los? ram_in ist in diesem Fall data_in des RAM.

macc_out == ram_in == data_in

"Soweit ich die Vorstellung von RAM hatte, schreibt es direkt auf die steigende Flanke der Uhr": Dies ist nicht universell. Es hängt davon ab, was Sie in Ihren Code geschrieben haben, daher wäre es sehr hilfreich, Ihren tatsächlichen Code zu sehen.
Ich bin gerade nicht in der Nähe meines Codes. Aber sie alle sind kombinatorische Logikzuweisungen. macc_out hängt vom Wert des Zählers ab, write_en_ram hängt vom Zustand ab

Antworten (1)

Da Ihr Taktsignal nicht angezeigt wird, gehe ich davon aus, dass es mit der Änderung der anderen Signale zusammenhängt.

Basierend darauf scheint der erste korrekt zu funktionieren, da das Schreiben nur auf der steigenden Flanke des Takts und dem logischen Hoch des *write_en*-Signals funktioniert. Aus diesem Grund sehen Sie, dass die Daten nur in einem Zyklus geschrieben werden, nachdem das Freigabesignal hoch geht.

Bei der zweiten Simulation scheint das Taktsignal direkt mit dem *ram_in*-Signal verbunden zu sein. Dies würde es erklären. Die Daten werden an der ansteigenden Flanke des Takts zwischengespeichert. In diesem Fall sind die einzigen Daten, die jemals zwischengespeichert werden, 0. Bei der steigenden Flanke ist *ram_io* immer 0.