Hallo,
bin absoluter VHDL-Anfänger. Wir arbeiten mit Quartus für ein
CycloneII-Board. Es geht darum einen Leuchtpunkt zum Wandern zu bringen.
Das funktioniert soweit auch ganz gut. Es geht darum, dass der
Leuchtpunkt beim kurzen Drücken der Taste ein Feld weiter springen soll.
Beim langen Drücken der Taste, soll der Punkt erst nach 2 sek weiter
laufen. Mein Prof. meinte, dass für das kurze Drücken der Taste immer
ein schneller Takt laufen muss und wenn die Taste lange gedrückt wird,
soll sich ein Zustand durchsetzen, der sich auf einen langsameren Takt
bezieht, wobei der schnellere Takt im Hintergrund weiterläuft.
Ich habe mir das so gedacht, dass ich einer Zustandsvariable einen
bestimmten Wert zuweise (z.B. 0). Dann lasse ich in dem langsamen Takt
einen Zähler bis 2 sek hochzählen. Wenn die 2 sek erreicht sind, wird
die Zustandsvariable auf z.B. 1 gesetzt. Nur wenn die Taste gedrückt
wird UND die Zustandsvariable 1 ist, soll der Punkt nach 2 sek
weiterlaufen.
Ist das soweit richtig? Mit der programmiertechnischen Umsetzung haberts
auch bei mir. Was passiert dann mit dem Fall, dass ich nur kurz drücke?
Ich weiß nicht, wie ich den dann einbinden soll...
Ich danke euch schonmal im Voraus :)
Gruß Cutty
Bisschen heftig für nen totalen anfägner...
glaub du musst dir erstmal klar werden, dass VHDL keine
Programmiersprache sondern n hardwarebeschreibungssprache is...also
zeichne erstmal nen Plan auf RTL Ebene und setzt das dann in VHDL um...
Soweit ichs vestanden habe hast du 2 zustände: einen wo der Punkt bleibt
wo er ist und im anderen springt er eins weiter. in den zwieten zustand
kommtst du auf 2 wege: entweder durch LOSLASSEN des tasters, oder wenn
ein Zähler so weit hochgezählt hat das er 2sec erreicht hat.
In den ersten zustand kannst du dann normal sofort
zurückspringen...wobei dann wenn du den taster weiterhind drückst, nach
2sec der punkt wieder ins weitergeht...
Gruß
Hallo :)
noch zum Verständnis: Leuchtpunkt wandert auf einer 5x7 Matrix per
Tastendruck entweder nach rechts, links, oben oder unten. bei reset
sollen alle punkte leuchten. auf 7-segmentanzeigen werden die
koordinaten angezeigt.
code fürs schieben des punktes ist zu finden unter "reset", "spalten"
und "zeilen" (kommentierte textüberschrift).
gruß Cutty
achso: @andz: bei kurzem drücken soll der punkt immer nur ein feld pro
tastendruck weiterspringen, bei langem drücken soll der punkt, solange
gedrückt wird, aller 2 sek eins weiterspringen...
Der ist echt böse...
Denn in dem Prozess werden mehrere getaktete Konstrukte und zudem noch
asynchron was beschrieben. In welchem Buch hast du das gesehen?
Ihr habt diesen Code nicht wirklich in Hardware laufen, oder?
Dann könnte der Synthesizer wieder mal mehr als ich ihm zutrauen
würde...
Die Beschreibung gehört aufgeteilt in einen getakteten Prozess
1
process(c_in,taste_reset)begin
2
if(taste_reset='0')then
3
Spalte<="11111";
4
Zeile<="0000000";
5
count_Spalte<=0;
6
count_Zeile<=0;
7
elsifrising_edge(c_in)begin
8
if(taste_rechts='1')then
9
if(count_Spalte=4)thencount_Spalte<=0;
10
elsecount_Spalte<=count_Spalte+1;
11
endif;
12
endif;
13
if(taste_links='1')then
14
:
15
endif;
16
if(taste_oben='1')then
17
:
18
endif;
19
if(taste_unten='1')then
20
:
21
endif;
22
endif;
23
endprocess;
und in einen kombinatorischen Prozess bzw. der Concurrent-Zuweisung.
1
signalcount_Spalte:...
2
signalcount_Zeile:...
3
4
process(count_Spalte)begin
5
casecount_Spalteis
6
:
7
endprocess;
8
process(count_Spalte)begin
9
casecount_Zeileis
10
:
11
endprocess;
Dann hast du nämlich auch noch die absolut unnötigen Variablen weg...
> Das funktioniert soweit auch ganz gut.
1
if(rising_edge(c_in)andtaste_rechts='1')
Welche Frequenz hat c_in? Wenn das der bei FPGA übliche 50MHz-Takt ist,
dann donnerst du während einem kurzen Tastendruck von 200ms etwa 10000
mal nach rechts... :-o
BTW: meine VHDL-Dateien enden nicht auf *.TXT
Probier mal hier im Forum eine *.VHD-Datei anzuhängen. Du wirst
staunen...
Hallo :)
> Denn in dem Prozess werden mehrere getaktete Konstrukte und zudem noch> asynchron was beschrieben. In welchem Buch hast du das gesehen?
das hat uns unser prof so gesagt...so viel dazu ;)...wir hatten zunächst
nur den takt c_in im prozess,das lief auch, gab aber n haufen warnungen
> Ihr habt diesen Code nicht wirklich in Hardware laufen, oder?
yep, haben wir ^^. da sieht man mal wieder, was so alles entsteht, wenn
man nichtwissende studenten vor so eine aufgabe stellt :)
> Welche Frequenz hat c_in? Wenn das der bei FPGA übliche 50MHz-Takt ist,> dann donnerst du während einem kurzen Tastendruck von 200ms etwa 10000> mal nach rechts... :-o
ja, es sind die 50 MHz. wir haben aber noch separat einen frequenzteiler
beschrieben. der teilt uns den takt auf 1 sek oder so runter :). hinzu
kommt ja noch, dass die tasten noch nicht mal entprellt sind...das ist
auch noch so ne aufgabe, die erledigt werden muss. haben schon tausend
möglichkeiten probiert (d-ff, rs-ff, per vhdl...), aber es verändert
sich nichts...tut immer genau dasselbe...naja.
ist es jetzt überhaupt möglich noch einen takt ins spiel zu bringen, der
für das langsame wandern des punktes benutzt werden kann? oder ist das
absoluter frevel? :)
vielen dank schonmal für die antworten
gruß Cutty
> wir haben aber noch separat einen frequenzteiler> beschrieben. der teilt uns den takt auf 1 sek oder so runter :)
D.h. der c_in ist auf 1 Hz runtergeteilt? Das wäre sehr ungünstig.
Besser ist es, das ganze Design auf 50MHz laufen zu lassen, und nur noch
mit Clock-Enables zu arbeiten. Was du also machen mußt, ist, einen
wiederkehrenden Taktimpuls (der bei 50MHz dann genau 20ns lang gilt) zu
erzeugen. So etwas also wie der clken beim Lauflicht:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html> ist es jetzt überhaupt möglich noch einen takt ins spiel zu bringen, der> für das langsame wandern des punktes benutzt werden kann? oder ist das> absoluter frevel? :)
Du tust dir garantiert keinen Gefallen, wenn du einen zweiten Takt (also
eine Abfrage auf rising_edge()) ins Spiel bringst.
Ein Anfängerdesign
- hat genau 1 Takt
- reagiert nur auf die steigende Flanke
- hat keinen asynchronen Reset (und schon gar keinen kombinatorischen)
Der dritte Punkt ist übrigens auch bei deinem Design problematisch. Du
hast nur wegen der geringen Taktfrequenz noch kein Problem damit... :-o
http://www.lothar-miller.de/s9y/categories/34-Getakteter-Prozesshttp://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html
Hallo :)
> D.h. der c_in ist auf 1 Hz runtergeteilt? Das wäre sehr ungünstig.
was hat denn unser prof dann erzählt? das war das erste, was er sagte:
ihr braucht einen frequenzteiler...hm...jetzt bin ich total verwirrt :)
> Du tust dir garantiert keinen Gefallen, wenn du einen zweiten Takt (also> eine Abfrage auf rising_edge()) ins Spiel bringst.
dann hab ich jetzt absolut keinen plan, wie ich das mit dem langsamen
laufen des leuchtpunktes machen soll...
> Ein Anfängerdesign> - hat genau 1 Takt> - reagiert nur auf die steigende Flanke> - hat keinen asynchronen Reset (und schon gar keinen kombinatorischen)
das hätte uns mal jemand eher sagen sollen :).
> Der dritte Punkt ist übrigens auch bei deinem Design problematisch. Du> hast nur wegen der geringen Taktfrequenz noch kein Problem damit... :-o
also hab ich jetzt einen asynchronen reset im programm? ich weiß noch
nicht mal was das ist, geschweige denn, wie ich das ändern kann :)
fazit: unser programm ist für die katz und nicht mehr zu retten? :)
vielen dank schonmal für die antworten
gruß Cutty
am besten du kaufst dir erstmal das buch vhdl-synthese von reichardt und
lernst im selbststudium. Das was ihr machen müsst ist nicht schwer, aber
man muss schon etwas Bescheid wissen was man eigentlich tut
> fazit: unser programm ist für die katz und nicht mehr zu retten? :)
Nein, das geht nach ein paar Aufräumarbeiten schon, du mußt nur erst mal
die Taktung auf Clock-Enables umstellen. Und dann ein Konzept für diese
Clock-Enables aufstellen.
BTW: Das mit dem Buch ist nicht die schlechteste Idee... ;-)
Hallo :)
danke für die antworten...das problem ist nur: bis zum 01.07. muss das
fertig sein. dieses forum war mein allerletzter ausweg so kurz vor
schluss :)
im grunde genommen funktioniert es...nur halt nicht besonders schön. das
kommt dann einfach in die doku mit rein und dann ist jut. ich hab nach
den ganze eskapaden keine lust mehr, mich ausgiebig mit vhdl zu
beschäftigen :)
ich glaub der prof hats uns versaut ;)
ich probier das auf jeden fall mit den clock enables...
gruß Cutty
Hallo :)
das nenn ich mal ein schönes Programm :)
wenn ich jetzt aber beim reset folgendes einfügen will (zum aufleuchten
lassen aller leds):
Zeile<="0000000";
Spalte<="11111";
bringt er eine fehlermeldung: Error (10028): Can't resolve multiple
constant drivers for net "Spalte[4]" at Schieberegister.vhd(198)
warum nur für spalte und nicht für zeile?
gruß Cutty
hier werden mit einem Verkettungsoperator, wenn ich mich richtig
informiert habe, felder angelegt, mit dem Inhalt des rechten Operanden,
gefolgt von dem Inhalt des linken Operanden. wozu dient das?
> wozu dient das?
Das ist die Beschreibung eines Scheiberegisters, in das von rechts der
Tasterpegel eingetaktet wird.
Z.B. ist usr 3 Bit breit, davon werden dann die rechten 2 Bits
genommen, um ein Bitt nach links gerückt, und der taster_unten
dazuverknüpft.
> bringt er eine fehlermeldung: Error (10028): Can't resolve multiple> constant drivers for net "Spalte[4]" at Schieberegister.vhd(198)
Ein Klassiker: du kannst nicht aus mehreren Prozessen auf 1 Signal
treiben.
Mach einen Umweg und definiere statt:
1
signalcount_Zeile:integerrange0to6:=0;
2
signalcount_Spalte:integerrange0to4:=0;
einfach einen Zustand mehr:
1
signalcount_Zeile:integerrange0to7:=0;
2
signalcount_Spalte:integerrange0to5:=0;
Und definiere: der Wert 0 ist dein Resetwert.
Dann mußt du natürlich die Tabellen und die Zähler entsprechend
anpassen:
Supi, danke schön. bin jetzt erstmal nicht im labor, schreibe übers we
an meinem bericht. ich meld mich dann nächste woche nochmal und berichte
:)
danke danke danke fürs helfen :)))
gruß Cutty
Hallo :)
es funktioniert alles super. Vielen Dank nochmal für die Hilfe. Falls
ich noch Verständnisprobleme habe, melde ich mich wieder ^^. Ich habe in
den paar Tagen im Forum mehr gelernt, als in 3 Monaten qualvollem
Selbststudiums...;)
gruß
Cutty
> als in 3 Monaten qualvollem Selbststudiums...;)
Kauf dir das Buch "VHDL-Synthese" von Reichardt/Schwarz, oder leih es
aus.
Ich vermute sehr stark, dass du es noch nicht hast... ;-)
Hallo :)
jetzt müssen wir dieses schöne programm auch in modelsim testen ^^
nur leider funktioniert das gar nicht...der rennt immer in einen
undefinierten zustand bei spalte und zeile (siehe anhang)
muss ich irgendwas besonderes beachten bei modelsim?
gruß
Cutty
es könnte hilfreich sein, die signale für die tasten
vorzuinitialisieren. dadurch sind die in der simulation nicht mehr
unbekannt ('X') sondern vielleicht '0'. Dadurch kann die Simulation dann
auch damit rechnen.
z.B.
signal teste_xxx : std_logic := '0';
Hallo :)
habs schon hingekriegt :)
es lag daran, dass ich den code fürs 2s tasten drücken noch drin
hatte...
da hätte ich mich ja wulig simuliert ^^
so reicht es völlig aus und ist richtig schön geworden
danke trotzdem :)
gruß cutty
> warum dient dieses Schieberegister zum Einsynchronisieren und für die> Flankenerkennung?
Dies Schieberegister, so wie sie da stehen, dienen zuerst nur mal zum
Eintakten/Einsynchronisieren.
Eine Flankenerkennung wird daraus, wenn irgendwo steht
1
brocessbegin
2
waituntilrising_edge(clk);
3
ifusr(2downto1)="10"then-- fallende Flanke (von 1 nach 0)
4
:
5
endif;
6
ifosr(2downto1)="01"then-- steigende Flanke (von 0 nach 1)
Hallo :)
ich versteh noch nicht so 100%ig, was diese CE-Verwaltung hier
macht...*aufdemSchlauchsteh*
Bitte nochmal mit ganz einfach Worten? Danke im Voraus :).
gruß Cutty
1
processbegin-- Clock-Enable-Verwaltung
2
waituntilrising_edge(clk);
3
onesecond<='0';
4
repeat<='0';
5
if(counter1s<50000000-1)then
6
counter1s<=counter1s+1;
7
else
8
counter1s<=0;
9
onesecond<='1';
10
endif;
11
if(onesecond='1')then
12
if(counter2s<1)then
13
counter2s<=counter2s+1;
14
else
15
repeat<='1';
16
endif;
17
endif;
18
if(untensr(2)='0'andobensr(2)='0'andrechtssr(2)='0'andlinkssr(2)='0')then-- keine Taste gedrückt
Hallo :)
habe das quartus-projekt hinter mir und wollte nur nochmal DANKE sagen
für die vielen lieben Hilfestellungen. Hat mich sehr weiter
gebracht...DANKE :)!!!
gruß
Cutty