Hallo,
dieses Problem scheint ja hier schon oefters aufgetreten zu sein...
Aber loesen konnte ich des dennoch nicht...
Habe es versucht in verschiedene Prozesse zu unterteilen, jedoch ohne
Erfolg, denn dann tritt ein multisource Fehler auf. Hier die notwendigen
Codeschnipsel:
signal cntMSEC: integer range 0 to 49 := 0; --Counter fuer 1 msec
signal cntMSECs1: integer range 0 to 9 := 0; --einer msec
signal cntMSECs10: integer range 0 to 9 := 0; --zehner msec
process (clk, reset_internal)
begin -- process
if reset_internal = '1' then -- asynchronous reset
cntMSEC <= 0;
cntMSECs1 <= 0;
cntMSECs10 <= 0;
elsif clk'event and clk = '1' then -- rising clock edge
cntMSEC <= cntMSEC + 1; --1 ms
elsif cntMSEC = 49 then
cntMSECs1 <= cntMSECs1 + 1; --Einer ms
elsif cntMSEC = 9 then
cntMSECs10 <= cntMSECs10 +1; --Zehner ms
end if;
end process;
Sorry fuer dieses wiederaufkehrende Thema :-/
Ah denke ich habs nun :)
fuer alle, die das gleiche Problem haben:
process (clk, reset_internal)
begin -- process
if reset_internal = '1' then -- asynchronous reset
cntMSEC <= 0;
cntMSECs1 <= 0;
cntMSECs10 <= 0;
elsif clk'event and clk = '1' then -- rising clock edge
cntMSEC <= cntMSEC + 1; --1 ms
end if;
if cntMSEC = 49 then
cntMSECs1 <= cntMSECs1 + 1; --Einer ms
end if;
if cntMSEC = 9 then
cntMSECs10 <= cntMSECs10 +1; --Zehner ms
end if;
end process;
Fuer Verbesserungsvorschlaege bin ich jederzeit offen :)
Hmm... so jetzt aber...
also ms sind es nun Testzwecke halber nicht... aber es tut nun nichts
zur sache...
Compelieren laesst sich das Programm, aber der Counter zaehlt nur
totalen wirrwar...
Weiss einer von euch wieso?
signal cntMSEC: integer range 0 to 25000000 := 0; --Counter for get 1
msec
signal cntMSECs1: integer range 0 to 9 := 0; --Counter for 1 msec
signal cntMSECs10: integer range 0 to 9 := 0;
signal select_cntMSECs10: std_logic_vector(3 downto 0) := "0000";
process (clk, reset_internal)
begin -- process
if reset_internal = '1' then -- asynchronous reset
cntMSEC <= 0;
cntMSECs1 <= 0;
cntMSECs10 <= 0;
elsif clk'event and clk = '1' then -- rising clock edge
cntMSEC <= cntMSEC + 1; --1 ms
end if;
if cntMSEC = 9 then
cntMSECs1 <= cntMSECs1 + 1; --Einer ms
end if;
if cntMSECs1 = 9 then
cntMSECs10 <= cntMSECs10 +1; --Zehner ms
end if;
end process;
ich glaube du wolltest sowas schreiben??
wie soll er den ohne clock was zuweisen!
elsif clk'event and clk = '1' then -- rising clock edge
cntMSEC <= cntMSEC + 1; --1 ms
if cntMSEC = 9 then
cntMSECs1 <= cntMSECs1 + 1; --Einer ms
end if;
if cntMSECs1 = 9 then
cntMSECs10 <= cntMSECs10 +1; --Zehner ms
end if;
end if;
end process;
Fellap schrieb:> Fuer Verbesserungsvorschlaege bin ich jederzeit offen :)
Mein Tipp: du solltest zwischendurch auch mal schlafen ;-)
Außerdem: Rück deinen Code vernünftig ein!!!
Für eine synchrone Beschreibung muss das erste if nur den Takt und ggf.
den asynchronen reset "abtesten", die eigentlichen Zuweisungen sind als
innere IF-Zweige zu schreiben:
1
--...
2
process(clk,reset_internal)
3
begin-- process
4
ifreset_internal='1'then-- asynchronous reset
5
cntMSEC<=0;
6
cntMSECs1<=0;
7
cntMSECs10<=0;
8
elsifclk'eventandclk='1'then-- rising clock edge
9
cntMSEC<=cntMSEC+1;
10
ifcntMSEC=9then
11
cntMSECs1<=cntMSECs1+1;
12
endif;
13
ifcntMSECs1=9then
14
cntMSECs10<=cntMSECs10+1;
15
endif;
16
endif;--nur hier steht das end if für clk'event richtig
17
endprocess;
Einrücken hilft hier ungemein.
Eine explizite Beschreibung des overflows wäre auch ganz praktisch:
jetzt bekomme ich aber schon das naechste Problem nicht mehr hin...
Ich moechte zwei 7-Segment-Anzeigen verwenden..
Die erste 7-Segementanzeige zaehlt von 0 - 9 hoch.
Wenn ich nun einen kurzen Tastendruck betaetige, soll der Momentanwert
zu gespeichert werden und auf der 2ten 7-Segementanzeige angegezeigt
werden und zwar solange bis ich wieder die Taste druecke um den
aktuellen momentanwert wieder anzeigen zu lassen...
Ich stell mir das eigentlich sehr leicht vor.. Doch das Problem ist, bei
der if-Bedingung das else... da weiss ich nicht was ich reinschreiben
soll...
Bei dem jetztigen Code zeigte die 2te 7-Segment-Anzeige einfach das
gleiche an wie die erste, wenn ich die Taste betaetige..
Hier der Code:
process (BTN0)
begin
if BTN0 = '1' then
save_cnt <= select_cntMSECs10;
else
save_cnt <= "1111";
end if;
end process;
PS: Soll ich fuer dieses Thema ein neuen Thread eroeffnen?
Achja... in select_cntMSECs10; ist eine 4Bit langer Vektor mit denen
ich 0-9 binaer drinnen stehen habe...
bei "1111" ist das die 7-Segementanzeige aus.
Da Dieter schrieb:>> Mein Tipp: du solltest zwischendurch auch mal schlafen ;-)
Schlaf wird völlig überschätzt. Habe heute Nacht auch noch ein Projekt
zu Ende gemacht. Ist fünf geworden. Halb neun haben meine Jungs mich
dann geweckt.
Alles nicht so schlimm, solange die Schaltung funktioniert. :-)
Fellap schrieb:
Bitte, bitte, bitte, packe doch mal deine Codeschnipsel in [ vhdl ] und
[ /vhdl ] (ohne Leerzeichen!), damit man das ganze mal gescheit sehen
kann!
Noch besser, du haengst deine Datei (.vhd) hier einfach an, und zwar die
gesamte Datei, nicht nur einen Ausschnitt...
> Hier der Code:>> process (BTN0)> begin> if BTN0 = '1' then> save_cnt <= select_cntMSECs10;> else> save_cnt <= "1111";> end if;> end process;
also z.B. so (mit Tabulator=4 damit das ganze etwas uebersichtlicher
wird):
1
process(BTN0)
2
begin
3
ifBTN0='1'then
4
save_cnt<=select_cntMSECs10;
5
else
6
save_cnt<="1111";
7
endif;
8
endprocess;
Wenn ich das oben so sehe, dann wird mir jetzt schon schlecht... BTN0
ist ein Eingangspin an dem ein Taster haengt, richtig?
Solche Signale muessen erstmal einsynchronisiert werden (fuer Taster:
Entprellt!)
Und was dieser Codeschnipsel mit deinem Problem zu tun haben koennte,
das kann dir mit der Information leider niemand sagen...
Achso, du hast oben nach dem Post von 'Fpga Kuechle' gemeint, alles
waere super. Aber was du jetzt gemacht hast, das hast du nicht
geschrieben. Also mit der Salamitaktik wirst du hier keine gescheiten
Antworten bekommen...
Da Dieter schrieb:> Außerdem: Rück deinen Code vernünftig ein!!!
Und verwende die Token [ vhdl ] vor sowie [ /vhdl ] nach dem VHDL-Code,
aber ohne Leerzeichen. Dann gibt es sogar Syntax-Highlighting für
umme... :-o
Fellap schrieb:> Compelieren
Soso...
> laesst sich das Programm, aber der Counter zaehlt nur> totalen wirrwar...
Und was macht die Simulation?
Du weißt, dass der Simulator der VHDL-Debugger ist?
Fellap schrieb:
1
signalcntMSEC:integerrange0to25000000:=0;--Counter for get 1 msec
1. hast du einen 25GHz Takt? Kann dein FPGA so schnell zählen?
2. der beliebteste Fehler: du zählst einen Takt zuviel.
0...24999999 sind schon 25000000 Takte...
berndl schrieb:> Also mit der Salamitaktik wirst du hier keine gescheiten Antworten> bekommen...
Full Ack. Wie auch?
berndl schrieb:> enn ich das oben so sehe, dann wird mir jetzt schon schlecht... BTN0> ist ein Eingangspin an dem ein Taster haengt, richtig?> Solche Signale muessen erstmal einsynchronisiert werden (fuer Taster:> Entprellt!)> Und was dieser Codeschnipsel mit deinem Problem zu tun haben koennte,> das kann dir mit der Information leider niemand sagen...
Richtig, BTN0 ist ein Taster. Ich moechte diesen Taster spaeter durch
ein Eingangssignal an einem PIN ersetzen. Momentan dient dieser Taster
nur als Test.
Wieso sollte ich das nicht selbst geschrieben haben?!?!? oO
Mein Code ist folgender: (Anbei auch der ganze code)
[VHDL]
process (BTN0)
begin
if BTN0 = '1' then
-- if BTN0'event and BTN0 = '1' then -- rising clock edge
save_cnt <= select_cntMSECs10;
else
save_cnt <= save_cnt;
end if;
end process;
[\VHDL]
Ich bekomme das speichern nicht gebacken... Jedes mal beim impelemtieren
des Designs bekomme ich den Fehler:
Process "Place & Route" failed
Hallo zusammen,
ich würde empfehlen erstmal ein paar einfache Tutorials durch zu
arbeiten und zu verstehen.
Ein wunder das dein code mit BTN oben funktioniert,
nicht nur das vermutlich ein latch gebildet wird du gatest damit auch
noch ein clk,
KEIN einsynchronisieren,
KEIN Entprellen,
damit nicht stabiles signal und absolut asynchron!
Mfg
-- if BTN0'event and BTN0 = '1' then -- rising clock edge
5
save_cnt<=select_cntMSECs10;
6
else
7
save_cnt<=save_cnt;
8
endif;
9
endprocess;
Das hast du dir selber ausgedacht (beide Ansätze da drin), nicht wahr?
Das ist ein ausgefallener Ansatz. Hier geht es ausnahmsweise sogar gut
aus, weil mit diesem gespeicherten Wert nur ein Multiplexer umgeschaltet
wird. Wenn du damit aber lernst "so kann man es machen!", dann wirst du
später noch mal Sorgen damit haben...
Diese Sensitivliste ist unvollständig (es fehlen sig_anodos, sw,
selsect_cntMSECs10 und save_cnt) und und zudem ist da mittendrin nochmal
ein Takt versteckt:
1
process(cntDisp(16))------ hier fehlt was
2
begin
3
4
ifcntDisp(16)'eventandcntDisp(16)='1'then------ huch, ein Takt... :-o
was davon ist den ein ausgefallener Ansatz??
Möchte hier nun niemanden runtermachen aber das das beschreibt was er
machen möchte glaube ich kaum.
Hilfreich wäre z.B. zu wissen auf was das laufen soll
xilinx/altera,etc.?
Bei der orginalversion wird z.B. nur Kombinatorik erzeugt, der rest wird
wegoptimiert da er nach der Beschreibung nichts tut!
Und um nochmal auf den BTN0 zurückzukommen Lothar hat zwar recht mit dem
multiplexer aber trotzdem kommt davor ein Latch siehe Bild1(rot makiert
ist BTN0).Und funktional sollte das wohl wie in Bild2 aussehen.
Mfg
dden schrieb:> was davon ist den ein ausgefallener Ansatz??
Naja, der ausgefallene Ansatz ist ein zustandsgesteuertes
Speicherelement, aka Latch. Den 'else' Zweig haette er sich uebrigens
sparen koennen...
>> Möchte hier nun niemanden runtermachen aber das das beschreibt was er> machen möchte glaube ich kaum.
Ob er das selber weiss?
> Hilfreich wäre z.B. zu wissen auf was das laufen soll> xilinx/altera,etc.?
Spielt hier glaube ich echt keine Rolle.
> Bei der orginalversion wird z.B. nur Kombinatorik erzeugt, der rest wird> wegoptimiert da er nach der Beschreibung nichts tut!
Stimmt, das ist eine Ungereimtheit bei dem Design...
>> Und um nochmal auf den BTN0 zurückzukommen Lothar hat zwar recht mit dem> multiplexer aber trotzdem kommt davor ein Latch siehe Bild1(rot makiert> ist BTN0).Und funktional sollte das wohl wie in Bild2 aussehen.
Klar, mehr steht da oben auch nicht (in den von Lothar gequoteten
Teilen). Aber der zweite Teil dort oben, das ist echt starker Tobak...
Das zeigt, dass es dem TO doch an elementaren Grundlagen fehlt. Und
bisher ist er auf Hinweise von vermeintlich erfahreneren Leuten nicht
eingegangen, sondern hat immer wieder eine neue geniale Loesung
praesentiert. Meine persoenliche Meinung: So wird das nix!
berndl schrieb:> dden schrieb:>> was davon ist den ein ausgefallener Ansatz??> Naja, der ausgefallene Ansatz ist ein zustandsgesteuertes> Speicherelement, aka Latch. Den 'else' Zweig haette er sich uebrigens> sparen koennen...
Wenn ich den 'else'-Zweig weglasse, dann kommt folgender Fehler:
PAR done!
Process "Place & Route" failed
Sorry.. bin gerade auf dem Sprung.. Werde mich am Wochenende mal genauer
damit beschaeftigen und eure Tipps mir zu Herzen nehmen.
Ich bezweifle ja auch nicht, dass ich viele Fehler drinnen habe und es
mir an vielen Grundlagen fehlt. - Diese moechte ich auch nach diesem
Projekt unbedingt nachholen.. Aber soviel Zeit bleibt mir momentan
nicht... Nun versuche ich aus der Not heraus mir das aus meinen
bisherigen "Wissen" alles zusammen zu wurschteln.... In der Hoffnung das
ich auf einen gruenen Zweig komme.. irgendwie..
Wirklich vielen Dank soweit fuer eure Unterstuetzung. - Ich weiss das
echt zu schaetzen...
Fellap schrieb:> Ich bezweifle ja auch nicht, dass ich viele Fehler drinnen habe und es> mir an vielen Grundlagen fehlt. - Diese moechte ich auch nach diesem> Projekt unbedingt nachholen.. Aber soviel Zeit bleibt mir momentan> nicht... Nun versuche ich aus der Not heraus mir das aus meinen> bisherigen "Wissen" alles zusammen zu wurschteln.... In der Hoffnung das> ich auf einen gruenen Zweig komme.. irgendwie..
IMHO ist es eben frustierend zu sehen das es keinerlei Lernfortschritte
gibt. Im ersten beispiel haben wir Dir gezeigt wie du dem Thema des
threads
gemäß ordentlich synchron beschreibts. Und im zweiten Beispiel
wiederholst du den Fehler! Geöhn dir einfach an alle prozeße synchron zu
schreiben also mit process(clk) ... if rising_edge(clk) ... end if; end
process;
Den bisheriges Wissen scheint C zu sein, darauf kannst du bei
HW-beschreibungssprachen nicht bauen, das ist zu Großen teilen mehr
hinderlich als nützlich.
MfG,
Fellap schrieb:> Nun versuche ich aus der Not heraus mir das aus meinen> bisherigen "Wissen" alles zusammen zu wurschteln.... In der Hoffnung das> ich auf einen gruenen Zweig komme.. irgendwie..
Viel Glück mit dem Abgabetermin. Investiere deine Zeit lieber in eine
gute Dokumentation, hat mir jeweils viel gerettet auch wenn das
eigentliche Ziel nicht erreicht wurde in der geforderten Zeit.