Hallo Zusammen,
ich lese ja schon seit langer Zeit immer wieder gerne hier die
Forumsbeiträge - heute ist es soweit, ich komme nicht weiter und wende
mich auch mal an die nette Community hier.
Also erstmal(möglcihst) kurz und knapp die Situation:
Ich habe schon seit einiger zeit Programmiererfahrung mit Pic & co. und
dachte mir: eine neue Herausforderung: Beschreibe die Hardware anstatt
sie zu Programieren. Gesagt - Getan.. sein ein paar wochen versuche mich
an einem Altera FPGA(cyclone I). Die ersten Versuche liefen auch alle
super(counter, blinkende LEDs, 7Segmentanzeigen, etc).. Nun, mein
testboard hat auch einen kleinen Lautsprecher. Also dachte ich mir, 2
Eingänge für Frequenz + und -, einem single port ram + init wert und ein
ausgang..
Im Anhang dazu eine kleine Skizze....
Nunja, in der Simulation gehen die einzelkomponenten alle, einige habe
ich aus vorherigen Projekten übernommen(laufen also auch in der Praxis),
aber die gesamtschaltung geht natürlich nicht.
Ich vermute mal, das der fehler irgendwo im bereich des signals/ausgangs
"WREN" liegt(zu kurz??), aber das überlasse ich mal den Profis.
So .. ich hoffe, ich habe nichts vergessen..
Hier Dann mal der VHDL code:
Müsste die sensitive list nicht auch auf minus und plus reagieren?
1
s_out_p<=s_plus;
2
s_out_m<=s_minus;
3
s_pp<=s_plusandnots_out_p;
4
s_pm<=s_minusandnots_out_m;
Soll sich hier s_pp aus dem s_out_p aus der zweiten Zeile darüber geben?
Hier dürftest du ein Problem Timing Problem erhalten. Des Weiteren ist
es wirklich gewünscht nur zwei kombinatorischen Teile ohne sequentiellen
Block zu verwenden? Aus Erfahrung ist es auch nicht wirklich schlau
Ausgänge über Latches zu betreiben, in diesem Fall direkt den Ausgang
über ein Signal zu treiben. Ich würde den Ausgang eher über ein Register
treiben.
In der Simulation solltest du dir auch die Timings zwischen pegel_leser
und rechner genauer anschauen, da pegel_leser auf jede Taktflange
reagiert ist s_plus und s_minus gleich wieder null.
Grüße,
Tim
Ben schrieb:> pegel_leser:process(clock) ...
Mit diesem komplizierten "Einleseprozess" machst du zwar so was
ähnliches wie eine Synchronisierungsstufe, aber da sind zu viele
Abhängigkeitrm drin, und deshalb passiert dort (früher oder später) das:
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html
Es hilft hier übrigens gar nichts, dass die Taster schon entprellt
sind...
Tim P. schrieb:> Müsste die sensitive list nicht auch auf minus und plus reagieren?
Nein. Der Prozess ist nur vom Takt abhängig.
Tim P. schrieb:> Soll sich hier s_pp aus dem s_out_p aus der zweiten Zeile darüber geben?> Hier dürftest du ein Problem Timing Problem erhalten.
Wieder nein.
Jedes der Signale dort ist getaktet und damit ein Flipflop. Mithin ist
das insgesamt nur eine weitere Sync-Stufe für die Flankenerkennung.
Ben schrieb:> Ich vermute mal, das der fehler irgendwo im bereich des signals/ausgangs> "WREN" liegt
Welcher "Fehler" denn? Wie äussert der sich? Und was hättest du
stattdessen erwartet?
Hallo zusammen,
danke für eure antworten. Also...
Tim P. schrieb:> Ich würde den Ausgang eher über ein Register> treiben.
Ich denke mal, einiges hat schon Lothar beantwortet, aber dein vorschlag
mit dem Register werde ich mal versuchen.
Lothar M. schrieb:> Mit diesem komplizierten "Einleseprozess" machst du zwar so was> ähnliches wie eine Synchronisierungsstufe, aber da sind zu viele> Abhängigkeitrm drin, und deshalb passiert dort (früher oder später) das:> http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html>> Es hilft hier übrigens gar nichts, dass die Taster schon entprellt> sind...
Wie bekomme ich den Einleseprozess denn besser hin - zumal die
angschlossenen taster ja nur bei der ersten Taktflanke verarbeitet
werden sollen.?
FPGA-Ingenieur schrieb im Beitrag #4333654:
>>s_data <= 50000000 / ((50000000 / unsigned(act_data)) + 10);> was oll dieser Konstrukt bewirken?
Dieses Konstruckt soll(jedenfalls in der Theorie...) mir den
vergleichswert errechen. Also an meinem "Soundausgang" soll eine
frequenz anliegen. Dies realisiere ich mit einem counter, der bis X
hochzählt(je nachchdem welche frequenz am ausgang gewunscht ist,
erreichne ich mit diesem code den gewünschten vergleichswert, bis zu dem
der couter zählt. Ist dieser vergleichswert erreicht, wird das
asugangssignal getoggelt und der counter auf 0 gesetzt.
Lothar M. schrieb:> Welcher "Fehler" denn? Wie äussert der sich? Und was hättest du> stattdessen erwartet?
Also der Fehler.. ich bekomme keinerlei ausgangssignal am
"soundausgang".
Wenn ich meinen counter am ausgang zu einem festgeschriebenen festen
wert zählen lasse, funktioniert dieser. Mit dem controler und ram nicht.
Von daher denke ich, das ich den Ram nicht beschrieben bekomme, so das
mein counter sich durchgehend zurück setzt.
Hier nochmal der volständigkeit halber der code, der mit dem
vergleichswert arbeitet(bzw arbeiten soll..)
1
libraryieee;
2
useieee.std_logic_1164.all;
3
useieee.numeric_std.all;
4
5
entitymegaDIV_variabelis
6
Port(
7
-- INPUT
8
clock:inbit;--Clock in 50MHZ
9
vergleich:instd_logic_vector(23downto0);-- Vergleichswert vom RAM
10
-- OUTPUT
11
clock_out:outbit-- anschluss zum "Lautsprecher"
12
);
13
endmegaDIV_variabel;
14
15
architectureverhaltenofmegaDIV_variabelis
16
signals_vergleich:unsigned(23downto0);
17
signals_counter:unsigned(23downto0):=x"000000";
18
signals_toggle:bit:='0';
19
20
Begin
21
frequenzcounter:process(clock)
22
Begin
23
IF(clock'eventandclock='1')then
24
--Wenn zählwert größer ist als vergleichswert vom RAM -> Reset und ausgang toggeln