mikrocontroller.net

Forum: FPGA, VHDL & Co. Auf Bitfolge im Bus triggern


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe einen 8 bit Datenbus. Dieser bringt regelmäßig eine Bitfolge 
von FF 00 00. Wie kann ich mit einer, sagen wir mal, If anweisung prüfen 
ob diese Bitfolge kommt?

MfG

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2 Buffer in für die Bytes n-1 und n-2, bei neu empfangenem Datenbyte n 
die if-Abfrage, wenn Bedingung nicht erfüllt wird alles wieder in Buffer 
schieben, n-1 zu n-2 und n zu n-1.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das versteh ich nicht...ich würde es so schreiben.

variable trigger1 : integer :=0;
variable Bus : out std_logic_vector(7  downto 0);

If (Bus = x"FF" and Bus = x"00" and Bus = x"00") then
trigger1 := 1;
end If;

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Wie kann denn Bus gleichzeitig 00 und FF sein?
Die "alten" Zustände mußt du zwischenspeichern.
Siehe X-Rocka.

Gruß
Joachim

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also quasi so:

temp1 := bus(7 downto 0);
temp2 := bus(7 downto 0);
temp3 := bus(7 downto 0);

If (temp1 = x"FF" and temp2 = x"00" and temp3 = x"00") then
trigger1 := 1;
end If;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> also quasi so:
Mal ohne die Zeitlichen Abläufe zu betrachten: eigentlich ja. Aber...!

Du wirst damit aber nicht glücklich werden, denn an dem Bus werden 
niemals alle Bits gleichzeitig umschalten, und deshalb kannst du 
durchaus sowas bekommen:
FF FF 3E 00 00
oder beliebige andere Zustände...
Und was machst du dann?

Fazit: du brauchst eigentlich irgendein Signal, das sagt, wann die Pegel 
auf dem Bus stabil sind. Und nur zusammen mit diesem Signal kannst du 
dann stabile und gültige Zustände einlesen.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und warum benutzen hier neuerdings alle (die vermutlich gerade mit 
VHDL anfangen) Variablen? Find' ich sch$%^^$ und eigentlich zeigt es, 
dass man HW-Design nicht wirklich versteht...

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> ... und warum benutzen hier neuerdings alle (die vermutlich gerade mit
> VHDL anfangen) Variablen?

Wenn man sich die durchschnittlichen Vorlesungen zu VHDL an den Uni's 
ansieht erklärt sich so manches, ...

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. I. schrieb:
> Wenn man sich die durchschnittlichen Vorlesungen zu VHDL an den Uni's
> ansieht erklärt sich so manches, ...

Oh Mann, dann sollten die Profs mal schnell den Googleberg machen...

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber um dem TO mal ein praktisches, millionenfach erprobtes Beispiel zu 
geben:
sklaventreiberprozess: process (sklaventreiberwillvielleichtwas)
begin
   wait until rising_edge (sklaventreiberwillvielleichtwas);
   if dawilleinerwas = '1' then
      waswillerdenn <= bus (7 downto 0);
      waswollteervorher <= waswillerden;
      koennteesseindass <= waswollteervorher;
      bingo <= '0';
      if waswillerdenn = x"00" and
         waswollteervorher = b"0000_0000" and
         koennteesseindass = "11111111" then
         bingo <= '1';
      end if;
   end if;
end process;

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, das bingo<='0' steht noch an der falschen Stelle...

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, und das 'waswillerdenn' sollte eigentlich := sein und damit eine 
Variable...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> und warum benutzen hier neuerdings alle
> (die vermutlich gerade mit VHDL anfangen) Variablen?
Ich meine, irgendwo ein "Kochrezept" (in Form eines Buches) gesehen zu 
haben, wo die (annähernde) 1:1 Übersetzung von C nach VHDL mit Hilfe von 
Variablen erklärt wird. Das ist zwar ein durchgehend bescheuertes, aber 
offenbar sehr erfolgreiches Konzept...   :-/

In der Praxis gefallen Anfängern Variablen deshalb so gut, weil sie sich 
"anfühlen" wie Variable in einer Programmiersprache: sofort nach der 
Zuweisung ist der Wert "übernommen". Logisch, dass die dann recht bald 
auf die Nase fallen und die Welt nicht mehr verstehen...

berndl schrieb:
> Mist, und das 'waswillerdenn' sollte eigentlich := sein
Es geht auch ohne:
sklaventreiberprozess: process (sklaventreiberwillvielleichtwas)
begin
   wait until rising_edge (sklaventreiberwillvielleichtwas);
   if dawilleinerwas = '1' then
      waswillerdenn <= bus (7 downto 0);
      waswollteervorher <= waswillerden;
      koennteesseindass <= waswollteervorher;
   end if;
