Hallo, Da mein lieblingspinball langsam den geist aufgibt wollte teile davon in einem FPGA implementieren. Da der soundboard sehr einfach aufgebaut ist (6800/6821/ROM/RAM/DAC) fing ich erst damit. Mit dem 6800/RAM/ROM ging schnell, war fehlt ist 6821 i/o. Beim opencores habe die IC6821.vhd gefunden - die den MC6821 abbildet. Allerdings bekomme ich es nicht zum laufen, ob Quartus oder ISE jeden menge fehler werden gemeldet. Da ich mich auf Altera festgelegt habe hier die Quartus error msg : "HDL error at IC6821.vhd(305): can't infer register for "CB2" because its behavior does not match any supported register model" Der author schrieb "finished the coding and some basing simulation using the QUARTUS" also sollte es läufähig sein. Kann bitte jemand blick drauf werfen ?
Du hast wahrscheinlich das Problem, dass du das Ding mit den anderen Komponenten zusammen in 1 FPGA packen willst? Dann geht der inout-Port nicht:
1 | CB2: inout std_logic; |
Denn innerhalb eines FPGAs gibt es kein Tristate:
1 | CB2<='Z'; |
Wenn das nur diesen Port betrifft, sollte das Umschreiben nicht allzuviel Aufwand sein. Mich wundert in dem Fall aber, dass das nicht auch schiefgeht:
1 | DB<=(OTHERS=>'Z'); |
Lothar Miller schrieb: > Du hast wahrscheinlich das Problem, dass du das Ding mit den anderen > Komponenten zusammen in 1 FPGA packen willst? ja im endergebniss schon, wollte erst mal sehen ob ich es überhaupt benutzen kann. Anscheinend hat Quartus 9 probleme mit z.b. "bufPB(i)<=PB(i); DB_PB(i)<=PB(i)", mit Quartus 5 funktioniert ohne probleme.
Oh, jetzt sehe ich das erst... Das ist eine böse Beschreibung:
1 | if reset='0' then bufPA<=(others=>'0'); |
2 | elsif ... |
3 | :
|
4 | if e'event and e='0' then bufPA(i)<=DB(i); end if; |
5 | :
|
6 | if e'event and e='1' then bufPA(i)<=PA(i); DB_PA(i)<=PA(i); end if; |
7 | :
|
8 | end if; |
9 | END PROCESS; |
Mit diesen 2 Zeilen werden FF beschrieben, die sowohl mit der steigenden wie auch der fallenden Flanke Daten übernehmen können. Sowas gibt es bestenfalls in den IO-Zellen eines FPGAs (DDR-Interface). Und das ist ziemlich durchgängig so beschreiben... :-o Probier das doch mal, indem du alle 'event rausnimmst, und alles über Latches abhandelst. Z.B. vorher:
1 | if (reset='0') or (mpu_readA='1') then irqaf1_1<='0'; irqaf1_2<='0'; |
2 | elsif CRA(5)='0' and CRA(4)='0' then -- the latch for the CA2 is from high to low |
3 | if CA2'event and CA2='0' then irqaf2_1<='1'; end if; |
4 | elsif CRA(5)='0' and CRA(4)='1' then -- the latch for the CA2 is from low to high |
5 | if CA2'event and CA2='1' then irqaf2_2<='1'; end if; |
6 | end if; |
Nachher:
1 | if (reset='0') or (mpu_readA='1') then irqaf1_1<='0'; irqaf1_2<='0'; |
2 | elsif CRA(5)='0' and CRA(4)='0' then -- the latch for the CA2 is from high to low |
3 | if CA2='0' then irqaf2_1<='1'; end if; |
4 | elsif CRA(5)='0' and CRA(4)='1' then -- the latch for the CA2 is from low to high |
5 | if CA2='1' then irqaf2_2<='1'; end if; |
6 | end if; |
Dann passt auch wieder der Kommentar: -- the latch for the CA2 Aber "schön" geht anders...
ja, auf die art geht. Es werden jetzt 236 statt 262 LE benötigt, man sieht auch im RTL fehlende FFs. Da Quartus 5 (die web edition) kein Modelsim hat muss ich das anders prüfen/vergleichen. Ich denke datasheet vom MC6821 wird mir da schon weiterhelfen. Danke für deine hilfe.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.