Hallo, ich hab hier ein 8bit schieberegister gebaut. So funktioniert das auch. Nur ich würde das gerne anders schreiben. Kann mir da jemand helfen? Danke signal mEnable : STD_LOGIC; signal Register : STD_LOGIC_VECTOR (7 downto 0); Schiebe_PR: process(CLOCK, mCounter) begin if(PWFail = '1') then S_Register(0) <= '0'; elsif(rising_edge(CLOCK)) then Register(0) <= mEnable; Register(1) <= Register(0); Register(2) <= Register(1); Register(3) <= Register(2); Register(4) <= Register(3); Register(5) <= Register(4); Register(6) <= Register(5); Register(7) <= Register(6); end if; end process Schiebe_PR;
Gastn schrieb:
> So funktioniert das auch. Nur ich würde das gerne anders schreiben.
Wie anders?
1 | signal mEnable : STD_LOGIC; |
2 | signal sRegister : STD_LOGIC_VECTOR (7 downto 0); |
3 | |
4 | Schiebe_PR: process(CLOCK, mCounter) |
5 | begin
|
6 | if(PWFail = '1') then |
7 | sRegister <= (others =>'0'); |
8 | elsif(rising_edge(CLOCK)) then |
9 | sRegister <= sRegister(6 downto 0)&mEnable; |
10 | end if; |
11 | end process Schiebe_PR; |
Vieleicht so? Nebenbei bemerkt: 'register' ist ein Schlüsselwort, das sollte man besser nicht als namen für ein Signal verwenden, manche SyntheseTools haben damit Probleme. Habe das mal geändert...
> Nur ich würde das gerne anders schreiben. Die einfachste Möglichkeit mit dem Verkettungsoperator & lasse ich hier jetzt mal weg. Mit einer klitzekleinen Suche nach dem Begriff "Schieberegister" hier im FPGA-Forum tauchen da einige auf :-/ Alternativ gäbe es die Möglichkeit z.B. mit einer for-schleife:
1 | signal mEnable : STD_LOGIC; |
2 | signal Register : STD_LOGIC_VECTOR (7 downto 0); |
3 | |
4 | Schiebe_PR: process(CLOCK, mCounter) |
5 | begin
|
6 | if (PWFail = '1') then |
7 | S_Register(0) <= '0'; |
8 | elsif rising_edge(CLOCK) then |
9 | Register(0) <= mEnable; |
10 | for i in 0 to 6 loop |
11 | Register(i+1) <= Register(i); |
12 | end loop; |
13 | end if; |
14 | end process Schiebe_PR; |
EDIT: Pech, zweiter. Aber einen hab ich noch ;-) Die Simulation deines Prozesses wird nicht korrekt funktionieren! Warum? Sieh dir mal die Sensitiv-Liste an, und was davon im Prozess verwendet wird...
1 | Schiebe_PR: process(CLOCK, mCounter) |
2 | begin
|
3 | if (PWFail = '1') then |
4 | :
|
5 | elsif rising_edge(CLOCK) then |
6 | :
|
Was wird der Prozess in der Simulation wohl tun, wenn PWFail sich ändert? Richtig: gar nichts. Der macht unbeeindruckt weiter... :-o
Hallo Gastn, hm, zuerst einmal frage ich mich was da funktioniert, das was Du machen willst, oder das was Du geschrieben hast und dann die zweite Frage: In Hardware oder in der Simulation? Hintergrund: Du beschreibst einen Prozess mit einem Asynchronen Reset ( IF vor rising_edge), das Resetsignal taucht aber in der Sensitivity Liste nicht auf. In der Simulation würdest Du jetzt ein unerwartetes Verhalten haben: Sprich der Reset würde nun nur bei steigender oder fallender Flanke etwas bewirken... dieses Verhalten ist in der Hardware NICHT möglich. Beim flüchtigen Blick über die Simulation fällt Dir das womöglich nicht einmal auf... ( ist in dem Fall wahrscheinlich zu verschmerzen, sollte aber deinen Blick schärfen...) In der Hardwarsesynthese der Herstellertools ( Xilinx, Altera ) wird das fehlende Signal stillschweigend der Sensitivityliste zugefügt und das Design läuft in der Hardware wie von Dir gewünscht ( nicht beschrieben )... Nun zu deiner eigentlichen Frage, Du kannst das generisch beschreiben: ...rising_edge(Clock) THEN Register <= Register(Register'high-1 DOWNTO 0) & mEnable; END IF; beschreibt das gleiche und du kannst mit einer einfachen Änderung des Vectors die Tiefe des Schieberegister ändern. Gruß Andreas
Herzlichen dank an euch beiden! stimmt...dann schreibe ich das so: signal mEnable : STD_LOGIC; signal Register : STD_LOGIC_VECTOR (7 downto 0); Schiebe_PR: process(PWFail , CLOCK, mCounter) begin if (PWFail = '1') then S_Register(0) <= '0'; elsif rising_edge(CLOCK) then Register(0) <= mEnable; for i in 0 to 6 loop Register(i+1) <= Register(i); end loop; end if; end process Schiebe_PR;
> wird das fehlende Signal stillschweigend der Sensitivityliste zugefügt
Bei Xilinx gibts zum Glück eine Info zu fehlenden Signalen...
... Sorry hatte vorhin einen Halbsatz vergessen: In der Simulation würdest Du jetzt ein unerwartetes Verhalten haben: Sprich der Reset würde nun nur bei steigender oder fallender Flanke von "CLOCK" etwas bewirken... dieses Verhalten ist in der Hardware NICHT möglich.
> ... dieses Verhalten ist in der Hardware NICHT möglich.
Kann kurz und schmerzlos zusammengefasst werden in dem Satz:
Der Synthese ist die Sensitiv-Liste eigentlich piepschnurzegal.
Die wird nur für die Simulation benötigt, dort ist sie elementar
wichtig, weil nur eine Änderung eines der Signale in del Liste die
Neuberechnung des Prozesses auslöst.
eine letzte sache interessiert mich noch. Wie gross darf den ein Register max. sein?
@Gastn (Gast) >Wie gross darf den ein Register max. sein? So gross wie du FlipFlops in deinem FPGA/CPLDs hast. MFG Falk
mit dem schieberegister komme ich nicht weiter. Ich wollte mit dem schieberegister das Signal mEnable verzögern. Aber ich brauche eine verzögerung von 316ms und das bei bei einem Takt von 33MHZ. Wie kann ich das am besten umsetzen? Wait anweisung kann ich ja nicht benutzen, weil diese nur für sim. zwecke da ist und nicht zum synte. Grüsse
> stimmt...dann schreibe ich das so: ...loop... Hallo, das war nur ein kleiner Witz :-o Schieberegister schreibt man immer mit dem Verkettungsoperator & > brauche eine verzögerung von 316ms und das bei bei einem Takt von 33MHZ. Dazu müsste dein Schieberegister 316ms/(1/33MHz)=10428000 Stufen haben. Das ist zu lang... :-o Wieviele Wechsel kann das Enable-Signal während der Delay-Zeit haben? Muß die Verzögerung genau 316ms sein, oder darf das ein wenig Jittern? Zeichne doch mal ein Timing Diagramm mit Toleranzen... > brauche eine verzögerung von 316ms ... verwechselt du m, µ und n?
Hallo Lother, der war trotzdem gut..loll >wieviele Wechsel kann das Enable-Signal während der Delay-Zeit haben? das signal wird einmal über ein zähler auf einsgesetzt und dann gehält er auch sein zustand. Und ab genau hier brauche ich 320"ms" pause. >Muß die Verzögerung genau 316ms sein, oder darf das ein wenig Jittern? ja, das darf der >Zeichne doch mal ein Timing Diagramm mit Toleranzen... versuche was aufzunehmen. Grüsse
> das signal wird einmal über ein zähler auf eins gesetzt und dann gehält > er auch sein zustand. Du brauchst sogar nur die positive Flanke verzögert? Also, dann wird der Ansatz mit einem Zähler am effizientesten sein. Der wird bei einem Flankenwechsel am Enable zurückgesetzt, und nach dessen Ablauf das Enable ausgegeben.
1 | signal cnt : integer range 0 to 10428000; |
2 | :
|
3 | :
|
4 | process (clk) begin |
5 | if until rising_edge(clk) then |
6 | if (enable='0') then |
7 | cnt <= 0; |
8 | enout <= '0'; |
9 | elsif (cnt<10428000) then |
10 | cnt <= cnt+1; |
11 | else
|
12 | enout <= '1'; |
13 | end if; |
14 | end if; |
15 | end process; |
Hallo Lothar, Ch 2 ist Enable signal was ich um min 72ms(sorry es sind keine 320ms...hatte mich verguckt) verzögern muss. Der hintergrund dafür ist, dass Ch4 erst nach später auf 3,3V(Versorgung) ist.
Hmmmm... Was sind denn das für Signale? CH2 ist irgendwie analog... das wird gar nicht richtig '1'. Fehlt da irgendwo ein Pullup?
>Fehlt da irgendwo ein Pullup?
nein... .
Ch 2 ist eine 3,3V versorgung für den Display.
Die spannung wird über ein transistor geschaltet.
Der display erkennt die unsaubere Versorgung und schaltet ab.
Deswegen muss ich jetzt eine verzögerung einbauen, was erst nach den
70ms den enable setzt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.