end process;

bingo <= '1' when waswillerdenn = x"00" and
         waswollteervorher = b"0000_0000" and
         koennteesseindass = "11111111" 
         else '0';

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte das auch mit einer FSM machen, sollte registersparender sein.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn es sauber sein soll, dann wie von Lothar beschrieben. Braucht 
24 FlipFlops und ein paar LUTs für den Vergleich. Wo soll man da 
Register einsparen?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. I. schrieb:
> Man könnte das auch mit einer FSM machen
So etwa:
signal treffer : integer range 0 to 2;

sklaventreiberprozess: process (DasValidierungssignal)
begin
   wait until rising_edge(DasValidierungssignal);
   bingo <= '0';
   if treffer = 0 then
      if bus = x"ff" then    treffer <= 1;
      end if;
   elsif treffer = 1 then
      if bus = x"00" then    treffer <= 2;
      else                   treffer <= 0;
      end if;
   elsif treffer = 2 then
      treffer <= 0;
      if bus = x"00" then
         bingo <= '1';
      end if;
   end if;
end process;
Und dann gibt es noch mindestens 31 andere Wege...

Christian R. schrieb:
> Wo soll man da Register einsparen?
Die Idee mit der FSM ist gar nicht mal so schlecht...  ;-)

Allerdings sollte man jetzt noch darauf achten, dass 
DasValidierungssignal evtl. nicht synchron zum restlichen FPGA ist...

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>> Wo soll man da Register einsparen?
> Die Idee mit der FSM ist gar nicht mal so schlecht...  ;-)

Hm stimmt, ich hatte gleich wieder eine Latch-Schweinerei vermutet. 
Schlimm, wenn man immer vom schlimmsten ausgeht. Für einen CPLD ist 
sowas sparsames sicherlich sinnvoll. Dann nehm ich alle bösen 
Vermutungen zurück ;)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh weh da hab ich ja was angestellt...

zum Thema Variablen udn VHDL allgemein. Meine VHDL Vorlesung lief wie 
folgt:

Bauen Sie eine digitale Weckuhr die folgendes kann. Dort ist die 
Bibliothek die haben VHDl Bücher. Abgabe in 9 Wochen.

Das war die Vorlesung. Das Wissen kommt von Reichardt | Schwarz => VHDL 
Syntehese was ich mir angelesen habe.

So nun wisst ihr erstmal wie der Sach- und Kenntnisstand ist.

Nun zum Thema.

Ich will mit der Abfrage der Bitfolge einen Startwert setzen.
Wenn der Wechsel von FF 00 00 AB zu FF 00 00 9D kommt, soll er sich das 
merken. Dieser Wechsel ist das erste Pixel im sichtbaren Bereich des 1. 
Halbbildes in eine ITU 656 Videodatenstrom.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das erklärt aber noch nicht folgendes:

Woher kommt der Takt? Woran erkennst du, dass auf dem Bus gerade ein 
gültiges Datum anliegt?

Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...so ich habe mal die vhd Datei angehangen...

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Problem beim Bytewechsel prüfen ist, dass ich ein OUT Signal wohl 
nicht prüfen kann er meckert dann und sagt:

Error (10309): VHDL Interface Declaration error in build_itu.vhd(428): 
interface object "ITU_OUT" of mode out cannot be read. Change object 
mode to buffer.
Error: Quartus II Analysis & Synthesis was unsuccessful. 1 error, 6 
warnings
  Error: Peak virtual memory: 189 megabytes
  Error: Processing ended: Fri Mar 04 08:13:02 2011
  Error: Elapsed time: 00:00:09
  Error: Total CPU time (on all processors): 00:00:08

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein auf einem out kann man nicht lesend zugreifen.

Das löst man üblicherweise über ein internes Signal, dies kannst du dann 
lesen und schreiben und dieses Signal gibst du auf den out.

Dazu kannst du das deklarierte TMP_ITU verwenden. Ersetze alle ITU_OUT 
durch TMP_ITU und gib TMP_IPU concurrent an ITU_OUT aus.

Aber in dem Code ist ja mal wieder alles enthalten was den Anfänger 
garantiert bumsen wird...

Von der Verwendung der alten Synopsis-Lib über Variablen bis hin zum 
asycnhronen Reset.

Na Prost Mahlzeit.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ja so ist das wenn man sich fast alles selber anliest... :)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Waaahnsin... :-o
Was man heutzutage nicht alles in einen (in Zahlen 1) Prozess packen 
kann! Das passiert, wenn diese Variablen, die ja nur im Prozess sichtbar 
sind) gehäuft ins Spiel kommen.

