Forum: FPGA, VHDL & Co. Vector oder arithmetische Operation?


von Bernd G. (Gast)


Lesenswert?

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.

von Mathi (Gast)


Lesenswert?

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.

von Jan M. (mueschel)


Lesenswert?

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.

von Bernd G. (Gast)


Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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;

von Klaus F. (kfalser)


Lesenswert?

Noch besser wäre :

if rising_edge(TAKT) then

anstelle von

if TAKT'event and TAKT = '1' then

von schmocka (Gast)


Lesenswert?

>> 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 ... ;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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()

von Bernd G. (Gast)


Lesenswert?

@ 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

von lkmiller (Gast)


Lesenswert?

>> 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.

von Bernd G. (Gast)


Lesenswert?

>> 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ß.

von Duke Scarring (Gast)


Lesenswert?

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

von Bernd G. (Gast)


Lesenswert?

Das sieht aber auch nicht gerade elegant aus...

von Duke Scarring (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.