mikrocontroller.net

Forum: FPGA, VHDL & Co. counter implementierung, RTL Viewer zeigt nichts an


Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

unten ist meine Counter Implementierung.
Syntax Check ist erfolgreich, aber wenn ich mir anschauen will
was xst daraus synthetiesiert hat, dann zeigt mir RTL Viewer
nur die Ein/Ausgänge der Entity. Was mache ich in meinem Design falsch?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity counter is
  port(clk: in std_logic;
  cnt: in std_logic;
  rst: in std_logic;
  val: out unsigned(3 downto 0));
end counter;

architecture impl1 of counter is
  signal tmp: unsigned(val'range);
begin
  process(clk, clk)
    variable lock: bit;
  begin
    if rst = '1' then
      tmp <= "0000";
    end if;
    if clk = '1' and clk'event then
      if cnt = '0' then
        lock := '0';
      else
        if lock = '0' then
          lock := '1';
        end if;
        tmp <= tmp + 1;
      end if;
    end if;
  end process;
  val <= tmp;
end impl1;

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>dann zeigt mir RTL Viewer nur die Ein/Ausgänge der Entity.

Auf dieses Symbol schon mal einen Doppelklick mit dem Mauszeiger 
gemacht?

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, es wird eben nur eine horizontale Linie angezeigt => keine
Register, Addierer oder ähnliches

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setzte mal rst in die Sensitivity-List rein.

Eventuell verwirrst du die Software auch mit dem asynchronem Reset. 
Versuche den mal mit if ... then ... else einzubauen.

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    if rst = '1' then
      tmp <= "0000";
    elsif clk = '1' and clk'event then --<<--
      if cnt = '0' then
        lock := '0';
      else
        if lock = '0' then
          lock := '1';
        end if;
        tmp <= tmp + 1;
      end if;
    end if;


das richtige scheint dieses template zu sein
die Änderung ist in der << Zeile.

Kann es sein, dass ISE Probleme hat unsigned durch die
Synthese zu ziehen?

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur ein Teil der Dinge die du in VHDL beschreiben kannst ist auch in 
Hardware umsetzbar. Eigentlich sollte ISE dann aber auch eine Warnung 
ausgeben...

In der Anleitung gibt es ggf. ein paar Hinweise was geht.

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

Bewertung
0 lesenswert
nicht lesenswert
> Syntax Check ist erfolgreich...
Das bedeutet nur, dass du keine groben Tippfehler im Design hast.

Deine Beschreibung ist wirklich in keinem Lehrbuch zu finden:
    if rst = '1' then
        :
    end if;
    if clk = '1' and clk'event then
       :
    end if;
Aber man kann gar nicht alle Fehler selber machen. Und diese 
Beschreibung eines synchronen Prozesses wäre mir nie in den Sinn 
gekommen. Denn durch diese zwei unabhängigen if-Bedingungen wird die 
Reset-Logik komplett invertiert. Hier steht quasi:
    if clk = '1' and clk'event then 
      :
    elsif rst = '1' then     
      :
    end if;
Und das es hier den Synthesizer raushagelt ist klar, denn der rechnet 
niemals mit einer Beschreibung, in der ein Takt Vorrang vor einer 
Reset-Bedingung hat. Mir will auch partout kein Bauteil einfallen, mit 
dem sowas realisierbar wäre. Die Syntax ist ok und simulieren lässt sich 
sowas schon.

Ich erhalte in beiden Fällen den selben Fehler (mit ISE 8.2):
> Analyzing Entity <counter> in library <work> (Architecture <impl1>).
> ERROR:Xst:827 - "D:/FPGA_Projects/irrercounter/irrcnt.vhd" line 15:
> Signal tmp cannot be synthesized, bad synchronous description.

Am ehesten könntest du noch schreiben:
  process(clk, clk)
    variable lock: bit;
  begin
    if clk = '1' and clk'event then  ---< Takt
      if cnt = '0' then
        lock := '0';
      else
        if lock = '0' then
          lock := '1';
        end if;
        tmp <= tmp + 1;
      end if;
    end if;
    if rst = '1' then                ---< Reset hat Priorität
      tmp <= "0000";
    end if;
  end process;
denn dann hat der Reset wieder Priorität gegen den Takt und das Ganze 
ist synthetisierbar ;-)

BTW: statt
>> clk = '1' and clk'event
schreibt man schöner
>> rising_edge(clk)
denn damit werden auch andere Ausgangsbedingungen abgefragt.

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach und der form halber würde ich sagen, ein "clk" in der 
sensitivitätsliste reicht eigentlich auch aus

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.