In der Praxis bewährt es sich, mehrere Prozesse zu verwenden. Der Hacker 
(oder der C-Umsteiger) käme jetzt auf die Idee, Shared Variables zu 
nehmen, die dann global sichtbar sind, um diese Aufteilung in mehrere 
Prozesse zu ermöglichen...  :-/

Martin schrieb:
> ...ja so ist das wenn man sich fast alles selber anliest... :)
Naja, ich denke eher, der Schritt von einer Uhr zu diesem ITU-Dingens 
ist einfach zu groß. Und gerade bei VHDL kommt das "Gefühl", ob was 
funktionieren könnte oder nicht, nur aus der Praxis, nicht aus Büchern. 
Also: Üben, üben, üben...

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich habs mal umgeschrieben...

If (ITU_TEMP = "11111111") then
       trigger1 := 1;
       If (trigger1 = 1 and ITU_TEMP = "00000000") then
        trigger2 := 1;
        If (trigger1 = 1 and trigger2 = 1 and ITU_TEMP = "00000000") 
then
         trigger3 := 1;
         If (trigger1 =1 and trigger2 = 1 and trigger3 = 1 and ITU_TEMP 
= "10101011") then
        trigger4 := 1;
         Elsif (trigger1 = 1 and trigger2 = 1 and trigger3 = 1 and 
ITU_TEMP = "10011101") then
          trigger5 := 1;
         End If;
        End If;
       End If;
      End If;

      If (trigger4 = trigger5) then
       picture_clk := 1;
      else
         picture_clk := 0;
        End If;

Kann ich mir mit SignalTap die Zustände von trigger 1 - 5 und 
picture_clk anzeigen lassen?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnte ich nicht auch einen 40 Bit vector erstellen, der dann gleich die 
Bitreihenfolge prüft.

variable ITU_TEST : std_logic_vector (39 downto 0);
variable ITU_TEMP : std_logic_vector (7 downto 0);

ITU_TEST < ITU_TEMP;

If (ITU_TEST = "11111111000000000000000010101011"= then
 trigger := 1;
else
 trigger := 0;
End If;

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Kann ich mir mit SignalTap die Zustände von trigger 1 - 5 und
> picture_clk anzeigen lassen?

Vielleicht verwendest Du erstmal einen Simulator und bringst es dort 
richtig zum Laufen, ehe das Design auf die Hardware kommt?!?

Duke

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...kaputt machen kann man ja nix...also ab auf die HW...meine Erfahrung 
zu Simulationen...kosten Zeit uns Nerven und auf der HW läufts dann doch 
immer anders...

Und zu meiner Frage...ja man kann die trigger ausgeben...:)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> kaputt machen kann man ja nix...also ab auf die HW
So wird heutzutage Software gemacht...

Martin schrieb:
> .meine Erfahrung zu Simulationen...kosten Zeit uns Nerven
> und auf der HW läufts dann doch immer anders...
Mag sein...
Aber dann weißt du wenigstens, ob es überhaupt gehen könnte...  :-/

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...das zeigt mir die HW aber schneller als wenn ich die Testbench 
jedesmal anpassen muss. :-)

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> ...das zeigt mir die HW aber schneller als wenn ich die Testbench
> jedesmal anpassen muss. :-)

Ja du bist schlauer als die geballte Forenkompetenz hier und die 
gesamten VHDL-Entwickler, das hast du schon sehr zur Schau gestellt.

Jedoch was machst du wenn Synthesen mal 4 Stunden oder gar Tage dauern? 
Na dann Prost Mahlzeit

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. I. schrieb:
> Jedoch was machst du wenn Synthesen mal 4 Stunden oder gar Tage dauern?

So weit kommt es nicht. Mit seiner Kompetenz ist er schon viel früher in 
die Leitungsebene aufgestiegen [1]. Wenn nicht sogar zum CTO.

Duke

[1] http://de.wikipedia.org/wiki/Peter-Prinzip

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> D. I. schrieb:
>> Jedoch was machst du wenn Synthesen mal 4 Stunden oder gar Tage dauern?
>
> So weit kommt es nicht. Mit seiner Kompetenz ist er schon viel früher in
> die Leitungsebene aufgestiegen [1]. Wenn nicht sogar zum CTO.
>
> Duke
>
> [1] http://de.wikipedia.org/wiki/Peter-Prinzip

ehehehe, vorausgesetzt er sieht eine Firma von innen :D

Autor: LOL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
4 stunden synthese...püh...für modelsim muss ich das projekt ja auch nur 
komplett compilieren....immer dieses sinnlose rumsimulieren

Hey ich will kein programmierer werden nur meine sinnlose abschlußarbeit 
fertig machen. Zum programmierenden kellerkind sind andere geboren. 
LOL

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.