counter implementierung, RTL Viewer zeigt nichts an

Gast #1033556
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;
Gast #1033832
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?
Moderator (Firma: Titel) Persönliche Seite #1033896
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren