Hallo Besucher, der Thread wurde 1,8k mal aufgerufen und enthält 9 Antworten

letzter Beitrag von daybyter am

2 Speicherzugriffe pro Takt?

  • Hallo!


    Ich versuch gerade verilog Code zu schreiben, um auf den c64 Speicher zuzugreifen, und such daher Timing Diagramme, wie der 6502 auf das Ram zugreift. Nach dem, was ich bisher gefunden hab, muss der Speicher quasi doppelt so schnell sein, wie die CPU, da der 6502 den Zugriff in einem halben Takt macht? Nun läuft der Speicher beim c64 doch eh mit 2 MHz, weil der VIC jeden 2. Takt braucht?


    Versteh ich das nun recht, dass aber im verbliebenen Takt eigentlich 2 Speicherzugriffe pro Takt möglich wären?


    Der Oric scheint dieses sogenannte double-clocking zu beherrschen, wenn ich das hier recht interpretiere?


    http://forum.6502.org/viewtopi…=3&t=2303&start=45#p22371


    Wäre es also möglich, die Zugriffsgeschwindigkeit mit geeigneter Hardware zu verdoppeln?


    Danke im Voraus für jede Antwort,
    Andreas

  • Du kommst da durcheinander, der VIC hat nicht jeden zweiten Takt, sondern nimmt eine Flanke des Taktes von 985Khz, der 6510 die andere Flanke. Dazu kommen dann ab und an die Badlines, in denen der Prozessor endgültig kalt gestellt wird.
    Bei ca. einem MHz hast du also 500 ns pro Flanke und damit liegt das RAM gut drin (idR 150 - 200ns für den Zugriff, plus die Zeiten um die Daten stabil an den Bus zu legen).
    Du wirst also keine zwei Speicherzugriffe schaffen, es sei denn Du legst den VIC lahm.

  • Ausserdem generiert der VIC die RAS und CAS Signale für den DRAM-Zugriff (wobei das CAS noch etwas durch die PLA verzögert wird). Diese werden je zweimal pro Takt generiert. Einmal wenn der Takt low ist und einmal wenn der Takt high ist. Wenn der Takt low ist greift immer der VIC zu und bei hohen Takt die CPU, falls sie nicht per AEC deaktiviert wurde. Von Aussen (Expansion-Port) kann man nur auf den Speicher zugreifen wenn man das DMA-Signal auf low zieht. Dieser Zugriff darf nur erfolgen wenn der Takt high ist und solange das BA Signal high ist (hier zeigt der VIC an dass er zusätzliche Zugriffe mit clock=high benötigt).
    Also man kann also nicht mal jeden Takt auf den Speicher zugreifen und dann immer nur einmal pro Takt Aufgrund der RAS/CAS Signale.
    Ausserdem sollte man noch erwähnen dass man DMA nicht auf low ziehen darf solange die CPU dabei ist Schreibaktivitäten durchzuführen.

  • Versteh ich das nun recht, dass aber im verbliebenen Takt eigentlich 2 Speicherzugriffe pro Takt möglich wären?

    Was heißt "eigentlich"? Wie Du schon bemerkt hast, nutzt der VIC die Zeit, wo die CPU nicht auf den Speicher zu greift. Pro CPU-Takt passieren also immer zwei Speicherzugriffe.


    Wäre es also möglich, die Zugriffsgeschwindigkeit mit geeigneter Hardware zu verdoppeln?

    Der C128 kann genau das. Wenn man in den 2-Mhz-Modus schaltet, gibt der VIC alle Zyklen für die CPU frei und greift selbst nicht mehr auf den Speicher zu. Daher wird auch nur noch das angezeigt, was sich zufällig gerade auf dem Datenbus befindet.


    Turbokarten lösen das Problem, indem sie den Speicher spiegeln. So kann der VIC auf den Originalspeicher zugreifen, während die CPU ihren eigenen Speicher nutzt, ohne in Konflikt mit dem VIC zu geraten. Herkömmliche Turbokarten werden daher auch bei Schreibzugriffen ausgebremst, da beide RAMs beschrieben werden müssen. Beim Chameleon hingegen bekommt der VIC seine Daten aus dem externen RAM.

  • Ok. Erstmal vielen Dank für eure Antworten!


    Zunächst mal zu den 2 Flanken. Das wusste ich durchaus. Aber aus Sicht des Speichers machen die 2 Flanken ja keinen Unterschied? Also ich meine, der Speicher führt ja pro Taktzyklus quasi 2x einen identischen Zugriff (bis auf Adresse natürlich) durch, so dass er quasi mit 2 MHz läuft?


    Wobei ja der Phi1 und Phi2 Takt eine länge Low-Phase haben, wenn ich das recht gesehen hab. So kommen wohl der VIC und der 6510 unterschiedliche lange den Bus zugeteilt. Der VIC bekommt ihn länger, wenn ich das recht verstanden hab?


    Das mit der Ras Cas Erzeugung durch den VIC und die PLA Verzögerung hört sich nach nem echten Showstopper an. Das ist ein sehr guter Einwand.


    Also mit 2 Zugriffe pro Takt hab ich 2 Zugriffe in der CPU-Zyklushälfte gemeint. Der 2. VIC Zugriff hab ich da bisserl unterschlagen, weil er mir nicht viel hilft.


    Kurze Erklärung: ich bastle hier mir so nem ganz billigen FPGA Board rum. So ein EP2T5T144 Board für 12,-


    http://www.leonheller.com/FPGA/FPGA.html


    Damit wollte ich quasi cp/m Karte und 80-Zeichen Karte verheiraten und das Ganze so klein, dass es auf eine kleine Modulplatine passt (wegen der freien Eagle Version). Hab mal 2 kb Ram reservert und 2kb Font und eine VGA-Ausgabe geschrieben. Die hat noch die falsche Auflösung und den falschen Font, aber ich weiss nun, dass die so 760 Logikzellen und 4 kb Speicher brauchen wird. Der Speicher wird also in dem FPGA gespiegelt, weil die VGA Ausgabe sonst ständig auf den c64 Speicher zugreifen müsste.


    Das Board hat so 15 kb Speicher ca. , so dass also knapp 10kb über wären. Den ganzen c64 Speicher spiegeln geht also nicht. Aber ich probier gerade mit nem kleinen Cache rum (so. max 4kb dachte ich). Wenn zumindest kleinere Schleifen da komplett reinpassen würden, könnte die CPU ihre Opcodes dort herbekommen, ohne dass ein weiterer c64 Ram Zugriff notwendig wäre.


    Und diesen Cache wollte ich schnell füllen. Daher die Überlegung, wie ich schneller aus dem c64 Ram lesen könnte.

  • Datenblätter mit Timing-Diagramm gibts hier: http://www.zimmers.net/anonftp/pub/cbm/documents/chipdata/


    Laß' Dich nicht von den Diagrammen täuschen, da ist die 'aktive' Hälfte von Phi2 gerne mal etwas länger gezeichnet- allein schon um alle Timing-Punkte drin unterzubringen. 'in real' kann man das auch machen, wenn man sehr langsamen Speicher hat. Beim 64er hat man aber ein 50:50 Taktverhältnis, also 500 ns pro Speicherzugriff. Das reicht selbst für die ganz alten Chips mit 350 ns Zugriffszeit dicke aus, die meisten Boards sidn aber mit 200 ns oder 150 ns RAM bestückt.


    Und natürlich kann man auch zwei CPU-Speicherzugriffe in den 500 ns 'CPU-Zeit' unterbringen. Das gabs sogar mal als Projekt in der 64er; da lief der Prozessor de facto mit 4 MHz (natürlich nur in der ersten Takt-Hälfte...) und RAS und CAS wurden trickreich 'verdoppelt. Schnelles RAM ist ebenso Pflicht wie Zurückschalten auf 1 MHz bei IO-Zugriffen. War eine ziemlich irre Kiste, das...

  • Das gabs sogar mal als Projekt in der 64er; da lief der Prozessor de facto mit 4 MHz (natürlich nur in der ersten Takt-Hälfte...) und RAS und CAS wurden trickreich 'verdoppelt. Schnelles RAM ist ebenso Pflicht wie Zurückschalten auf 1 MHz bei IO-Zugriffen. War eine ziemlich irre Kiste, das...

    Klingt cool - hättest Du eine grobe Ahnung in welchem Jahrgang man danach suchen müsste?

  • die meisten Boards sidn aber mit 200 ns oder 150 ns RAM bestückt.

    Vorsicht... das ist die RAS-Access time. Da kommt noch die Precharge Time dazu. Meiner Erinnerung nach heisst die interessante Zeit 'RAS Cycle time'. Das ist die Zeit die der komplette Zyklus braucht bis der nächste kommen darf. Das sind bei DRAMs mit 200ns RAS access time so in der Gegend von 300ns.