www.mikrocontroller.net

Forum: FPGA, VHDL & Co. schieberegister


Autor: Gastn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gastn schrieb:
> So funktioniert das auch. Nur ich würde das gerne anders schreiben.
Wie anders?
signal mEnable    : STD_LOGIC;
signal sRegister  : STD_LOGIC_VECTOR (7 downto 0);

Schiebe_PR: process(CLOCK, mCounter)
  begin
    if(PWFail = '1') then
       sRegister <= (others =>'0');
    elsif(rising_edge(CLOCK)) then
       sRegister <= sRegister(6 downto 0)&mEnable;
    end if;
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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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;
       for i in 0 to 6 loop
          Register(i+1)  <= Register(i);
       end loop;
    end if;
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...
Schiebe_PR: process(CLOCK, mCounter)
  begin
    if (PWFail = '1') then
      :
    elsif rising_edge(CLOCK) then 
      :
Was wird der Prozess in der Simulation wohl tun, wenn PWFail sich 
ändert?
Richtig: gar nichts. Der macht unbeeindruckt weiter... :-o

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gastn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gastn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen dank an alle!

Autor: Gastn (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gastn (Gast)

>Wie gross darf den ein Register max. sein?

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

MFG
Falk

Autor: Gastn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gastn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
  signal cnt : integer range 0 to 10428000;
  :
  :
  process (clk) begin
     if until rising_edge(clk) then
        if (enable='0') then 
           cnt   <= 0; 
           enout <= '0'; 
        elsif (cnt<10428000) then
           cnt <= cnt+1;
        else
           enout <= '1';
        end if;
     end if;
  end process;

Autor: Gastn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Gastn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.