Forum: FPGA, VHDL & Co. Fehler bei Zahlenvergleich in VHDL


von Chris (Gast)


Lesenswert?

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;

...

von Duke Scarring (Gast)


Lesenswert?

Hast Du eine Testbench zum Simulieren dazu?

Duke

von Chris (Gast)


Angehängte Dateien:

Lesenswert?

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

von bko (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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ß :-)

von D. I. (Gast)


Lesenswert?

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

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


Lesenswert?

> 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

von Chris (Gast)


Lesenswert?

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