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


von daniel (Gast)


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?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.numeric_std.all;
4
5
entity counter is
6
  port(clk: in std_logic;
7
  cnt: in std_logic;
8
  rst: in std_logic;
9
  val: out unsigned(3 downto 0));
10
end counter;
11
12
architecture impl1 of counter is
13
  signal tmp: unsigned(val'range);
14
begin
15
  process(clk, clk)
16
    variable lock: bit;
17
  begin
18
    if rst = '1' then
19
      tmp <= "0000";
20
    end if;
21
    if clk = '1' and clk'event then
22
      if cnt = '0' then
23
        lock := '0';
24
      else
25
        if lock = '0' then
26
          lock := '1';
27
        end if;
28
        tmp <= tmp + 1;
29
      end if;
30
    end if;
31
  end process;
32
  val <= tmp;
33
end impl1;

von Volker (Gast)


Lesenswert?

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

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

von daniel (Gast)


Lesenswert?

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

von Mike (Gast)


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.

von daniel (Gast)


Lesenswert?

1
    if rst = '1' then
2
      tmp <= "0000";
3
    elsif clk = '1' and clk'event then --<<--
4
      if cnt = '0' then
5
        lock := '0';
6
      else
7
        if lock = '0' then
8
          lock := '1';
9
        end if;
10
        tmp <= tmp + 1;
11
      end if;
12
    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?

von Mike (Gast)


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.

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


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:
1
    if rst = '1' then
2
        :
3
    end if;
4
    if clk = '1' and clk'event then
5
       :
6
    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:
1
    if clk = '1' and clk'event then 
2
      :
3
    elsif rst = '1' then     
4
      :
5
    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:
1
  process(clk, clk)
2
    variable lock: bit;
3
  begin
4
    if clk = '1' and clk'event then  ---< Takt
5
      if cnt = '0' then
6
        lock := '0';
7
      else
8
        if lock = '0' then
9
          lock := '1';
10
        end if;
11
        tmp <= tmp + 1;
12
      end if;
13
    end if;
14
    if rst = '1' then                ---< Reset hat Priorität
15
      tmp <= "0000";
16
    end if;
17
  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.

von Nephilim (Gast)


Lesenswert?

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

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.