www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Register Inhalt prüfen und nach bestimmte x Zeit der Inhalt


Autor: Eddy Hoffmann (Firma: student) (eddy_2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo allerseits,

auf ein Register in VHDL, werden von Aussen mit C-programm aber 
unregälmässig Daten geschrieben "00011100011",

die will ich lesen und darauf reagieren...     das geht jetzt ohne 
Problem!
aber ich will diese Daten nach bestimmte Zeit mit vhdl löschen,
dh der Inhalt der Register auf Null wieder setzen,

ich habe ein Process geschrieben:
slv_reg_reset : process ( Bus2IP_Clk ) is
begin
  if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
     for i in 0 to (C_DWIDTH-1) loop
  if slv_reg0(i) = '1' then
    slv_reg0 <= (others => '0') after 200 ms ;
  end if;
     end loop;
   end if;
end process slv_reg_reset;

ich glaube aber dass After nur für die Simulation gültig ist,
dh ich soll andere weg gehen ? deswegen brauche ich eure Hilfe oder ein 
bsp wie ich das machen kann,

kann mir ein Zähler dabei helfen?
hat jemanden ein bsp?

danke für irgend ein Hinweis und Hilfe

Eddy

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Eddy Hoffmann (Firma student) (eddy_2007)

>auf ein Register in VHDL, werden von Aussen mit C-programm aber
>unregälmässig Daten geschrieben "00011100011",

Das heisst die Logi ist in einem FPGA/CPLD welcher an einem 
Mikrocontroller hängt?!

>aber ich will diese Daten nach bestimmte Zeit mit vhdl löschen,
>dh der Inhalt der Register auf Null wieder setzen,

>    slv_reg0 <= (others => '0') after 200 ms ;

>ich glaube aber dass After nur für die Simulation gültig ist,

Genau.

>kann mir ein Zähler dabei helfen?

Ja.

>hat jemanden ein bsp?

Nein.
Wenn der Schreibzugriff erfolgt, einen Zähler laden, den dann 
runterzählen lassen
Wenn er Null erreicht hat, das Register löschen.

MfG
Falk

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß ja nicht was das werden soll, aber am besten ist es wohl beim 
Beschreiben des Register einen Timer zu starten und wenn der abgelaufen 
ist, das Register zu löschen.
Oder Du löscht das Register sofort nachdem Du auf den Wert reagiert 
hast.

Autor: Fehlerteufel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner fettnapf: was soll passieren, wenn gleichzeitig die zeit 
abgelaufen ist und von aussen geschrieben wird? hier musst du eine 
priorisierung vorgeben (Entweder löschen oder Schreiben zulassen)

Autor: Eddy Hoffmann (Firma: student) (eddy_2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus Falser wrote:
> einen Timer zu starten und wenn der abgelaufen
> ist, das Register zu löschen.
> Oder Du löscht das Register sofort nachdem Du auf den Wert reagiert
> hast.

Fehlerteufel wrote:
> Kleiner fettnapf: was soll passieren, wenn gleichzeitig die zeit
> abgelaufen ist und von aussen geschrieben wird? hier musst du eine
> priorisierung vorgeben (Entweder löschen oder Schreiben zulassen)

danke euch sehr,
genau da habe ich das problem, wenn geleichzeitig geschrieben und 
gelöscht werden soll ???
ich will aber auch das der Registerinhalt erst nach zb 100 ms gelöscht 
wird?

hat jemanden ein time bsp?

@ danke Falk für dein Tip,

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie soll man Dir ein Beispiel geben, wenn Du nicht einmal genau weißt 
was Du willst.
Aus welchem Grund soll das Register nach 100 ms gelöscht werden?
Passiert dabei etwas irgendeine Aktion, oder was ist der Grund?

Wenn das Beschreiben des Registers irgendeine Aktion auslöst, dann ist 
es wahrscheinlich am besten, das Register dann zu löschen wenn die 
Aktion ausgeführt wurde. Dann kann das C Programm das Register wieder 
auslesen, und wenn 0 zurückgelesen wird, dann weiß man : OK, erledigt.

Oder was hast Du eigentlich vor?

Autor: Eddy Hoffmann (Firma: student) (eddy_2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Falser wrote:
> Aus welchem Grund soll das Register nach 100 ms gelöscht werden?
> Passiert dabei etwas irgendeine Aktion, oder was ist der Grund?
> Oder was hast Du eigentlich vor?

mit dem FPGA soll ein Keypad gesteuert werden.

die Daten kommen an FPGA-Board via Ethernet deswegen ist um bestimmte 
Taste zu drücken mal parallel/gleichzeitig mal in Reihe nach..

der Tastendruck hat aber die Eigenschaft dass die Signale zwischen 50ms 
und 100 ms für bestimmt Fällen sogar 300 mikrosekunden

die Komponenten die ich geschrieben haben lesen von register die ganze 
Zeit
denn man kann nicht ahnen wann der Register berieben kann.
man kann ein Tastendruck unabhängig von der Zeit

==> wenn der Inhalt der Register !=0 ist dann werden Signale zum Keypad 
geschickt diese Signale sollen zb 100 ms dauern für ein Tasten Druck.

danach soll der Register Inhalt wieder auf 0 gesetzt werden.

====> dass geleichzeitig der Register zu überschreiben und löschen ist, 
ist hier ausgeschlossen da man nicht so schnell Tasten drücken darf mit 
C kann man das gut manipulieren!

mein Baord arbeitet mit 3,6Mhz kann auch schneller aber das ist was ich 
brauche..

ich habe mir ein Counter gedacht der einfach 1/(3,6Mhz)=T ===> T=0,27 us

dh x= (100ms * T)/0,27us = ca 370 T

dh ich brauche ein Zähler der wartet 370 T und dann der Registerinhalt 
auf 000000.. setzen ?

ist das so richtig oder gibt ein anderen Weg ?

danke alle

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz klar ist die Sache immer noch nicht, außerdem verwechselt Du dauern 
Millisekunden mit Microsekunden.
Bei 3.6 MHz sind 100 ms wohl eher 360.000 Takte.
Weiters kannst Du das Zurücksetzen des Registers nicht in einem 
getrennten Prozess machen, weil man auf ein Signal nicht von 2 
getrennten Prozessen aus schreiben darf.
Du mußt also die Entity ändern, in der das Register beschrieben wird. 
Dort startest Du einen Zähler, und nach x Taktzyklen wird alles wieder 
auf '0' gesetzt.

Autor: Eddy Hoffmann (Firma: student) (eddy_2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Falser wrote:
> Ganz klar ist die Sache immer noch nicht, außerdem verwechselt Du dauern
> Millisekunden mit Microsekunden.
> Bei 3.6 MHz sind 100 ms wohl eher 360.000 Takte.
> Weiters kannst Du das Zurücksetzen des Registers nicht in einem
> getrennten Prozess machen, weil man auf ein Signal nicht von 2
> getrennten Prozessen aus schreiben darf.
> Du mußt also die Entity ändern, in der das Register beschrieben wird.
> Dort startest Du einen Zähler, und nach x Taktzyklen wird alles wieder
> auf '0' gesetzt.


das stimmt, vielen Dank Klaus!!!

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.