Hallo,
ich habe probleme mit dem richtigem Timing in meinem Design und leider
wenig bis keine Erfahrung mit Timing Simulationen. Zwar bekomme ich mein
Design timing-simuliert aber kann mit dem Report leider nicht viel
Anfangen.
Zum einen wollte ich fragen ob mir jemand ein gutes Buch oder Tutorial
oder ähnliches zu diesem Thema empfehlen kann?
Zum anderen wollte ich mein Problem darstellen, vielleicht kann mir
jemand direkt weiterhelfen.
Also:
In der Grafik kann man das Verhalten meines Designs innerhalb der
Timing-Simulation erkennen. Wie man sieht ändern sich die
Zählerstände/Ausgaben, allerdings sollten diese konsistent auf einem
ermittelten Wert bleiben.
Diese Fehler tritt auch nur in der Timing-Simulation auf, in der
funktionalen/logik Simulation tut das Design genau was es soll.
Hier noch ein Auszug aus meinem Code, folgender Prozess ermittelt z.B.
den Wert für "totalPix" :
1 | process (analysisClk, analysisReset, analysisHSync)
|
2 | variable var_analysisHSync : std_logic;
|
3 | variable pixCounter : std_logic_vector (11 downto 0);
|
4 | variable var_enableCtr : std_logic;
|
5 | variable var_oldEnableCtr : std_logic;
|
6 | variable ctrStarted : std_logic;
|
7 |
|
8 | begin
|
9 |
|
10 | -- Rücksetzen der Variablen und Signale wenn Reset = '1'
|
11 | if analysisReset = '1' then
|
12 | tempTotalPix <= (others=> '0');
|
13 | pixCounter := b"000000000000";
|
14 | var_analysisHSync := '0';
|
15 | internTotalPix <= (others => '0');
|
16 | var_enableCtr := '0';
|
17 | var_oldEnableCtr := '0';
|
18 | ctrStarted := '0';
|
19 | -- erhöht pixCounter um "1" solange kein VSync
|
20 | elsif analysisClk = '1' and analysisClk'event then
|
21 | if analysisHSync = '1' and var_analysisHSync= '0' and ctrStarted = '0' then
|
22 | var_enableCtr := '1';
|
23 | ctrStarted := '1';
|
24 | elsif analysisHsync = '1' and var_analysisHSync = '0' and ctrStarted= '1' then
|
25 | var_enableCtr := '0';
|
26 | ctrStarted := '0';
|
27 | end if;
|
28 |
|
29 | if var_enableCtr = '1' then
|
30 | pixCounter := pixCounter +1;
|
31 | internTotalPix <= pixCounter;
|
32 | -- wenn H-Sync von 1 auf 0 wechselt(Zeilenende) wird Zählerstand in tempTotalPix übernommen
|
33 | -- und der Pixel-Zähler wird zurückgesetzt
|
34 | --elsif analysisHSync = '0' and var_analysisHSync = '1' then
|
35 | elsif var_enableCtr = '0' and var_oldEnableCtr = '1' then
|
36 | tempTotalPix <= internTotalPix;
|
37 | pixCounter := b"000000000000";
|
38 | end if;
|
Ein weiterer Prozess sorgt dafür das der Wert des Signals "tempTotalPix"
erst nach einer definierten Anzahl von "V-Sync's"(Ende des Frames) an
den Out-Port weiter gereicht wird.
Für jede Hilfe wäre ich sehr dankbar ebenso wie für entsprechende
Buch-Empfehlungen :)
viele Grüße
Heiko