2016-04-26 14 views
0

Ich mache gerade ein Projekt in VHDL, in dem ich einen Zähler habe, der in 100ms oder in 1000ms aktualisiert werden muss, wenn eine Taste gedrückt wird.Zeitteilung (Periode) Auswahl in vhdl

Beispiel:

If Key3=0 then 
c=c+1 (100ms) 
elsif key3=1 then 
c=c+1 (1000ms) 

Ich mag würde wissen, wie es in VHDL zu tun.

Ich glaube, ich sollte einen Prozess (Uhr, Key3) verwenden, aber ich bin mir nicht sicher, wie man den Zähler basierend auf dem Zeitraum erhöhen.

danke im voraus!

Antwort

1

Ich glaube, Sie einen Teil des Weges gibt es:

ich glaube ich ein Verfahren verwendet werden soll (Uhr, Key3), aber ich bin mir nicht sicher, wie der Zähler mehr als im Zeitraum basieren.

Denken Sie an das Problem als ein digitales Design-Problem, kein Codeproblem. Was würden Sie verwenden, um den Lauf der Zeit in einem echten digitalen System zu messen? Von dort benutze das als Referenz, um festzustellen, ob 100ms oder 1000ms vergangen sind.

Und wenn Sie die Zeit messen können, wie bestimmen Sie, wie lange ein bestimmtes Ereignis in Bearbeitung ist?

0

Wenn c ist eine Variable (in einem Prozess) vom Typ Zeit dann

if some_condition then 
    c := c + 100 ms; 
else 
    c := c + 1000 ms; 
end if; 

gültig VHDL ist, und wird in der Simulation arbeiten, obwohl die Zeit für die Synthese nicht sehr gut unterstützt ist.

Die einfachste Lösung ist, dass C in Zeitschritten zählt - wie z. B. ein Vielfaches von Taktzyklen, und um 1 oder 10 davon hinzuzufügen. wenn

Zum Beispiel haben Sie eine 10MHz Uhr:

constant Clock_Period : time := 100 ns; 

constant ms_100 : natural := 100 ms/Clock_Period; 
constant ms_1000 : natural := 1000 ms/Clock_Period; 
signal c : natural; 
... 

    if some_condition then 
     c <= c + ms_100; 
    else 
     c := c + ms_1000; 
    end if; 

Und wenn Sie die Taktfrequenz zu ändern, stellen Sie die clock_period Erklärung zu entsprechen.

+0

Wir haben kürzlich ein Problem mit Vivado in Bezug auf die Erzeugung von Konstanten und Bereichen basierend auf 'Zeit' Typen. Wie Sie oben beschrieben haben, optimiert dies vollständig zu nichts. Und Xilinx bestätigt, dass Objekte vom Typ "time" nicht unterstützt werden. Siehe AR57964 (http://www.xilinx.com/support/answers/57964.html) – PlayDough

+0

@PlayDough der AR, den Sie verknüpft haben, gibt an, dass der Typ in Vivado unterstützt wird, aber schlecht. Als solche wird diese Technik von Xilinx für Vivado-Benutzer "nicht empfohlen" (vielleicht verwenden sie 32-Bit-Arithmetik, wenn andere 64-Bit verwenden) und Synplicity hat andere Probleme. Aber Code auf der höchsten Ebene am klarsten auszudrücken sollte die übliche Praxis sein; davon abweichen, wo die Werkzeugunterstützung nicht ausreicht. –

+0

Fair genug. Die Zeit wird unterstützt - schlecht. Wir beschränken uns jedoch auf die von uns verwendeten Tools, wie Sie betonen. Was wir stattdessen tun, ist etwas wie: 'Konstante Clock_Period: real: = 100.0e-9;' Reale Werte werden gut unterstützt. – PlayDough