mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

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

...

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du eine Testbench zum Simulieren dazu?

Duke

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

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

Autor: bko (Gast)
Datum:

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

bko

Autor: Chris (Gast)
Datum:

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

Autor: D. I. (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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.
  process (counts_n, newIF_reg, reset)

  begin
    if (reset = '0') then
      IF_reg    <= 0;
      newIF_reg <= 0;
      cnt       <= 0;
    else
      :
            newIF_reg <= newIF_reg - 1;
      :
        --  cnt       <= cnt + 1;
    end if;
  end process;
Zudem baust du hier mit deinem Reset (vermutlich ungewollt) einen ganzen 
Stall voll Latches.

Sowas wie das hier:
  process (clk, reset)
  begin  -- process
    if (reset = '0') then               -- asynchronous reset (active low)
    :
    else
      if (clk'event and clk = '1') then  -- falling clock edge ***** Häh?
      :
      end if;
    end if;
  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:
  process (clk, reset)
  begin  -- process
    if (reset = '0') then               -- asynchronous reset (active low)
    :
    else
      if (clk'event and clk = '1') then  -- falling clock edge ***** Häh?
      :
      end if;
      counter <= counter+1; -- ***** Hoppla
    end if;
  end process;
Und das beste: du wirst das in der Simulation nicht mal merken... :-o
Ein Tipp: machs so wie alle anderen auch.
  process (clk, reset)
  begin  -- process
    if (reset = '0') then               -- asynchronous reset (active low)
    :
    elsif (clk'event and clk = '1') then  -- falling clock edge ***** Häh?
      :
      counter <= counter+1; -- ***** Das klappt wie erwartet
    end if;
  end process;


BTW: VDHL-Dateien heißen nicht *.txt

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ok, super Danke für die Antwort...versuche es so.

Chris

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.