Ich habe ein VHDL-Quellcode zusammengesetllt, bei dem ein Signal
heruntergetaktet wird und dieses Signal nutze ich um eine
7-Segment-Anzeige anzusteuern.
Leider funktioniert dies nicht. Er zeigt eine 8 auf der
7-Segment-Anzeige an und der Reseteingang startet den Vorgang des
Zählens nicht.
Hat jemand eine Idee???
Ohne das genauer angeschaut zu haben, hast du eine Anfängerregel
verletzt: Nur 1 Takt im Design. Ein Takt ist alles, was mit 'event oder
rising_edge() oder falling_edge()zu tun hat.
Fazit: Dreh das mal etwa so um
1
WAITUNTILrising_edge(clk);
2
IF(clk_neu='1')THEN-- Wenn 1 Sekunde vorbei dann
3
4
:
5
PROCESSBEGIN-- BCD_DECODER
6
IF(reset='1')then-- WENN Signal reset den Wert 1 hat DANN
7
segm<="0000000";-- weise segm den Wert 0000000 zu
8
elsif(clk'eventandclk='1')then-- SONST WENN
9
IF(clk_neu='1')THEN-- Wenn 1 Sekunde vorbei dann
10
:
EIDT:
> Außerdem ist eine Awareness Liste beim PROCESS nötig:
Eine Sensitivliste ist nur bei einem Prozess ohne wait nötig.
Was ich so auf den ersten Blick feststelle:
* Ich würde mal einen sauberen/einheitlichen Codingstil verwenden. Alle
Prozesse sind geclockt und sollten somit mal einen sauberen Resetzweig
und Clockabfrage beinhalten:
z.B.
Prozess 1: if reset= '1'then
teiler <= 0; -- eventuell unsigned verwenden
clk_neu <= '0';
elsif clk = '1' and clk'event then
*
*
*
end if;
Prozess 1: if reset= '1'then
DD <=(others => '0');
elsif clk_neu = '1' and clk_neu'event then
*
*
*
end if;
* Im Prozess zwei ist der Reset Low Sensitiv und im Prozess drei High
Sensitiv!!!!!??
* In Prozess werden beide Clocks vermischt.
Meine Meinung, hoffe es hilft.
Gruss Hubert
will er die wait-Anweisng nicht mehr haben.
Oder ist vielleicht die Frequenz zu hoch? da er ja am Anfang eine 8
stehen hat. Das Taktsignal ist 1 MHz groß.
Beim längeren drücken der resettaste zeigt er zwischenzeitlich ein paar
Zahlen.
Hat sonst noch jemand eine Idee???
Halberraum schrieb:
> Hat sonst noch jemand eine Idee???
Poste mal deinen aktuellen Code...
> PROCESS (clk_neu) BEGIN
Ich glaube du hast etwas falsch verstanden. Es gibt nur eine Clock und
die heißt bei dir clk! Da du immer auf clk triggerst brauchst du keine
Sensitivitylist... clk_neu ist nur eine Art Enable-Signal und keine
Clock!
Zur Vervollständigung:
clk_div : process (clk, reset)
begin
if reset= '1'then
teiler <= 0; -- eventuell unsigned verwenden
clk_neu <= '0';
elsif clk = '1' and clk'event then
*
*
*
end if;
end process;
Du muss deinen Code aufräumen, vor allem die Resetbedingungen!
Gruss, Hubert
Aber wenigstens alles gleich.
Wobei ich die erste Variante (aus verschiedenen Gründen) bevorzuge ;-)
EDIT:
> Du muss deinen Code aufräumen, vor allem die Resetbedingungen!
Am besten: den Reset gleich weglassen...
@Lothar
Aus welchen Gründen bevorzugts du die erste Variante?
Was mir noch auffällt:
Du willst ja mit clk_neu zählen und das Ergebnis in Abhängig von DD in
"segm" dekodieren und speichern.
So wirst du immer um einen Zählschritt hinten nach sein. Soll heissen,
wenn er z.B. auf 7 zählt wird er noch 6 speichern, dekodieren und
darstellen.
> Aus welchen Gründen bevorzugts du die erste Variante?
Siehe dort:
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
Und dazu kommt die bereits angesprochene Reset-Geschichte. Asynchrone
Resets bringen urige Probleme mit sich. Siehe dazu den
Beitrag "Re: FSM Problem(Ein zustand als Taktverzögerung)"
EDIT:
> So wirst du immer um einen Zählschritt hinten nach sein.
Richtig, aus diesem Grund sollte die ganze Decodiergeschichte eigentlich
concurrent oder in einem kombinatorischen Prozess ablaufen.
@Halberraum:
>Hat jemand eine Idee???
Abgesehen von den vielen (und richtigen) Hinweisen zum Code: Sind denn
die Pinzuweisungen richtig? Hast Du überhaupt welche vorgenommen?
Duke
Du hast noch immer zwei verschieden sensitive Resets:
Prozess 2: IF reset = '0' THEN ....
Prozess 3: IF (reset = '1') then ....
In dem Fall zählt er und dekodiert nicht oder umgekehrt.
Gruss, Hubert
die passenden Warnungen:
WARNING:HDLParsers:1406 - "D:/Probe-Simulation/Probe/counter_updown.vhd"
Line 65. No sensitivity list and no wait in the process
WARNING:Xst:819 - "D:/Probe-Simulation/Probe/counter_updown.vhd" line
67: One or more signals are missing in the process sensitivity list. To
enable synthesis of FPGA/CPLD hardware, XST will assume that all
necessary signals are present in the sensitivity list. Please note that
the result of the synthesis may differ from the initial design
specification. The missing signals are:
<clk>
WARNING:Xst:819 - "D:/Probe-Simulation/Probe/counter_updown.vhd" line
65: One or more signals are missing in the process sensitivity list. To
enable synthesis of FPGA/CPLD hardware, XST will assume that all
necessary signals are present in the sensitivity list. Please note that
the result of the synthesis may differ from the initial design
specification. The missing signals are:
<reset>
WARNING:NgdBuild:1012 - The constraint <INST "/" KEEP_HIERARCHY = TRUE>
is
overridden on the design object sieben_segment by the constraint
<INST "/"
KEEP_HIERARCHY = TRUE>.
WARNING:NgdBuild:1012 - The constraint <INST "/" KEEP_HIERARCHY = TRUE>
is
overridden on the design object sieben_segment by the constraint
<INST "/"
KEEP_HIERARCHY = TRUE>.
WARNING:NgdBuild:1012 - The constraint <INST "/" KEEP_HIERARCHY = TRUE>
is
overridden on the design object sieben_segment by the constraint
<INST "/"
KEEP_HIERARCHY = TRUE>.
> und funktioniert immer noch nicht...
Mach mal eine Testbench, dann kommst du bald auf das "WARUM?"
Bei mir gehts... :-/
Um auf Duke Scarrings Frage zurückzukommen:
Hast du auch eine UCF-Datei?
EDIT:
> Mit der kleinen Änderung des Resets...
Allerdings hast du etliche Warnungen des Synthesizers einfach ignoriert.
Daran solltest du noch arbeiten... :-/
Auch verwendst du im letzten Prozess noch einen asynchronen Reset, im
Prozess davor aber einen synchronen.
Ich würde an deiner Stelle den Code nochmal überarbeiten -> jetzt weisst
du ja, dass das Prinzip richtig ist...
Ich habe die kombinatorische Version von kmiller gerade getestet auf dem
Demoboard. Es zeigt nur eine Null an und startet nicht den Zählvorgang.
Fehlermeldungen kamen keine.
> Es zeigt nur eine Null an
Mit dem richtigen Pegel am Reset geht das...
Oder mach den Reset ganz raus.
> Fehlermeldungen kamen keine.
Das ist wichtig ;-)
Leider geht das auch nicht.(hatte ich ja bereits geschrieben)
Mir ist aufgefallen, dass wenn ich IF reset = '0' THEN schreibe, der
svf-File um mehr als das doppelte größer wird als sonst.
> Leider geht das auch nicht.(hatte ich ja bereits geschrieben)
Hast du das schon wieder auf 999999 korrigiert?
1
if(teiler<99)then
Ich hatte den Wert nur für die Simulation so niedrig angesetzt.
> Mir ist aufgefallen, dass wenn ich IF reset = '0' THEN schreibe, der> svf-File um mehr als das doppelte größer wird als sonst.
Das SVF-File ist ein etwas ungeeigneter Ort, um die auslastung eines
FPGAs festzustellen. Dafür gibt es entsprechende Analysetools.