mikrocontroller.net

Forum: FPGA, VHDL & Co. Vergleich alte Daten mit neuen


Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich komme mit meinem Problem nicht weiter und hoffe auf eine
Erklärung.

Ich würde gerne Daten vom letzten Clock Event mit den aktuellen Daten
vergleichen.

Die Beschreibung funktioniert, weil der Zähler nicht am Anfang
inkrementiert wird, aber laut Simulation ist DATAIN = data_old am
Anfang.

Kann mir jemand erklären warum oder sehe ich das in der Simulation
falsch?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; 
--use ieee.numeric_std.all;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;


entity timest is
generic (  BITWIDTH: integer := 8
          
        );

port (     RST        : in    std_logic; 
          CLK       : in    std_logic; 
          DATAIN    : in     std_logic_vector(BITWIDTH-1 downto 0);
          cnt  : out   std_logic_vector(BITWIDTH-1 downto 0)
      
      );
end timest;

architecture Behavioral of timest is

signal cnt_int: std_logic_vector(BITWIDTH-1 downto 0);       --
Adresszaehler
signal datain_old: std_logic_vector(BITWIDTH-1 downto 0);   
begin

process(rst,clk,datain) 

begin
if rising_edge(CLK) then                      -- rising edge 
  if rst = '1' then                            -- async. rst
    cnt_int <= (others=>'0');
  else
  datain_old <= datain;                          -- save DATAIN to Register
  if DATAIN = datain_old then
        cnt_int <= cnt_int + 1;   
    end if;
  end if;
end if;    
end process;
cnt <= cnt_int;  


end Behavioral;

Autor: TobiFlex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider geht aus deiner Beschreibung nicht hervor wie DATAIN generiert
wird. In dem GIF sieht es so aus als ob es immer kurz vor L-H verändert
wird. Und damit ist DATAIN != datain_old bis FC erreicht wird.
Irgendwie verstehe ich die Frage nicht.

Viele Grüße
TobiFlex

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DATAIN wird aus einem CPLD generiert mit einer Freq. von 10MHz. Bei
nicht Veränderung der Daten möchte ich einen Zähler erhöhen.

Ich denke es ist eine asynchrone Programmierung / Beschreibung die ich
machen möchte, aber zu einem Ergebnis komme ich nicht.

Mein zweiter Versuch war eine kleine Statemaschine mit zwei States. In
dem ersten State (1. Takt) wird das Eingangssignal ins Register
gespeichert und im zweiten State (2. Takt) wird der Vergleich gemacht
und der Zähler erhöht.

Jetzt muesste aber meine Vergleicherstufe mit doppelter Freq. arbeiten,
weil im ersten Takt nur die Daten gespeichert werden und im zweiten Takt
verglichen wird?

Ich hoffe es ist jetzt verständlicher.

Gruß,
Dirk

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso ist das DATAIN einmal gross geschrieben? Das ist doch sicher
dasselbe gemeint, oder, also der Port?

So, wie Du es machst, wird einmal der alte Wert gerettet und erst im
nächsten Takt geprüft, ob Ungleichheit herrscht. Soll das so sein?
Das funktioniert, wenn der Port zum Taktzeitpunkt stabil ist. Kommt der
gfs von extern ?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wieso ist das DATAIN einmal gross geschrieben? Das ist doch sicher
>dasselbe gemeint, oder, also der Port?

@Jürgen

Ja, es it das selbe gemeint.

>So, wie Du es machst, wird einmal der alte Wert gerettet und erst im
>nächsten Takt geprüft, ob Ungleichheit herrscht. Soll das so sein?

Ich hoffe du beziehst dich auf mein erstes Posting. Theoretisch soll es
so sein oder geht das auch in einem Takt? und wieso ist im Simulator
data_old = data_in zum Anfang?

>Das funktioniert, wenn der Port zum Taktzeitpunkt stabil ist. Kommt
>der gfs von extern ?

Es sind externe Daten die am 8Bit Port anliegen.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Schaltung funktioniert doch korrekt, nur dass deine DATAIN-Daten
zu kurz vor der Taktflanke kommen. Die wird dann im CPLD oder FPGA
nicht funktionieren, weil du die Setup-Zeit des FF verletzt.
Du mußt die Erzeugung deiner DATAIN Signale ändern, am besten sie
ändern sich mit (also kurz nach) der aufsteigenden Flanke deines
Takts.

Grüße
Klaus

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

puh jetzt bin ich verwirrt und wieso zeigt das Bild data_old = data_in
bei den ersten 3 Takten an? Er müsste mind. beim ersten speichern 0x00
im data_old Register stehen haben. Ich bin jetzt total verwirrt. Kann
mir das jemand mal erklaeren?

Bei dem Ausdruck data_old <= datain; ist mir klar das erst zur
naechsten Taktflanke die Daten drin stehen, weil es ein Signal und
keine Variable ist. Oder bin ich jetzt total aus dem Konzept?

