mikrocontroller.net

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


Autor: Bernd G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sind die Eigenschaften des Signals COUNT  kontextabhängig?
Du sagst der Toolchain ganz am Anfang, welche Libs du verwenden willst.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

In diesen Libraries sind die Konvertierungen und 
Manipulationsmöglichkeiten der Signale beschrieben. Dir ist sicher schon 
aufgefallen, dass sowas:
      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  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 synchrones Reset
9        COUNT <= (others => '0');
10     elsif COUNT < 13 then -- bleibt bei 13 stehen, weil nur unter 13 gezählt wird
13       COUNT <= COUNT + 1;
14     end if;
15   end if;

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch besser wäre :

if rising_edge(TAKT) then

anstelle von

if TAKT'event and TAKT = '1' then

Autor: schmocka (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ... ;-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
   falling_edge()

Autor: Bernd G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

...

COUNT <= std_logic_vector( to_unsigned(13, COUNT'length));

Duke

Autor: Bernd G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht aber auch nicht gerade elegant aus...

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss. Ist aber sauber. (Und man gewöhnt sich dran.)
Alternativ geht (in diesem Fall):
COUNT <= x"d";

Duke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.