Hallo, ich fange gerade mit VHDL an und möchte folgendes realisieren: Es soll ein 16 Bit Datenbus überwacht werden. (16 Eingänge am XC9572) Wenn sich ein beliebiges Bit dieses Datenbusses ändert, dann soll ein Ausgang am CPLD auf HIGH gesetzt werden. Ich nenne dieses Ausgang INTERRUPT. Dieser Ausgang soll so lange HIGH bleiben, bis der Eingang RESET am CPLD auf High geht. Ich benötige diese Schaltung für einen Prozessor. Die INTERRUPT-Leitung würde ich am Prozessor auf einen Interrupteingang legen. Wenn der Interrupt im Prozessor kommt, dann weiß ich, dass ich jetzt die Datenbits des Datenbusses (seriell) einlesen kann. Auf diese Weise würde ich mir das ständige pollen sparen. Das serielle Einlesen der Daten vom CPLD zum µC über eine CLK und Datenleitung habe ich bereits geschaft - die Generierung des Interruptsignals lässt mich verzweifeln... :-(( Meine bisherigen VHDL-Versuche: Eigentlich müsste ich in einem Prozess die steigende UND die fallende Flanke jedes Datenbits abfragen und bei jeder Änderung den Interruptausgang auf HIGH setzen. Wie ich hier im Forum gelesen habe, geht das aber nicht... :-(( Das Rücksetzen des Interruptausgangs über das RESET-Signal sollte kein Problem sein, wenn man alles mit einem Prozess lösen könnte...??? Nun meine Frage: Ist es überhaupt möglich mit dem CPLD so eine Aufgabe zu lösen??? Ich nutze Xilinx ISE Webpack 10.1 Würde mich über Eure Hilfe sehr freuen. Gruß, Poolspieler
@Andreas N. (poolspieler) >Es soll ein 16 Bit Datenbus überwacht werden. (16 Eingänge am XC9572) >Wenn sich ein beliebiges Bit dieses Datenbusses ändert, dann soll ein >Ausgang am CPLD auf HIGH gesetzt werden. Ich nenne dieses Ausgang >INTERRUPT. >Dieser Ausgang soll so lange HIGH bleiben, bis der Eingang RESET am CPLD >auf High geht. >Eigentlich müsste ich in einem Prozess die steigende UND die fallende >Flanke jedes Datenbits abfragen und bei jeder Änderung den >Interruptausgang auf HIGH setzen. Wie ich hier im Forum gelesen habe, >geht das aber nicht... :-(( In der Tat. >Ist es überhaupt möglich mit dem CPLD so eine Aufgabe zu lösen??? Sicher. Ist recht einfach. Du brauchst ein 16 Bit Register, welches die alten Daten enthält. Per Vergleich weisst du, ob ein Datenbit sich geändert hat. Wenn ja, setzt du ein RS-FlipFlop. Damit wird die Interrupt-meldung gespeichert, auch wenn das Eingangsbit wieder zurückkippen sollte. Mit dem RESET setzt du das RS-FlipFlop zurück und kopierst gleichzeitig den aktuellen Datensatz ins Register. Etwa so.
1 | signal data_olf: std_logic_vector(15 downto 0); |
2 | |
3 | -- datenregister
|
4 | process(reset) |
5 | begin
|
6 | if rising_edge(reset) then |
7 | data_old<=data; |
8 | end if; |
9 | end process |
10 | |
11 | -- interrupt RS FlipFlop
|
12 | process(reset, set) |
13 | begin
|
14 | if reset='1' then |
15 | interrupt <= '0'; |
16 | elsif set='1' then |
17 | interrupt <= '1'; |
18 | end if; |
19 | end process |
20 | |
21 | -- Vergleicher
|
22 | set <= '1' when data /= data_old else '0'; |
Hier wird zwar ein böses Latch erzeugt, das ist aber hier OK. MfG Falk
Wenn du eine Clock hast und den aktuellen Status des Bus in deinem CPLD speichern kannst sollte das doch kein Problem sein. Du vergleichst einfach den aktuellen Status mit dem gespeicherten und wenn sie nicht gleich sind setzt du den IRQ-Ausgang auf 1. Mit Reset liest du dann den neuen Status ein. Du kannst ja das Schieberegister das du fürs Auslesen benötigst nach dem Auslesen verwenden um den gelesenen Buszustand zu speichern.
Hallo Falk,
vielen Dank, Du hast mir sehr geholfen! Funktioniert bestens :-))
> Hier wird zwar ein böses Latch erzeugt, das ist aber hier OK.
Noch eine kurze Frage zu der generierten Warnung:
1 | WARNING:Xst:737 - Found 1-bit latch for signal <Interrupt>. Latches may be generated from incomplete case or if statements. |
2 | We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems. |
Gibt es die Möglichkeit so eine Warnung an dieser einen Stelle bewußt zu ignorieren? Mit z.B.
1 | #IGNORE_WARNIG xxx |
Gruß, Poolspieler
@Andreas N. (poolspieler) >vielen Dank, Du hast mir sehr geholfen! Funktioniert bestens :-)) De nada. >Gibt es die Möglichkeit so eine Warnung an dieser einen Stelle bewußt zu >ignorieren? Keine Ahnung. MFG Falk
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.