Vergleich alte Daten mit neuen

Gast #418316
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;
Angehängte Dateien:
Gast #418317
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
Gast #418318
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
Gast #418319
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 ?
Gast #418320
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.
#418321
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
Gast #418322
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
Gast #418323
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 ?
#418324
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.
Gast #418325
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.
Gast #418326
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
Gast #418327
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
Gast #418328
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
Gast #418329
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren