Hallo zusammen
ich bin gerade dabei mit einem FPGA-Bord eine LED-Matrix anzusteuern.
Die 8 Zeilen werden durch 3 Ausgänge angesprochen. Ich möchte gerne die
Zeilenauswahl durch ein Array realisieren. Das initalisieren des Arrays
habe ich hin bekommen aber leider bekomme ich die zuweiung der Ausgänge
nicht hin.
architecture Behavioral of Steuer is
type BIT_3 is array (0 to 2) of std_logic ;
type FELD_3mal8 is array (0 to 7) of BIT_3;
signal ZEILEN: FELD_3mal8 := ("000","100"
,"010","110","001","101","011","111" );
signal cnt : unsigned (4 downto 0) := (others=>'0');
begin
process (Takt) begin
if rising_edge (Takt) then
if(cnt<8) then cnt <=cnt+1;
else cnt <= (others => '0')
end if;
end if;
end process;
A<= ZEILEN (cnt,0);
B<= ZEILEN (cnt,1);
C<= ZEILEN (cnt,2);
end architecture Behavioral;
Wie bekomme ich das hin , dass ich A den Wert Zeilen [i][0], B den Wert
Zeilen [i][1] und C den Wert Zeilen [i][2] zuweisen kann.
Ich danke schonmal für die Hilfe
MfG Michael
Hallo Michael,
so müsste es funktionieren:
A<= ZEILEN(to_integer(cnt))(0);
B<= ZEILEN(to_integer(cnt))(1);
C<= ZEILEN(to_integer(cnt))(2);
Aber es wäre einfacher, A, B und C zu einem Vektor zusammenzufassen, den
Counter von 0 bis 7 laufen zu lassen und dann sofort ohne Umwege über
das Array auf den Std-Logic-Vector zu casten:
...
CBA : out std_logic_vector(2 downto 0);
...
signal cnt : unsigned (2 downto 0) := (others=>'0');
...
CBA <= std_logic_vector(cnt);
...
Aber das war ja nicht die Frage ;-)
mfg, PataMat
Michael Berger schrieb:> signal cnt : unsigned (4 downto 0) := (others=>'0');Pat a Mat schrieb:> A<= ZEILEN(to_integer(cnt))(0);
Ich denke, das sollte so gehen. Find das aber für diesen Zweck etwas
umständlich. Du kannst deinen Zähler ja auch gleich direkt mit einem
Bereichsbegrenzten Integer definieren:
1
signalcnt:integerrangeZEILEN'range;*
2
[...]
3
A<=ZEILEN(cnt,0);
* Falls du mal auf "downto" Ordnung umstellen willst aber die
Zählervariable doch aufsteigend definieren möchtest:
Danke für die Hilfe
ich werde es nachher gleich mal ausprobieren und das ergebniss Posten.
Das mit dem Vector ABC habe ich mir auch schon überlegt, aber das
problem ist, dass die Zeilen nicht binär hochgezählt werden, die haben
in den Registern in der LED-Matrix eine "komische" Reihenfolge, deswegen
musste ich das mit dem Array machen .
Wenn ich das mit der range mache , setzt er sich dann wieder automatisch
auf 0 zurück wenn er das Ende der Range ereicht hat, oder muss ich das
manuel machen .
Danke
MfG Michael
Michael Berger schrieb:> aber leider bekomme ich die zuweiung der Ausgänge nicht hin.
Welche Fehlermeldung bekommst du denn?
> signal cnt : unsigned (4 downto 0) := (others=>'0');> A <= ZEILEN (cnt,0);
Auf Arrayelemente kann nur mit Integern zugegriffen werden. Also musst
du aus deinem unsigned Vektor noch einen Integer machen:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
Michael Berger schrieb:> Wenn ich das mit der range mache , setzt er sich dann wieder automatisch> auf 0 zurück wenn er das Ende der Range ereicht hat, oder muss ich das> manuel machen .
Gute Frage, weiss ich leider nicht, müsste ich mal ausprobieren.
Habe mir angewöhnt sowas immer explizit hinzuschreiben, dann ist es dem
leser klar, die Tools machen auch sicher was sie sollen (und ich komme
mit meiner Vergesslichkeit nicht in Konflikt :-)).
Michael Berger schrieb:> Wenn ich das mit der range mache , setzt er sich dann wieder automatisch> auf 0 zurück
Nein. Die 'range Angabe ist nur für 2 Dinge gut:
1. Bereichsüberwachung im Simulator
2. Bereichseinschränkung für den Synthesizer.
Dann müssen nicht hinterher 28 Bits eines Integers wegoptimiert werden,
wenn z.B. der 'range nur 0..9 ist...
ERROR:HDLCompiler:432 -
"C:\Users\Admin\Desktop\BA-VHDL\Steuerung\Steuer.vhd" Line 73: Formal
<arg> has no actual or default value.
ERROR:HDLCompiler:541 -
"C:\Users\Admin\Desktop\BA-VHDL\Steuerung\Steuer.vhd" Line 73: Type
integer is not an array type and cannot be indexed.
Das sind meine Fehler die ich angeeit bekomme, die gleichen Fehler
habe ich in den Zeilen (74) (75).
Habe ich vielleicht vergessen eine library einzubinden
Michael Berger schrieb:> library ieee;> use ieee.std_logic_1164.all;> use ieee.std_logic_arith.all;> use ieee.std_logic_unsigned.all;> use ieee.numeric_std.all;
Die folgenden Bibliotheken reichen völlig:
Danke erstmal an alle für die Tips.
Ich denke ich muss da erstmal noch ein bischen lesen und verstehen.
ich melde mich wenn ich das Problem gelöst habe .
Danke nochmal
MfG Michael
Michael Berger schrieb:> Habe ich vielleicht vergessen eine library einzubinden
Du hast zuallererst die [ vhdl ] und [ /vhdl ] Tags (ohne die
Leerzeichen in der Klammer) am Anfang und Ende deines VHDL-Codes
vergessen. Ich habe die mal nachgetragen...
> A<= ZEILEN(to_integer(ZEILE_COUNT))(0);
Was ist ZEILE_COUNT?
Wie bekommt man daraus einen Integer?
BTW: ich mache Zähler immer mit eingeschränkten Integern und konvertiere
die dann zur Ausgabe, denn dann liest sich eine Zuweiseung und ein
Vergleich gleich ganz anders:
Hallo zusammen .
Weihnachten ist vorbei und ich hatte wieder Zeit zu arbeiten.
Dank eurer Hilfe habe ich mein Problem gelöst .
Ich habe es mit der Range ausprobiert und wenn das Ende der Range
erreicht ist wird automatisch zum Anfang der Range zurückgesetzt.
Das spart natürlich die Abfrage ob das Ende erreicht ist .
Ich habe es jetzt auf ein DIGILENT NEXYS2 Bord programmiert. Es tut was
ich ihm gesagt habe .
Mich wundert nur , dass ich folgende Fehlermeldung bekomme:
Signal <ZEILEN> is used but never assigned. Tied to default value.
Ich bedanke mich für die schnelle und gute Hilfe
MfG Michael
Viel hilft viel, oder wie?
Hast du den Post im Beitrag "Re: Variable Wert aus Array zuweisen"
[ ] nicht gesehen?
[ ] nicht verstanden?
Wenn du damit irgendwann seltsame unerklärliche Effekte wegen doppelter
Typdefinitionen bekommst, dann such hier im Forum mal nach
"std_logic_arith obsolete"...
Und es taucht immer wieder auf:
Beitrag "Re: Syntaxfehler bei Simulation, kein Syntaxfehler bei Synthese"Michael Berger schrieb:> Signal <ZEILEN> is used but never assigned. Tied to default value.
Der Synthesizer hat erkannt, dass diese Beschreibung hauptsächlich
NICHTS macht, und hat den Ausgängen A,B,C einfach direkt die Werte
"000", "100" und "010" zugewiesen. Und der Rest von ZEILEN wird eh'
niemals verwendet...
Hallo Lothar
gelesen, verstanden und noch einmal nachgelesen und dann vergessen. Habe
ich gerade geändert .
Lothar Miller schrieb:> Der Synthesizer hat erkannt, dass diese Beschreibung hauptsächlich> NICHTS macht, und hat den Ausgängen A,B,C einfach direkt die Werte> "000", "100" und "010" zugewiesen. Und der Rest von ZEILEN wird eh'> niemals verwendet...
Es werden alle 8 Kombinationen verwendet . Ist es schlimm, dass er
"NICHTS" macht ,oder muss ich da noch was ändern.
Werden die seldsamen Effekte nur auftreten wenn ich std_logic_arith
benutzte (habe ich gerade rausgenommen ), oder habe ich da noch andere
Fehler drin .
Was sagst du denn im Allgemein zu dem Programm. Das ist ein erstes
großes Projekt mit VHDL . Ist der Stil OK oder kann man da noch etwas
verbessern Ich bin für jeden Tip dankbar.
MfG Michael
Michael Berger schrieb:> Ist der Stil OK oder kann man da noch etwas> verbessern
Da kann man noch einiges verbesser. Wie sieht denn Deine Definition von
Spalte_COUNT jetzt aus, nachdem Du die unsägliche arith rasugenommen
hast?
Duke
Michael Berger schrieb:>> Und der Rest von ZEILEN wird eh' niemals verwendet...> Es werden alle 8 Kombinationen verwendet .
Nicht im geposteten Code...
> Werden die seldsamen Effekte nur auftreten wenn ich std_logic_arith> benutzte
Nein. Ob ein Signal unbenutzt ist oder nicht, das hängt nicht von der
verwendeten Arithmetik-Bibliothek ab.
> oder habe ich da noch andere Fehler drin .
Von welchem Code reden wir?
> Was sagst du denn im Allgemein zu dem Programm.
Es ist KEIN Programm! Denn VHDL ist keine Programmiersprache, sondern
eine Beschreibungssprache. Denn sonst müsste VHDL ja eher VHPL heissen.
> Ist der Stil OK oder kann man da noch etwas verbessern
Das ist, wie wenn du jemand durchs Schlüsselloch spicken lässt und
frägst: gefällt dir mein Haus? Kurz: aus dem Schnipsel kann man nichts
sagen, ausser dass die Verwendung von Groß- und Kleinschreibung
inkonsistent ist...