hi
ich habe mir ein devlopmentboard zugelegt und zwar das: A-C8V4 von
21EDA. (also schön chinesisch)
http://www.ebay.de/itm/281285779925?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
An sich schon mal ein schönes board.
Ich bin auch gerade am durchtesten der beigelegten Software.
Bedauerlicherweise ist alles in Verilog geschrieben. Ich selber habe nur
VHDL in der Uni gelernt.
Ich habe jetzt z.B. dieses Programm:
Dieser Code zeigt auf den 8 7-Segmentanzeigen die Zahlen 7 6 5 4 3 2 1 0
an.
Als Pinzuweisung wurde wie im Bild programmiert.
Wie kann ich jetzt jeden "Strich" einzeln ansprechen?
Beim DE2-70 Board, welches wir in der Uni haben, kann man jeden "Strich"
einzeln ansprechen.
Heißt das, dass ich einen Multiplexer zur ansteuerung benötige, wo dann
mit hoher frequenz jede Zahl einzeln geschrieben wird? (vielleicht in
dem Beispielprogramm "cnt_scan"
Danke :)
Hallo,
ja, dass wird zwangsläufig auf einen Multiplexer hinauslaufen.
In der Beispiel-BESCHREIBUNG(!) (ich sehe hier keine Programme...) ist
cnt_scan ein 16 Bit-Zähler, welcher bei jedem Eingangstakt inkrementiert
(siehe ersten always-Block).
Für den Multiplexer werden aber nur die höchsten 3 Bits verwendet und
daraus das jeweilige Display enabled (durch setzen des Ausgangs auf 0)
(siehe zweiten always-Block).
Der dritte always-Block nimmt sich das Enable-Wort (welches eigentlich
die Ausgänge setzt) und besetzt entsprechend dataout_buf mit einem Wert
von 0 bis 7 (die 8 bei default dürfte nicht auftreten...)
Der vierte always-Block setzt nun die Datenausgänge in Abhängigkeit des
"dataout_buf"-Wertes. Hier könntes Du theoretisch die "leuchtenden
Striche" ändern.
Hoffe, das hilft Dir etwas weiter. LED-Multiplexer in VHDL finden sich
aber im Netz, da diese Verdrahtung auch z.B. bei einem Spartan3-Board
von Digilent gegeben ist.
Gruß und viel Erfolg,
Thomas
habe es nun gestern hin bekommen.
Das schlimmste war im grunde der Takt, da ich bei der PLL nie unter 10
MHz einstellen konnte, warscheinlich wegen dem Cyclon II EP2C8Q208C8N.
Ansonsten wäre es zu schnell gewesen und man konnte nichts erkennen.
musste also dazu einen Taktteiler nehmen, den ich damals aus der Uni
hatte, welcher letzendlich nur aus einem Zähler besteht. Aber dazu muss
man erstmal durchblicken.
hoffe es sind 2kHz (FPGA_freq hat einen integer wert von 50000000) und
wird mit 50MHz betrieben:
1
if(count6<FPGA_freq/50000)then
2
clk2khz<='0';
3
count6<=count6+1;
4
elsif(count6<(FPGA_freq/25000)-1)then
5
clk2khz<='1';
6
count6<=count6+1;
7
else
8
count6<=0;
9
endif;
dazu habe ich dann mit diesem kleinen Code das Wort HALLO und einen
strich der pro sekunde blinkt:
um die schatten zu reduzieren, habe ich immer zwischen den schritten
alle ausgeschaltet. Durch die 2khz trotzdem nicht erkennbar.
1
-- 7-Seg ansteuern
2
3
libraryieee;
4
useieee.std_logic_1164.all;
5
useieee.numeric_std.all;
6
useieee.std_logic_arith.all;
7
8
entitysegis
9
10
port
11
(
12
clk50:instd_logic;
13
reset:instd_logic;
14
s_takt:instd_logic;
15
16
segment:outstd_logic_vector(7downto0);-- welcher strich angesprochen wird
17
bereich:outstd_logic_vector(7downto0)-- welche 7-Seg angesprochen werden soll
So macht man keine Takte!
Sondern bestenfalls Clock-Enables:
1
clk2khz<='0';
2
if(count6<FPGA_freq/50000-1)then-- MINUS 1 NICHT VERGESSEN!!!
3
count6<=count6+1;
4
else
5
clk2khz<='1';
6
count6<=0;
7
endif;
Das "minus 1" nicht vergessen! Sonst zählst du einen Takt zu viel. Denn
z.B. sind es von 0...5 schon 6 Takte: 0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3...
Max K. schrieb:> Ansonsten wäre es zu schnell gewesen und man konnte nichts erkennen.
Jetzt wird das Problem langsam klarer.
> musste also dazu einen Taktteiler nehmen, den ich damals aus der Uni> hatte, welcher letzendlich nur aus einem Zähler besteht.
So wird kein Takt erzeugt!
> Aber dazu muss man erstmal durchblicken.
Achtung: du bist noch auf dem falschen Weg!
> hoffe es sind 2kHz (FPGA_freq hat einen integer wert von 50000000)
Dann mach es wie ich hier beim Lauflicht:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Das ganze Design läuft mit 10MHz und deas Lauflicht taktet trotzden nur
dreimal pro Sekunde.
Oder wie hier bei der Baudratenerzeugung:
http://www.lothar-miller.de/s9y/archives/48-RS232.html
Oder beim DCF77-Decoder:
http://www.lothar-miller.de/s9y/archives/77-DCF77-Decoder.html
Oder:
http://www.lothar-miller.de/s9y/categories/47-PWM
Oder:
http://www.lothar-miller.de/s9y/archives/63-RC-5-Empfaenger.html
Immer das selbe: das gesamte Design läuft mit ein und demselben Takt.
Nur werden über Vorteiler irgendwelche Komponenten erst nach Ablauf
einiger Takte aktiv.
Hallo,
mir fielen noch ein paar Details auf:
A) Dein Design arbeitet mit einem negativen Takt. Kann man machen,
muss man hier aber nicht. Vielleicht ist das auch nur meine Angewohnheit
immer auf eine positve Taktflanke zu triggern...
B) Du hast einen asynchronen Reset drin. Lege den Resetteil mit ein den
synchronen Teil. (Wenn Du schon auf Lothars Seiten bist, dann schau Dir
auch gleich seine Ausführungen zu asynchronen Resets an...)
C) Im Resetteil schaltest Du alle Displays an (bereich <= "00000000"),
eher solltest Du alle Displays ausschalten (bereich <= "11111111").
D) Du musst hier nicht mit PLLs oder Ähnlichen Sachen arbeiten. Das geht
viel einfacher, wenn Du Dir das chinesische Verilog-Beispiel genau
anschaust:
Hier wird ein 16 Bit-Zähler benutzt, von denen Bit 15, 14 und Bit 13 für
deine CASE-Abfrage verwendet werden können. Du lässt diesen 16
Bit-Zähler einfach mit dem 50MHz-Takt hochzählen. Die unteren 13 Bit vom
Zähler "takten" dann bei jedem Überlauf dieses 13 Bit-Zählers (Bit 12
bis Bit 0) den 3 Bit-Zähler (Bit 15 bis Bit 13). Das heisst, Du hast
automatisch einen Vorteiler von 2 hoch 13, also von 8192. Dadurch zählt
dann dein Zähler für die CASE-Abfrage mit einer Frequenz von etwas über
6kHz. Das ist gar nicht mehr so schnell. Damit kannst Du Dir dann auch
die Zwischenstufen für das Übersprechen der Segmente sparen...
Gruß,
Thomas