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


von Dirk (Gast)


Angehängte Dateien:

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?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_UNSIGNED.ALL;
4
use IEEE.STD_LOGIC_ARITH.ALL; 
5
--use ieee.numeric_std.all;
6
7
---- Uncomment the following library declaration if instantiating
8
---- any Xilinx primitives in this code.
9
--library UNISIM;
10
--use UNISIM.VComponents.all;
11
12
13
entity timest is
14
generic (  BITWIDTH: integer := 8
15
          
16
        );
17
18
port (     RST        : in    std_logic; 
19
          CLK       : in    std_logic; 
20
          DATAIN    : in     std_logic_vector(BITWIDTH-1 downto 0);
21
          cnt  : out   std_logic_vector(BITWIDTH-1 downto 0)
22
      
23
      );
24
end timest;
25
26
architecture Behavioral of timest is
27
28
signal cnt_int: std_logic_vector(BITWIDTH-1 downto 0);       --
29
Adresszaehler
30
signal datain_old: std_logic_vector(BITWIDTH-1 downto 0);   
31
begin
32
33
process(rst,clk,datain) 
34
35
begin
36
if rising_edge(CLK) then                      -- rising edge 
37
  if rst = '1' then                            -- async. rst
38
    cnt_int <= (others=>'0');
39
  else
40
  datain_old <= datain;                          -- save DATAIN to Register
41
  if DATAIN = datain_old then
42
        cnt_int <= cnt_int + 1;   
43
    end if;
44
  end if;
45
end if;    
46
end process;
47
cnt <= cnt_int;  
48
49
50
end Behavioral;

von TobiFlex (Gast)


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

von Dirk (Gast)


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

von Jürgen Schuhmacher (Gast)


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 ?

von Dirk (Gast)


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.

von Klaus F. (kfalser)


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

von Dirk (Gast)


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

von Jürgen Schuhmacher (Gast)


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 ?

von Klaus F. (kfalser)


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.

von FPGA-User (Gast)


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.

von Dirk (Gast)


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

von Klaus Falser (Gast)


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

von Dirk (Gast)


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

von T.M. (Gast)


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.

von Dirk (Gast)


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

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.