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
signalmEnable:STD_LOGIC;
2
signalsRegister:STD_LOGIC_VECTOR(7downto0);
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(6downto0)&mEnable;
10
endif;
11
endprocessSchiebe_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
signalmEnable:STD_LOGIC;
2
signalRegister:STD_LOGIC_VECTOR(7downto0);
3
4
Schiebe_PR:process(CLOCK,mCounter)
5
begin
6
if(PWFail='1')then
7
S_Register(0)<='0';
8
elsifrising_edge(CLOCK)then
9
Register(0)<=mEnable;
10
foriin0to6loop
11
Register(i+1)<=Register(i);
12
endloop;
13
endif;
14
endprocessSchiebe_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
elsifrising_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;
...
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.
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.
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.
>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.