Forum: FPGA, VHDL & Co. schieberegister


von Gastn (Gast)


Lesenswert?

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;

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Andreas (Gast)


Lesenswert?

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

von Gastn (Gast)


Lesenswert?

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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> wird das fehlende Signal stillschweigend der Sensitivityliste zugefügt
Bei Xilinx gibts zum Glück eine Info zu fehlenden Signalen...

von Andreas (Gast)


Lesenswert?

...

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Gastn (Gast)


Lesenswert?

Herzlichen dank an alle!

von Gastn (Gast)


Lesenswert?

eine letzte sache interessiert mich noch.
Wie gross darf den ein Register max. sein?

von Falk B. (falk)


Lesenswert?

@Gastn (Gast)

>Wie gross darf den ein Register max. sein?

So gross wie du FlipFlops in deinem FPGA/CPLDs hast.

MFG
Falk

von Gastn (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Gastn (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Gastn (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hmmmm...
Was sind denn das für Signale?
CH2 ist irgendwie analog... das wird gar nicht richtig '1'.
Fehlt da irgendwo ein Pullup?

von Gastn (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.