Gruß,
Dirk

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die clk-Verzögerung ist ok so und bedingt durch die 2-stufige
Architektur. Ich vermutete, dass die stimuli Deines data_in nicht die
Realität beschreibt: Kommt das data_in wirklich synchron? Müsste man es
gfs abtakten oder einsynchronisieren ?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei jeder Flanke wird der DATAIN Wert in den Data_old Wert übernommmen.
Wenn Du genau hinsiehst, dann erkennst Du, daß Du DATAIN sehr kurz vor
der Flanke anlegst. An der Flanke wird der Vergleich gemacht und bei
den ersten 3 Flanken zählt dein Zähler auch nicht, weil data_old noch
den alten Wert hat.
Kurz nach der Flanke ändert sich data_old zu DATAIN und bleibt so bis
zur nächsten Flanke.
Wieso sollten die Daten erst bei der nächsten Flanke drinnen stehen?
Genau die Daten, welche bei der ansteigenden Flanke an DATAIn stehen
tauchen nach der Flanke an data_old auf.

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi Dirk,

die Simulation sieht voll OK aus, macht genau das, was Du im Code
beschrieben hast.

Verrate doch mal, ob die Daten synchron vom CPLD kommen, falls nicht
sehe ich folgendes Problem:
Die Laufzeit von DATAIN zu datain_old und zum Counter werden vermutlich
unterschiedlich sein. Falls sich DATAIN also ganz kurz vor oder während
der Taktflanke ändert, dann ist es reiner Zufall, ob das Design
funktioniert oder nicht.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

>Bei jeder Flanke wird der DATAIN Wert in den Data_old Wert
>übernommmen. Wenn Du genau hinsiehst, dann erkennst Du, daß Du
>DATAIN sehr kurz vor der Flanke anlegst.

Ich hab das Testbench mit der Grafikübersicht im Webpack erstellt und
die Input / Setup Time auf 1ns gestellt, somit werden alle Eingaenge
1ns vor dem Takt geaendert, wenn ich das richtig verstehe.


>Verrate doch mal, ob die Daten synchron vom CPLD kommen,

Es soll eine einfache State Analyse für einen Logic Analyzer
darstellen. Der CPLD dient imo als Patter Generator und gibt alle 10MHz
ein neues Pattern aus.

Muss ich jetzt noch etwas beachten ?


Ich bin leider immer noch Anfänger in diesem Bereich so tief war ich
noch nie in der Digitaltechnik, deshalb ist es noch alles ein bischen
Unverstaendlich.

Gruß,
Dirk

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt auf jeden Fall die Setup-Zeit beachten.

Deine Schaltung muß zuerst einmal synchron mit dem CPLD laufen, das die
Daten liefert.
Das heißt, CPLD und FPGA (oder jedenfalls der Baustein, in dem dein
Problem-VHDL Programm laufen soll) müssen einen gemeinsamen Takt
verwenden. Wo kommt der Takt her, wird er vom CPLD mitgeliefert?
Wieviele ns vor oder nach diesem Takt ändert das CPLD die Daten.
Damit kannst Du die Setup-Zeit für deine Schaltung berechnen.

Klaus

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

>Das heißt, CPLD und FPGA (oder jedenfalls der Baustein, in dem dein
>Problem-VHDL Programm laufen soll) müssen einen gemeinsamen Takt
>verwenden. Wo kommt der Takt her, wird er vom CPLD mitgeliefert?

Kann man dann wirklich nur bei externen Clock (Clock vom CPLD)
verlaesslich die Daten sampeln ? Ich hatte gehofft das ich meine State
Analyse einfach mit meinem Systemclock vom FPGA laufen lassen kann.

Die letzte Verwirrung der Simlation für mich ist das data_old laut
Simulation immer gleich DATAIN ist. Wuerde ich den Zaehler nicht in der
Simulation darstellen wuerde ich sagen die Schaltung macht nix.

Gruß,

Dirk

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
data_old ist nicht gleich data_in, sondern wird erst zur steigenden
Clockflanke übernommen. Genau wie du es beschrieben hast mit deinem
Code. Wenn du in dem getakteten Prozess nun aber data_old mit data_new
vergleichst, steht in data_old noch der alte Wert drin, weil ja erst am
Ende des Prozesses der neue Wert zugewiesen wird. Wenn dir das nicht
ganz klar ist, solltest du dich nochmal damit beschäftigen, wie
Signalzuweisungen innerhalb eines Prozesses verarbeitet werden.

T.M.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke T.M. ich hab nochmal einige VHDL Tut. gelesen, aber wohl die
wichtige Information überlesen. Ich dachte immer zum Anfang des
Processes werden die Daten übernommen und nicht am Ende.

Gruß,
Dirk

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.