Ich beschreibe seit einiger Zeit meine CPLD und FPGA in VHDL und bin an dieser Stelle absoluter Autodidakt, da ich niemanden fragen kann. Bisher ist es mir unter Zuhilfenahme teurer und dicker Bücher und des interaktiven Tutorials von Aldec Inc. (sehr empfehlenswert!!) gelungen, große und funktionsfähige Strukturen zusammenzustricken. Zu meinem Bedauern geben die Bücher und Referenzen nicht auf jede Frage eine Antwort. Deshalb hier meine Frage zu einem Zähler (funktioniert wie er soll): 1 architecture Behavioral of EREIGNISZ is 2 signal COUNT : STD_LOGIC_VECTOR (3 downto 0); 3 ...... 4 process (TAKT) 5 begin 6 if TAKT'event and TAKT = '1' then 7 if (START = '1') then -- Start wirkt als 8 --synchrones Reset 9 COUNT <= (others => '0'); 10 elsif COUNT >= 13 then 11 COUNT <= "1101"; -- bleibt bei 13 stehen 12 else 13 COUNT <= COUNT + 1; 14 end if; 15 end if; ....... was ist mein Signal COUNT? Einmal unzweifelhaft in Zeile 2 ein Vector. Warum kann/muss ihm in den Zeilen 7 und 9 ein Einzelbit zugewiesen werden? In Zeile 10 mache ich einen arithmetischen Vergleich (Integer?) und in Zeile 13 eine aritmetische Operation. Sind die Eigenschaften des Signals COUNT kontextabhängig? Ich weiß, dass der Prof solche bescheuerten Fragen gleich in der ersten Vorlesung erläutert. Leider finde ich in der Literatur dazu nichts, was mir weiterhilft, oder ich bin zu blöd zum Suchen. Deshalb... Besten Dank für alle erhellenden Erläuterungen.
Ich nehme an Du beziehst Deine Frage auf die '0' in COUNT <= (others => '0')?! Es ist nicht ganz einfach zu erklären was das others genau ist. Das others bezieht sich in diesem Fall auf die noch nicht zugewiesenen Bits Deines Vektors COUNT. Also alle Bits des Vektors COUNT. Mit dem => '0' weist man diesen freien Bits den Wert '0' zu. others ist somit kontextabhängig von der Zuweisung in der sie steht.
Zeilen 7 und 9? Meinst du nicht 10 und 13? > COUNT <= COUNT + 1; Count ist immer ein std_logic_vector, 1 ist ein integer. Das ist genau wie in C: Warum kannst du einen float und einen integer zusammenaddieren? Weil der Compiler die noetigen Konvertierungen automatisch macht. In VHDL muss dazu nur eine der Arithmetik-Bibliotheken wie IEEE.numeric_std eingebunden sein.
Danke für eure Antworten! Wenn es jemand ausspricht, dämmert es langsam! > Das ist genau wie in C... Sorry, von C habe ich noch weniger Dunst, das lerne ich auch autodidaktisch parallel zu VHDL. :-(( Ein Glück, dass es dieses Forum gibt!
> Sind die Eigenschaften des Signals COUNT kontextabhängig?
Du sagst der Toolchain ganz am Anfang, welche Libs du verwenden willst.
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.numeric_std.ALL; |
In diesen Libraries sind die Konvertierungen und Manipulationsmöglichkeiten der Signale beschrieben. Dir ist sicher schon aufgefallen, dass sowas:
1 | COUNT <= 13; |
nicht geht. Hier müsstest du zuerst eine Konvertierung des Integers in einen Vector durchführen. BTW: Dein Beispiel lässt sich noch ein wenig kürzer beschreiben:
1 | 1 architecture Behavioral of EREIGNISZ is |
2 | 2 signal COUNT : STD_LOGIC_VECTOR (3 downto 0); |
3 | 3 ...... |
4 | 4 process (TAKT) |
5 | 5 begin |
6 | 6 if TAKT'event and TAKT = '1' then |
7 | 7 if (START = '1') then -- Start wirkt als synchrones Reset |
8 | 9 COUNT <= (others => '0'); |
9 | 10 elsif COUNT < 13 then -- bleibt bei 13 stehen, weil nur unter 13 gezählt wird |
10 | 13 COUNT <= COUNT + 1; |
11 | 14 end if; |
12 | 15 end if; |
Noch besser wäre : if rising_edge(TAKT) then anstelle von if TAKT'event and TAKT = '1' then
>> Das ist genau wie in C... > Sorry, von C habe ich noch weniger Dunst, das lerne ich auch > autodidaktisch parallel zu VHDL. :-(( Iihh, VHDL ist an Pascal angelehnt und parallel dazu C... wäähh Du armer Hund ... ;-)
Klaus Falser wrote: > Noch besser wäre : > > if rising_edge(TAKT) then > anstelle von > if TAKT'event and TAKT = '1' then ... denn dann werden auch die anderen notwendigen Zustände (z.B. TAKT'last='0') mit abgefragt, und die Simulation zeigt Grenzfälle und Schwachstellen besser auf. Da gäbe es dann noch das
1 | falling_edge() |
@ Lothar Miller > Dir ist sicher schon aufgefallen, dass sowas: > COUNT <= 13; nicht geht. Ja. Ich habe es trotzdem immer wieder versucht und dann die Konvertierung aus naheliegenden Gründen erstmal beiseite gelegt. > falling_edge() Davor wird immer gewarnt, obwohl ich sie ganz gerne mal benutze. @ Klaus Falser > Noch besser wäre : if rising_edge(TAKT) then Ja, hatte ich verucht, Die ISE 8.1.3 nimmt es nicht. Kann man Abhilfe schaffen? @ schmocka Das ist ja das Problem, dass sich so ziemlich alle VHDL-Bücher darauf stützen, dass der geschätzte Leser bereits irgendeine andere Sprache kennt (Da ich Hardwariker bin, rede ich bewusst nicht von Programmiersprachen.) Nochmals besten Dank an alle, die mir auf die Sprünge geholfen haben! Bernd
>> COUNT <= 13; nicht geht. > Ja. Ich habe es trotzdem immer wieder versucht und dann die > Konvertierung aus naheliegenden Gründen erstmal beiseite gelegt. Nimm die numeric_std.lib Darin sind schöne Konvertierungen enthalten (von Vector nach Signed/Unsigned nach Integer und zurück). >> Noch besser wäre : if rising_edge(TAKT) then > Ja, hatte ich verucht, Die ISE 8.1.3 nimmt es nicht. Doch, die nimmt es schon. > Kann man Abhilfe schaffen? Wahrscheinlich ja. Poste doch mal eine ganze Datei deiner Beschreibung (du programmierst nämlich nicht, du beschreibst. Aber das hast du bereits selber erfasst ;-) Einfach als Dateianhang anhängen. >> falling_edge() > Davor wird immer gewarnt, obwohl ich sie ganz gerne mal benutze. Na, die muß man nicht gerne benutzen, sondern nur, wo sie absolut nötig ist. Kann in einer umfangreicheren Beschreibung schon mal an den Schnittstellen auftauchen.
>> COUNT <= 13;
Der XST-User Guide behauptet hierzu, dass IEEE.STANDARD_LOGIC_ARITH
dasselbe macht wie IEEE.NUMERIC_STD. Die Probe auf das Exempel zeigt,
dass es nach Einfügen von "use IEEE.NUMERIC_STD" auch nicht
funktioniert. :-((.
Wahrscheinlich habe ich die Aldi-Version der ISE.
Das ist im Moment auch erst mal nicht besonders tragisch, wenn man es
weiß.
1 | use IEEE.STD_LOGIC_1164.all; |
2 | use IEEE.NUMERIC_STD.all; |
3 | |
4 | ...
|
5 | |
6 | COUNT <= std_logic_vector( to_unsigned(13, COUNT'length)); |
Duke
Ich weiss. Ist aber sauber. (Und man gewöhnt sich dran.) Alternativ geht (in diesem Fall):
1 | COUNT <= x"d"; |
Duke
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.