Forum: FPGA, VHDL & Co. process sensitivity list


von test_1 (Gast)


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;

von Andreas B. (andreas_b77)


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.

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


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...

von test_1 (Gast)


Lesenswert?

Danke für die Hilfe, keine Ahnung wie ich das übersehen konnte mit der 
zu Weisung im Process ihr habt natürlich recht.(auch Xilinx)

lg Michael

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.