mikrocontroller.net

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


Autor: Andreas N. (poolspieler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
signal data_olf: std_logic_vector(15 downto 0);

-- datenregister
process(reset)
begin
  if rising_edge(reset) then
    data_old<=data;
  end if;
end process

-- interrupt RS FlipFlop
process(reset, set)
begin
  if reset='1' then
    interrupt <= '0';
  elsif set='1' then
    interrupt <= '1';
  end if;
end process

-- Vergleicher
set <= '1' when data /= data_old else '0';


Hier wird zwar ein böses Latch erzeugt, das ist aber hier OK.

MfG
Falk

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas N. (poolspieler)
Datum:

Bewertung
0 lesenswert
nicht 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:
WARNING:Xst:737 - Found 1-bit latch for signal <Interrupt>. Latches may be generated from incomplete case or if statements. 
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.
#IGNORE_WARNIG xxx

Gruß,

Poolspieler

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.