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.
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...
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.
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!)...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.