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


von Eddy H. (Firma: student) (eddy_2007)


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

von Falk B. (falk)


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

von Klaus F. (kfalser)


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.

von Fehlerteufel (Gast)


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)

von Eddy H. (Firma: student) (eddy_2007)


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,

von Klaus F. (kfalser)


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?

von Eddy H. (Firma: student) (eddy_2007)


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

von Klaus Falser (Gast)


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.

von Eddy H. (Firma: student) (eddy_2007)


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!!!

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.