process sensitivity list

Gast #2281313
Lesenswert?

Hallo

bei folgendem Syncron zähler wirft mir xilinx ise webpack 13.1 eine 
Fehlermeldungen das ein Signal dem nur ein Wert in einem Takt sync. 
Prozess zugewiesen wird in der Sensitivityliste Fehlt. Frage woran liegt 
das? ich meine müsste für den Prozess der Takt sync. ist ja schnuppe 
sein oder?
1
WARNING:Xst:819 - "C:/Projekte/VHDL/B5X/BX55/BX55.vhd" line 44: One or more signals are missing in the process sensitivity list. To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals are present in the sensitivity list. Please note that the result of the synthesis may differ from the initial design specification. The missing signals are:
2
   <temp_count>

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_unsigned.all;entity BX55 is
4

5
port( CLK, RESET: in bit;
6
      INC: in bit_vector(1 downto 0);
7
      DOUT: out std_logic_vector(3 downto 0));
8
end BX55;
9

10
architecture rtl of BX55 is
11

12
  signal temp_count: std_logic_vector(3 downto 0);
13
begin
14

15
count: process(CLK)
16
begin
17

18
  if CLK'event and CLK = '1' then
19
    if RESET = '1' then
20
      temp_count <= (others => '0');
21
    elsif INC = "00" then
22
      temp_count <= temp_count +1;
23
    elsif INC = "01" then
24
      temp_count <= temp_count +2;
25
    elsif INC = "10" then
26
      temp_count <= temp_count +3;
27
    else temp_count <= temp_count +4;
28
    end if;
29
  end if;
30

31
  DOUT <= temp_count;
32

33
end process count;
34

35
end rtl;
#2281330
Lesenswert?

Die Zuweisung an DOUT ist außerhalb des if-Blocks und damit nicht nur 
bei CLK'event aktiv, also muss es in die Sensitivity-Liste.

Das ist aber wohl nicht beabsichtigt. Entweder die Zuweisung in das if 
CLK'event mit rein nehmen, aber dann kommt der neue Wert mit einem Takt 
Verzögerung raus (1. Takt: Zuweisung an temp_count, 2. Takt: Zuweisung 
von temp_count an DOUT).

Oder aber die Zuweisung an DOUT außerhalb des process machen. Das 
entspricht einem ungetakteten Verbinden von temp_count mit DOUT, was 
wohl die Absicht ist, vermute ich.
Moderator (Firma: Titel) Persönliche Seite #2281357
Lesenswert?

test_1 schrieb:
> ich meine müsste für den Prozess der Takt sync. ist ja schnuppe
> sein oder?
Der Synthese ist die Sensitivliste sowieso weitestgehend egal. Du 
bekommst bei einer unvollständigen Liste einfach eine freundliche 
Meldung. In der Simulation (und nur dort!!!) wird dein Counter aber dann 
einen halben (!) Takt "verspätet" kommen. Denn bei jedem Wechsel auf der 
Taktleitung wird der Prozess neu berechnet (weil er ja auf CLK sensitiv 
ist). Bei der steigenden Flanke wird an temp_count der neu berechnete 
Wert zugewiesen, an DOUT aber noch der "alte" Wert von temp_count. Du 
könntest diesen Prozess also mit exakt selber Funktion auch so 
schreiben:
1
count: process(CLK)
2
begin
3

4
  DOUT <= temp_count; -- völlig schnuppe, ob das hier steht, ...... 
5

6
  if CLK'event and CLK = '1' then
7
    if RESET = '1' then
8
      temp_count <= (others => '0');
9
    elsif INC = "00" then
10
      temp_count <= temp_count +1;
11
    elsif INC = "01" then
12
      temp_count <= temp_count +2;
13
    elsif INC = "10" then
14
      temp_count <= temp_count +3;
15
    else temp_count <= temp_count +4;
16
    end if;
17
  end if;
18

19
  DOUT <= temp_count; -- ......oder hier!!!
20

21
end process count;
Und bei der nächsten fallenden Flanke wird der Prozess dann in der 
Simulation neu berechnet, und voila: DOUT bekommt den "neuen" 
Zählerwert.

FAZIT: eine falsche Sensitvliste führt zu Unstimmigkeiten zwischen 
Simulation und Realität!

Andreas B. schrieb:
> Oder aber die Zuweisung an DOUT außerhalb des process machen. Das
> entspricht einem ungetakteten Verbinden von temp_count mit DOUT
In der VHDL Termiiniologie nennt sich das concurrent assignment (zu 
deutsch: nebenläufige Zuweisung, wbobei hier "nebenläufig" nicht als 
"minderwertig, nachrangig" missverstanden werden sollte). Wahrscheinlich 
sollte es so aussehen:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_unsigned.all;entity BX55 is
4

5
port( CLK, RESET: in bit;
6
      INC: in bit_vector(1 downto 0);
7
      DOUT: out std_logic_vector(3 downto 0));
8
end BX55;
9

10
architecture rtl of BX55 is
11
signal temp_count: std_logic_vector(3 downto 0);
12
begin
13

14
count: process(CLK)
15
begin
16
  if CLK'event and CLK = '1' then
17
    if RESET = '1' then
18
      temp_count <= (others => '0');
19
    elsif INC = "00" then
20
      temp_count <= temp_count +1;
21
    elsif INC = "01" then
22
      temp_count <= temp_count +2;
23
    elsif INC = "10" then
24
      temp_count <= temp_count +3;
25
    else temp_count <= temp_count +4;
26
    end if;
27
  end if;
28
end process count;
29

30
DOUT <= temp_count;   -- ohne Prozess: concurrent assignment
31

32
end rtl;

BTW: der Name temp-count ist ungünstig gewählt, weil an diesem signal 
überhaupt nichts temporär ist. Vielmehr ist genau dieses Signal dein 
Zähler, der dann nur noch mit dem Ausgang verbunden wird.

test_1 schrieb:
> [\vhdl]
Ein / statt eines \ wirkt hier Wunder...

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