Forum: FPGA, VHDL & Co. Fehler: Can't find control signal for.


von Andi Z. (duderino65)


Lesenswert?

Hallo,

mein Compiler meldet nun folgendes:
@W: CL113 
:"C:\isptools7_2_strt\work\ram_sw_1\ram_sw.vhd":61:4:61:5|Feedback mux 
created for signal WR_BIT_CNT[4:0].
@W: CL113 
:"C:\isptools7_2_strt\work\ram_sw_1\ram_sw.vhd":61:4:61:5|Feedback mux 
created for signal WR_ADR[4:0].
@W: CL113 
:"C:\isptools7_2_strt\work\ram_sw_1\ram_sw.vhd":75:4:75:5|Feedback mux 
created for signal RD_BIT_CNT[4:0].
@E: CL121 
:"C:\isptools7_2_strt\work\ram_sw_1\ram_sw.vhd":75:4:75:5|Can't find 
control signal for RD_BIT_CNT

hier der code ab zeile 75:
1
entity:
2
RD_CLK_IN   : in std_logic;
3
...
4
5
arch:
6
signal RD_ADR     : std_logic_vector(4 downto 0) := "11111";
7
signal RDCK_EN    : std_logic;
8
...
9
RD_ADDRESS : process (RDCK_EN, RD_CLK_IN, RST_IN)
10
      begin
11
        if RST_IN = '1' or (CNT_EN = '1' and (RDCK_EN'event and RDCK_EN = '0')) then
12
          RD_BIT_CNT <= 0;
13
          RD_ADR <= "11111";
14
          CNT_EN <= '0';  
15
      
16
        elsif RDCK_EN = '1' and CNT_EN = '0' then
17
          if RD_CLK_IN'event and RD_CLK_IN = '0' then
18
            RD_ADR <= RD_ADR - "1";
19
            RD_BIT_CNT <= RD_BIT_CNT + 1;
20
21
            if RD_BIT_CNT = 31 then
22
              CNT_EN <= '1';
23
            end if;              
24
          end if;        
25
        end if;
26
      end process;

Weiss jemand was ich da falsch gemacht habe?? ich verstehe die meldung 
des compilers irgenwie nicht ganz. zeile 75 is die 1. if-anweisung nach 
dem begin. ich möchte die daten schneller aus dem ram lesen als das 
RDCK_EN signal aktiv ist. das RDCK_EN signal ist mit dem WR- signal mit 
einem not() verbunden. das WR-signal schreibt 32 bits in den ram pro 
halbe periode. das auslesen soll schneller gehn. deshalb möchte ich 
nicht das der zähler nach den ausgelesenen bits weiterläuft und erst bei 
einem signalwechsel des RDCK_EN-signals zurück gesetzt wird.

ich hoffe ich habe es nicht zu unklar formuliert :-D

MfG

Andi

von Michael O. (mischu)


Lesenswert?

Das sieht alles sehr merkwürdig aus.
Im prinzip hast du einen Process gebaut, der von 2 Clocksignalen abhängt 
und zusätzlich beide Clocksignale gegated werden. Sehr unschön!!

Versuch das Teil mal umzubauen, dass du mit der unten abgebildeten 
Struktur klar kommst. Bei Reset sind allen asynchronen Bedingungen zum 
Zurücksetzen beschrieben (kein "'event" verwenden!!) und danach kommt 
erst die Clock mit allen Abfragen/Zuweisungen.

process (clock, reset)
begin
  if(reset = true) then ....
  elsif(rising_edge(clock)) then

  endif;
end process;

von Schrotty (Gast)


Lesenswert?

RD_BIT_CNT ist ein speicherndes Element (Register), welches mit RST_In 
zurückgesetzt wird und ebenso bei einer Taktflanke an RDCK_EN 
zurückgesetzt wird.
Der die Übernahme von den Eingängen des Registers erfolgt gesteuert 
durch Flanken an RD_CLK_IN
Das heisst, das Register müsste auf zwei verschiedene Takte reagieren 
und müsste somit zwei Takteingänge haben.
Und sowas gibt´s einfach nicht.

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


Lesenswert?

1
  if RST_IN = '1' or (CNT_EN = '1' and (RDCK_EN'event and RDCK_EN = '0')) then
2
  :
3
  elsif RDCK_EN = '1' and CNT_EN = '0' then
4
  :
Extreme-VHDL...
Das hast du selber erdacht, stimmts?

Sieh dir mal "übliche" funktionsfähige VHDL-Beschreibungen an, und 
kontrollier die insbesondere auf den Takt. Kannst du deinen 
Beschreibungsstil wiederfinden? Nein?

In dem Reset-Zweig ist Kombinatorik (und zudem ein Takt), das ist sehr 
sehr bedenklich...

Und danach kommt kein Takt, sondern schlichte Kombinatorik...

Das hier ist sind gleich zwei Kombinatorische Schleifen:
1
  :
2
  elsif RDCK_EN = '1' and CNT_EN = '0' then
3
     RD_ADR <= RD_ADR - "1";
4
     RD_BIT_CNT <= RD_BIT_CNT + 1;
5
     :
6
  end if;
7
  :
Solange RDCK_EN = '1' und CNT_EN = '0' zählt RD_ADR Vollgas runter und 
RD_BIT_CNT Vollgas hoch.
Weil deine Sensitivliste diese beiden Signale nicht enthält, ist die 
Simulation falsch. Dort mehr zum Thema: 
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife

EDIT: vergiss die Kombinatorische Schleife, da war ja nochmal ein Takt 
versteckt...
1
     if RD_CLK_IN'event and RD_CLK_IN = '0' then

Das beste wäre an dieser Stelle ein Buch:
Reichardt&Schwarz, VHDL-Synthese

von Schrotty (Gast)


Lesenswert?

>Und danach kommt kein Takt, sondern schlichte Kombinatorik...
Nicht ganz, so ein Takt-Konstrukt kommt schon noch:
1
if RD_CLK_IN'event and RD_CLK_IN = '0' then

Aber das ist natürlich trotzdem nicht synthetisierbar

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


Lesenswert?

Schrotty schrieb:
>>Und danach kommt kein Takt, sondern schlichte Kombinatorik...
> Nicht ganz, so ein Takt-Konstrukt kommt schon noch:
> :
Jaja, gut versteckt ist halb verloren  :-/

Hatte ich dann auch noch bemerkt und im EDIT festgehalten  ;-)

von Schrotty (Gast)


Lesenswert?

Ich hab´s auch erst beim zweiten Lesen bemerkt :-)
Witzig, oder? wie man was überliest, was man gar nicht mehr sehen will.

Und ich hab wohl offensichtlich zu schnell reagiert und deinen EDIT 
nicht mehr bemerkt.

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.