Hallo, ich bin grade in Quartus II am experimentieren. Ich will für ein Mikroprozessorboard einen simplen Peripheriebaustein machen, und zwar aus einem MAX7000S-CPLD. Vorerst sollen es einfach ein paar Latches sein, die jedoch zurücklesbar sind. Theoretisch könnte man ja gewöhnliche 8 Bit D-Flipflops nehmen, ist aber hässlich weil das dann write-only Ports sind. Dann will ich die Ports gleich auch noch als Eingang oder Ausgang konfigurieen. Bis jetzt bin ich aber nicht über die Bidirektionalen Pins für den Datenbus gekommen. Ich hab keine Ahnung, wie man das in Quartus macht - es funktioniert einfach nie zum simulieren! Zum Test habe ich das so gemacht: Ein D-Flipflop ist mit dem D-Eingang an einem BIDIR-Pin angeschlossen. Der Q-Ausgang geht über einen TRI-Buffer auf den BIDIR-Pin, welcher erst mal Ausgang sein soll. Gleichzeitig gehts über einen weiteren TRI-Buffer auf den Eingangspin, damit ich das, was im Flipflop gespeichert ist, wieder zurücklesen kann. Ich bringe es aber auf keinste Weise fertig, dass mir der Quartus-Simulator am Ausgang Daten anzeigt. Egal wie ich welche Signale ansteuere - nichts klappt. Übrigens mache ich mir diese Mühe darum, weil ich keine Octal D-Flipflops mit Clear gefunden habe, die sich auch wieder zurücklesen lassen. Wollte ich das mit diskreter Logik aufbauen bräuchte es jeweils einen 74HC273 und einen 74HC541, was zu mühsam ist. Gibts evtl eine Alternative? Grüsse Tobias
Ist es nicht einfacher ein Pin anstatt OUT als BUFFER definieren???
@ Tobias Plüss (hubertus) >Ich will für ein Mikroprozessorboard einen simplen Peripheriebaustein >machen, und zwar aus einem MAX7000S-CPLD. Vorerst sollen es einfach ein >paar Latches sein, die jedoch zurücklesbar sind. Theoretisch könnte man Sagen wir lieber Register. Latches sind ein Reizwort. >ja gewöhnliche 8 Bit D-Flipflops nehmen, ist aber hässlich weil das dann >write-only Ports sind. ??? > Dann will ich die Ports gleich auch noch als > Eingang oder Ausgang konfigurieen. Ja und? >Bis jetzt bin ich aber nicht über die Bidirektionalen Pins für den >Datenbus gekommen. Ich hab keine Ahnung, wie man das in Quartus macht - >es funktioniert einfach nie zum simulieren! Zum Test habe ich das so >gemacht: >Ein D-Flipflop ist mit dem D-Eingang an einem BIDIR-Pin angeschlossen. >Der Q-Ausgang geht über einen TRI-Buffer auf den BIDIR-Pin, welcher erst >mal Ausgang sein soll. Gleichzeitig gehts über einen weiteren TRI-Buffer >auf den Eingangspin, damit ich das, was im Flipflop gespeichert ist, >wieder zurücklesen kann. Ein Bild sagt mehr als tausend Worte. >Ich bringe es aber auf keinste Weise fertig, dass mir der >Quartus-Simulator am Ausgang Daten anzeigt. Egal wie ich welche Signale >ansteuere - nichts klappt. >Übrigens mache ich mir diese Mühe darum, weil ich keine Octal >D-Flipflops mit Clear gefunden habe, die sich auch wieder zurücklesen >lassen. Wollte ich das mit diskreter Logik aufbauen bräuchte es jeweils >einen 74HC273 und einen 74HC541, was zu mühsam ist. Gibts evtl eine >Alternative? Ja, umdenken. Die 74xx sind für einen CPLD egal. Nimm elementare Bausteine, die du für die Aufgabe brauchst. 8 D-FlipFlops 8 Tristate Treiber bissel Logik Über CS und RD vom Mikrocontroller wird der Tristatetreiber gesteuert, über den dein Register rücklesbar die Daten auf den Datenbus schreibt. Über CS und WR wird der Schreibvorgang in die FlipFlops gesteuert. Das wars. MFG Falk
@Falk: Ja ich weiss. Schau mal: Ich könnte an den Dazenbus des Microprocessors 74HC273 Flipflops hängen. Wenn WR und CS aktiviert wird, wird dann ein Byte in diesem FF gespeichert und ausgegeben. Die Ausgegebenen Daten kann ich aber ohne Zusatzaufwand nicht zurücklesen - deshalb meine Frage. Ich hab das so aufgebaut wie dus sagst - meiner Meinung nach sollte es Funktionieren, aber in Quartus klappt es mit der Simulation nicht. Deshalb frage ich hier nach. Bild poste ich wenn ich zu Hause bin, jetzt habe ich keinen Zugriff darauf.
So hier jetzt mal mein Schema. Was die Schaltung tun soll: Der Prozessor legt Daten am Pin "DATA" an. Danach aktiviert er WR und deaktiviert es wieder - das D-Flipflop (oder Register ;) btw: warum ist Latch kein gutes Wort?) speichert nun dieses Datenbit. Vorausgesetzt nun, dass der Pin I/O auf High ist, werden die Daten nun auch an den Ausgangspin getrieben. Mit dem Pin "I/O" kann man also steuern, ob der Pin Eingang oder Ausgang sein soll. Nun - wenn der Prozessor jetzt den Pin RD auf Low zieht, so werden die Daten, welche am Pin anliegen, auf den "DATA" getrieben - der Prozessor führt jetzt also einen "read pin" aus. Dadurch sind mit dieser Schaltung zwei Dinge möglich: man kann einen Pin als Ein-/Ausgang schalten man kann auf einen Pin einen Wert ausgeben, aber nur wenn der Pin auch als Ausgang konfiguriert wird und der Prozessor kann den an einem Pin anliegenden Wert zurücklesen. Nun in meiner Theorie funktioniert das wunderbar, aber kann mir jemand mal erklären was ich in der Simulation falsch mache? Die DATA und Q Pins sind immer HiZ. Übrigens will ich VHDL lernen - wenn also jemand sowas in VHDL schon mal gemacht hat wäre ich interessiert. Grüsse Tobias
@ Tobias Plüss (hubertus) >Dateianhang: bin.jpg (144,7 KB, 0 Downloads) Bildformate >Der Prozessor legt Daten am Pin "DATA" an. Danach aktiviert er WR und >deaktiviert es wieder - das D-Flipflop (oder Register ;) btw: warum ist >Latch kein gutes Wort?) speichert nun dieses Datenbit. Latch >Vorausgesetzt nun, dass der Pin I/O auf High ist, werden die Daten nun >auch an den Ausgangspin getrieben. Mit dem Pin "I/O" kann man also >steuern, ob der Pin Eingang oder Ausgang sein soll. Nun - wenn der >Prozessor jetzt den Pin RD auf Low zieht, so werden die Daten, welche am >Pin anliegen, auf den "DATA" getrieben - der Prozessor führt jetzt also >einen "read pin" aus. Dadurch sind mit dieser Schaltung zwei Dinge >möglich: Deine Schaltung sieht erstmal gut aus. Sinnvollerweise wird dein SIgnal I/O auch von einem Register gespeist. Vergleichbar mit den DDRx Register der AVR Controller. >Nun in meiner Theorie funktioniert das wunderbar, aber kann mir jemand >mal erklären was ich in der Simulation falsch mache? Die DATA und Q Pins >sind immer HiZ. Keine Ahnung, kenn mich mit dem Quartus-Simulator nicht aus. >Übrigens will ich VHDL lernen - wenn also jemand sowas in VHDL schon mal >gemacht hat wäre ich interessiert.
1 | -- Schreibzugriff
|
2 | |
3 | process(n_wr, n_cs) |
4 | begin
|
5 | if rising_edge(n_wr) then |
6 | if n_cs='0' then |
7 | my_register <= data_bus; |
8 | end if; |
9 | end if; |
10 | end process; |
11 | |
12 | -- Lesezugriff
|
13 | |
14 | process(n_rd, n_cs) |
15 | begin
|
16 | if n_cs='0' and n_rd='0' then |
17 | data_bus <= my_register; |
18 | else
|
19 | data_bus <= "ZZZZZZZZ"; |
20 | end if; |
21 | end process; |
22 | |
23 | -- Richtungsumschaltung
|
24 | |
25 | my_io <= my_register when my_dir='1' else "ZZZZZZZZ"; |
So in etwa. MFG Falk
@Falk: Danke erstmal für deine Hilfe. 1. Warum hast du mir den Link zu den Bildformaten gepostet? Es ist ein jpg. Das sollte völlig okay sein. 2. Okay das mit dem Latch wusste ich nicht - allerdings scheint mir in diesem Fall hier die Funktion von einem Latch und einem Flipflop die gleiche zu sein ;) Aber gut. Wieder was dazugelernt ;) Latch möglichst vermeiden. 3. Danke für deinen VHDL-Code (das nennt man doch Code, oder? Oder "Beschrieb" ? Denn er beschreibt ja was ;)) Ich teste den morgen aus. Nachher muss ich nämlich noch weg, deshalb kann ich mir der Thematik hier grade nicht weiter widmen, aber morgen ist ja Wochenende ;) Euch einen schönen Abend, Grüsse Tobias
@ Tobias Plüss (hubertus) >1. Warum hast du mir den Link zu den Bildformaten gepostet? Es ist ein >jpg. Das sollte völlig okay sein. Lies den Artikel nochmal. >2. Okay das mit dem Latch wusste ich nicht - allerdings scheint mir in >diesem Fall hier die Funktion von einem Latch und einem Flipflop die >gleiche zu sein ;) Aber gut. Wieder was dazugelernt ;) Latch möglichst >vermeiden. Ja. >3. Danke für deinen VHDL-Code (das nennt man doch Code, oder? Oder Ja, nomaler Quelltext, Sourcecode, whatever. MFG Falk
@ Sag ich nicht: Buffer die nach außen gehen sollten ;)? @ Tobias: Es geht auch ohne Process direkt in der arch. Ich empfehle dir noch eine Zusatzleitung als Enable-Signal, wirst später sehen, dass man die benutzen sollte :) In der Entity deklarierst du die leitung als inout: WR : in STD_LOGIC; ENA : in STD_LOGIC; data_bus_io : inout STD_LOGIC_VECTOR(7 downto 0); ... ... ... Erstell dir 2 weitere interne Signale: signal data_bus_in : std_logic_vector(7 downto 0); signal data_bus_out : std_logic_vector(7 downto 0); ... ... data_bus_io <= data_bus_out when (WR='0') and (ENA='1') else (others => 'Z'); data_bus_in <= data_bus_io when (WR='1') and (ENA='1') else (others => 'Z'); Jetzt muss du beide interne Signale mit deinem Kommunikationsmodul oder was auch immer verbinden und je nach Lage der WR Leitung Daten schreiben oder lesen. Wenn du was nicht verstanden hast, hilft dir Falk sicherlich gerne weiter, er hat da bestimmt mehr Ahnung und Erfahrung als ich.
Danke Peter. Ich bin grade am Überlegen, wie man ein Register definiert... Ich hab in VHDL bis jetz höchstens einfache Logik gemacht ;) Register sind da was ganz neues...
@ Tobias Plüss (hubertus) >Ich bin grade am Überlegen, wie man ein Register definiert... Ich hab in >VHDL bis jetz höchstens einfache Logik gemacht ;) Register sind da was >ganz neues... Der Schreibprozess definiert ein Register. MFG Falk
Schaue dir die Beispiele an, da wird z.B. beschrieben, wie man ROMs etc. realisiert. Ich weiß nicht, ob die Altera Software eine VHDL Beschreibung in RAMs o.ä umsetzt. Bei ISE kann man entweder die Primitiven nutzen, oder wenn die Busbreite stimmt, setzt die Synthese dein Speichermodel in automatisch in ein RAM um.
Hallo Peter, ich beabsichtige das ganze zuerst mal in einem relativ simplen CPLD zu machen (Max7000S von Altera). Mit FPGAs habe ich leider 0 Erfahrung, und ausserdem sind die, soweit ich weiss, nicht für 5V Betrieb ausgelegt. Mein Prozi ist aber 5V. und ich bin nicht unbedingt gewillt, für jedes Signal einen Level Converter einzusetzen ;) Aber schön wäre es wenn man dafür einen Spartan II oder so nehmen könnte. Die liegen bei uns in der Firma massenhaft rum und man könnte sicherlich ein paar davon haben ;)
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.