mikrocontroller.net

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


Autor: Peter F. (peterfes)
Datum:

Bewertung
0 lesenswert
nicht 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?
entity MyUART is
    Port ( Input : in  STD_LOGIC;
           Output : out  STD_LOGIC;
           Filterwith : in  STD_LOGIC_VECTOR (15 downto 0);
        htest : out STD_LOGIC_VECTOR (15 downto 0);
        ltest : out STD_LOGIC_VECTOR (15 downto 0);
        xtest : out STD_LOGIC_VECTOR (15 downto 0);
        ytest : out STD_LOGIC_VECTOR (15 downto 0);
           CLK : in  STD_LOGIC);
end MyUART;

architecture Behavioral of MyUART is
signal Lowcount  : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
signal Highcount : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
signal x : STD_LOGIC_VECTOR (15 downto 0) := x"0000";
signal y : STD_LOGIC_VECTOR (15 downto 0) := x"0000";

signal Out_signal : STD_LOGIC := '0'; 
begin
process (CLK)
begin
  if CLK ='1' and CLK'event then
    if Input = '1' then
       if (Highcount < Filterwith) then
        Highcount <= Highcount + 1;
        Lowcount <= x"0000";
        if (Highcount = Filterwith) then 
          Out_signal <= '1';
          x <= x"FFFF";
        end if;
      end if;
    else
      if (Lowcount < Filterwith) then
        Lowcount <= Lowcount + 1;
        Highcount <= x"0000";
        if (Lowcount = Filterwith) then 
          Out_signal <= '0';
          y <= x"FFFF";
        end if;
      end if;
    end if;
  end if;
end process;
Output <= Out_signal;
htest <= Highcount;
ltest <= Lowcount;
xtest <= x;
ytest <= y;
end Behavioral;

Autor: Rick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (Highcount < Filterwith) then
        Highcount <= Highcount + 1;
        Lowcount <= x"0000";
        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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter F. (peterfes)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.