Forum: FPGA, VHDL & Co. VHDL Wieso wird bei diesem Code der Ausgang nie geändert?


von Peter F. (peterfes)


Lesenswert?

Hallo,

ich bin VHDL Neuling. bei dem folgenden Code habe ich das Problem, dass 
die If Anweisungen bei Vergleich mit Filterwith nie aufgerufen werden 
und somit der Ausgang nicht geändert wird. Warum?
1
entity MyUART is
2
    Port ( Input : in  STD_LOGIC;
3
           Output : out  STD_LOGIC;
4
           Filterwith : in  STD_LOGIC_VECTOR (15 downto 0);
5
        htest : out STD_LOGIC_VECTOR (15 downto 0);
6
        ltest : out STD_LOGIC_VECTOR (15 downto 0);
7
        xtest : out STD_LOGIC_VECTOR (15 downto 0);
8
        ytest : out STD_LOGIC_VECTOR (15 downto 0);
9
           CLK : in  STD_LOGIC);
10
end MyUART;
11
12
architecture Behavioral of MyUART is
13
signal Lowcount  : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
14
signal Highcount : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
15
signal x : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
16
signal y : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
17
18
signal Out_signal : STD_LOGIC := '0'; 
19
begin
20
process (CLK)
21
begin
22
  if CLK ='1' and CLK'event then
23
    if Input = '1' then
24
       if (Highcount < Filterwith) then
25
        Highcount <= Highcount + 1;
26
        Lowcount <= x"0000";
27
        if (Highcount = Filterwith) then 
28
          Out_signal <= '1';
29
          x <= x"FFFF";
30
        end if;
31
      end if;
32
    else
33
      if (Lowcount < Filterwith) then
34
        Lowcount <= Lowcount + 1;
35
        Highcount <= x"0000";
36
        if (Lowcount = Filterwith) then 
37
          Out_signal <= '0';
38
          y <= x"FFFF";
39
        end if;
40
      end if;
41
    end if;
42
  end if;
43
end process;
44
Output <= Out_signal;
45
htest <= Highcount;
46
ltest <= Lowcount;
47
xtest <= x;
48
ytest <= y;
49
end Behavioral;

von Rick (Gast)


Lesenswert?

1
if (Highcount < Filterwith) then
2
        Highcount <= Highcount + 1;
3
        Lowcount <= x"0000";
4
        if (Highcount = Filterwith) then

die Highcount <= Highcount + 1 Zuweisung wird erst im nächsten Takt 
aktiv (siehe Definition von Signalen vs. Variablen), daher kann niemals 
Highcount < Filterwith und Highcount = Filterwith gleichzeitig erfüllt 
sein.

Dasselbe gilt natürlich auch für Lowcount

von Volker (Gast)


Lesenswert?

>If Anweisungen bei Vergleich mit Filterwith nie aufgerufen werden
>und somit der Ausgang nicht geändert wird. Warum?

Wie stellst du fest, dass der Ausgang sich nicht ändert?
Was erwartest du und was passiert real?

von Volker (Gast)


Lesenswert?

Na gut, Rick hats ja nun schon aufgezeigt, aber noch nen Tip.

Grundsätzlich sollte man alle Eingangssignale mindestens über 2 FF mit 
dem
Haupttakt synchronisieren, dies gilt hier ganz speziell für Filterwith.

Falls sich Filterwith nämlich genau dann ändert, wenn es abgetastet 
wird, wird es zu Problemen kommen.

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


Lesenswert?

Volker wrote:
> Grundsätzlich sollte man alle Eingangssignale mindestens über 2 FF mit
> dem Haupttakt synchronisieren, dies gilt hier für Filterwith.
> Falls sich Filterwith nämlich genau dann ändert, wenn es abgetastet
> wird, wird es zu Problemen kommen.
Ich denke, dass Filterwidth nicht davon betroffen ist, wenn es sich 
nicht zufällig ändern kann. Wenn der Wert beim Power-Up oder durch 
irgendeine Konfiguration gesetzt wird, ist es ein Quasi-Statisches 
Signal, daraus wird i.A. ein False-Path, der bei den Timing Constraints 
nicht beachtet werden muß.

Natürlich muß dafür irgendein Mechanismus sicherstellen, dass während 
der Filter-Berechnng dieser Wert nicht geändert wird. Aber für die 
Funktion des Systems hilft hier eine Eintaktung nicht, denn was würde 
(trotz Synchronisierung) passieren, wenn sich Filterwidth z.B. von 10000 
auf 100 ändert, wenn Highcount/Lowcount gerade 1000 ist?
Richtig: der Gleich-Fall wird erst nach einem Wrap-Around des Zählers 
erreicht.

Fazit: Eintakten ist wichtig auf der Registerebene. Auf der 
Systemebene/Verhaltensebene greifen andere Mechanismen.

von Peter F. (peterfes)


Lesenswert?

Hallo,

@Rick Danke für Deine Antwort, stimmt daran habe ich nicht gedacht das, 
die Signale natürlich immer nur am Ende des Prozess erneuert werden, 
Danke

Aber wie das mit dem synchronisieren der Eingänge mit 2FF des 
Haupttaktes gemeint ist habe ich noch nicht verstanden?

Gruss Peter

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


Lesenswert?

>> Grundsätzlich sollte man alle Eingangssignale mindestens über 2 FF
>> mit dem Haupttakt synchronisieren...
> Aber wie das mit dem synchronisieren der Eingänge mit 2FF des
> Haupttaktes gemeint ist habe ich noch nicht verstanden?
Such mal (z.B. auch hier im Forum) nach den Stichwörtern:
Eintakten, Einsynchronisieren, Metastabilität,
Takt-Domänen, Asynchone Eingänge
und/oder den englischen Entsprechungen
clock in, synchronize, meta stability,
clock domains, asynchronous input signals

Fakt ist :
Zum Wechsel der Taktdomäne eines Signals sind 2 FFs nötig. (Das musste 
übrigens auch Atmel nach der ersten Charge AVR-Controller bitter 
erfahren.)

Ein FPGA-Design hat üblicherweise mindestens 2 Taktdomänen:
die Umwelt und den FPGA-Takt.

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.