Hallo, habe folgendes Problem. Ich lese den Register-Wert tx_regRead ein (der sich bei jedem Programmdurchlauf ändert). Wenn dieser vollständig eingelesen ist, bei index = 16, konvertiere ich diesen in einen Integer und will schauen ob sein Wert der dez. Zahl 110*10**3 entspricht. Wenn ja soll der Wert tx_regRead bleiben, -> für weitere Bearbeitung (egal). Wenn nein, dann soll ein konstanter Bitstring constTxData in einen Integer konvertiert werden bei jedem Durchlauf dekrementiert werden, also constTxData -1, constTxData-2, constTxData-3 usw...und das solange bis der Wert counts_n = 110K entspricht. Anschließend (wenn counts_n = 110K) soll der newIF_reg Wert wieder in einen Bitvector revIF_reg konvertiert werden. Ich bin mir nicht ganz sicher ob das da so stimmt wie ich es realisiert habe. Zudem bekomme ich immer Warnings "Iteration limit falure". Danke für die Hilfe. Hier mein Programmausschnitt: ... signal IF_reg : integer:=0; signal newIF_reg : integer:=0; signal counts_n : integer:=0; signal revIF_reg std_ulogic_vector; signal constTxData ist ein Bitstring aus einem Array signal tx_regRead std_ulogic_vector; ... counts_n <= (TO_INTEGER(unsigned(tx_regRead)))when (index = 16)else 0; process (counts_n, newIF_reg, reset) begin if (reset = '0') then IF_reg <= 0; newIF_reg <= 0; else newIF_reg <= TO_INTEGER(unsigned(constTxData(4)(10 downto 0))); if (counts_n = 11*10**3) then else if(counts_n /= 11*10**3)then newIF_reg <= newIF_reg - 1; end if; end if; end if; revIF_reg <= "00110" & To_StdULogicVector(std_logic_vector(to_unsigned(newIF_reg, 11))); end process; ...
Hallo, ok hier mein ganzes Programm(meine Diplomarbeit). Soll quasi eine Ansteuerung des TEA 5880 FM Tuner in VHDL sein. Danke für die Hilfe. Codeausschnitt findet man unter DataShift reg... Chris
Bei welchem Tool genau bekommst du die Warnung "Iteration limit falure" ? Ich vermute mal bei der Simulation mit Modelsim oder ISE-sim. Ich denke du hast eine kombinatorische Schleife, denn deine Prozess Sensitivity List sieht so aus: >process (counts_n, newIF_reg, reset) Und im Prozess wird dann dem Signal "newIF_reg" ein Wert zugewiesen: > if(counts_n /= 11*10**3)then > > newIF_reg <= newIF_reg - 1; > > end if; Das heißt: der Prozess wird aktiviert wenn sich "newIF_reg" ändert wird der Prozess aufgerufen, dann wird aber sofort im Prozess diesem Signal ein neuer Wert zugewiesen, was wiederum den Prozess aktiviert, usw ... Ich denke da fehlt ein Takt in der Prozess Sensitivity List und die anderen Signal (außer der Reset) müssen aus der Sensitivity List entfernt werden. Siehe dir doch mal diese Seiten an: http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife bko
Hallo, vielen Dank für die Antwort. Ja, ich simuliere mit ModelSim. Das Stimmt wohl mit der kombinatorischen Schleife. Ich könnte auch das ganze als nebenläufige Anweisung gestalten, dann fällt die komb. Schleife weg. Das probier ich jetzt mal, zur Not versuche ich halt den Takt mit einzubinden. Danke für den Anstoß :-)
Chris schrieb: > Hallo, > > vielen Dank für die Antwort. Ja, ich simuliere mit ModelSim. > Das Stimmt wohl mit der kombinatorischen Schleife. Ich könnte auch das > ganze als nebenläufige Anweisung gestalten, dann fällt die komb. > Schleife weg. > Das probier ich jetzt mal, zur Not versuche ich halt den Takt mit > einzubinden. Danke für den Anstoß :-) Ohne Takt wird das immer eine kombinatorische Schleife sein egal wie du die hinschreibst
> Ich denke da fehlt ein Takt in der Prozess Sensitivity List > und die anderen Signal (außer der Reset) müssen aus der > Sensitivity List entfernt werden. Und mit einer falschen Sensitivliste ist auch die Simulation sinnlos und unbrauchbar. Chris schrieb: > Das Stimmt wohl mit der kombinatorischen Schleife. Wohl wahr :-o Sobald du in einem kombinatorischen Prozess zählst, hast du so eine Schleife.
1 | process (counts_n, newIF_reg, reset) |
2 | |
3 | begin
|
4 | if (reset = '0') then |
5 | IF_reg <= 0; |
6 | newIF_reg <= 0; |
7 | cnt <= 0; |
8 | else
|
9 | :
|
10 | newIF_reg <= newIF_reg - 1; |
11 | :
|
12 | -- cnt <= cnt + 1;
|
13 | end if; |
14 | end process; |
Zudem baust du hier mit deinem Reset (vermutlich ungewollt) einen ganzen Stall voll Latches. Sowas wie das hier:
1 | process (clk, reset) |
2 | begin -- process |
3 | if (reset = '0') then -- asynchronous reset (active low) |
4 | :
|
5 | else
|
6 | if (clk'event and clk = '1') then -- falling clock edge ***** Häh? |
7 | :
|
8 | end if; |
9 | end if; |
10 | end process; |
könnte zur Verwirrung fühern, wenn du einfach an der falschen Stelle mal was dazufügst und meinst, das wäre getaktet:
1 | process (clk, reset) |
2 | begin -- process |
3 | if (reset = '0') then -- asynchronous reset (active low) |
4 | :
|
5 | else
|
6 | if (clk'event and clk = '1') then -- falling clock edge ***** Häh? |
7 | :
|
8 | end if; |
9 | counter <= counter+1; -- ***** Hoppla |
10 | end if; |
11 | end process; |
Und das beste: du wirst das in der Simulation nicht mal merken... :-o Ein Tipp: machs so wie alle anderen auch.
1 | process (clk, reset) |
2 | begin -- process |
3 | if (reset = '0') then -- asynchronous reset (active low) |
4 | :
|
5 | elsif (clk'event and clk = '1') then -- falling clock edge ***** Häh? |
6 | :
|
7 | counter <= counter+1; -- ***** Das klappt wie erwartet |
8 | end if; |
9 | end process; |
BTW: VDHL-Dateien heißen nicht *.txt
Hallo, ok, super Danke für die Antwort...versuche es so. Chris
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.