Forum: FPGA, VHDL & Co. Pseudozufallsgenerator 4-bit


von Hermann S. (hermann1985)


Lesenswert?

Moin ich hab da mal ein programm für ein 4-bit Pseudozufallsgenerator 
geschrieben.

entity PSEUDO_4BIT is
 port(CLK, RESET : in bit;
       Q : out bit_vector(3 downto 0)
       );
end PSEUDO_4BIT;

architecture VERHALTEN of PSEUDO_4BIT is
signal QINT: bit_vector(3 downto 0);
singal SERIAL_IN : bit;

begin
P1: process(CLK, RESET)
begin
 if RESET ='1' then
 QINT <= "0001" after 5ns;
 elsif CLK = '1' and CLK'event then
  if QINT = "0000" then
     QINT = "0001" after 5ns;
  else
     QINT <= (QINT(2 downto 0) & SERIAL_IN) after 5ns;
  end if;
end process P1;

-- 4-Bit Rückkopplungsschaltnetz
SERIAL_IN <= QINT(3) xor QINT(2) after 5ns;
Q <= QINT;
end VERHALTEN;

und jetzt meine frage:
Ich soll zu leichten ablesen der Periodendauer ein binärzähler 
realisieren, der diese misst und ausgibt. Der Zähler soll sich 
selbstständig initialsieren, sobalt sich eine Periode wiederholt: 
"Einschwingvorgänge" können unberücksichtigt bleiben.

wie kann ich den binärzähler in mein programm einbauen.

vielen dank für eure hilfe.

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


Lesenswert?

Hermann Scholz schrieb:
> Der Zähler soll sich
> selbstständig initialsieren, sobalt sich eine Periode wiederholt:
> "Einschwingvorgänge" können unberücksichtigt bleiben.
gehen wir mal davon aus, dass du ein gutes Polynom gewählt hast und alle 
15 Zustände auftauchen. Dann gibt es keinerlei "Einschwingvorgänge", 
denn aus jedem aktuellen Wert wird einfach der nächste Wert berechnet.

Und aus diesem Grund mußt du auch nur die Anzahl Takte zwischen 2 "1111" 
mitzählen. Fertig. Bei einem brauchbaren Polynom wird diese 
Wiederholdauer genau 15 Takte sein. Was sonst?

Spannender und wesentlich aufwendiger wäre schon, zu kontrollieren, ob 
alle Zustände im Polynom auftreten. Aber auch hier ist es einfach: nimm 
den aktuellen Wert und zähle die Takte, bis dieser Wert wieder kommt. 
Der Zählerstand muß dann genau 15 sein, sonst hast du bis zur 
Wiederholung nicht alle Zustände durchlaufen...

von Hermann S. (hermann1985)


Lesenswert?

Danke für die schnelle antwort.
Ich weiß nicht wie ich das umsetzte in VHDL.
Also die anzahl der takte zwischen zwei "1111" mitzählen.

von Duke Scarring (Gast)


Lesenswert?

Hermann Scholz schrieb:
> Also die anzahl der takte zwischen zwei "1111" mitzählen.

Ich würde dafür eine State-Machine nehmen:
1
IDLE
2
  wenn signal = "1111" -> COUNT
3
4
COUNT
5
  zählen
6
  wenn signal = "1111" -> READY
7
8
READY
9
  Zählerstand ausgeben
10
  -> IDLE

Duke

P.S.: Und alles schön simulieren (vorher!)...

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


Lesenswert?

Ich würde das ein wenig simpler machen:
1
signal distance : integer;
2
:
3
   process 
4
      variable c : integer := 0;
5
   begin
6
      wait until rising_edge(clk);
7
      if (QINT = "1111") then
8
         distance <= c;
9
         c := 0;
10
      else
11
         c := c+1;
12
      end if;
13
   end process;

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.