Forum: FPGA, VHDL & Co. Erzeugung eines Interrupts bei Änderung im Datenbus mittels CPLD


von Andreas N. (poolspieler)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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

von SeriousSam (Gast)


Lesenswert?

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.

von Andreas N. (poolspieler)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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
Noch kein Account? Hier anmelden.