Forum: FPGA, VHDL & Co. [VHDL]Type Casts: Integer to std_logic_vector | Problem


von Henry D. (micro48)


Lesenswert?

Sehr geehrte Damen und Herren,

ich bin relativ frisch im Bereich VHDL und habe meine ersten 
Verständnisprobleme bei Type Casts.:)

Der folgende Code soll einen synchronen Zähler simulieren.
Er soll bis 24 zählen, dann resetten und von vorne wieder anfangen zu 
zählen.
Im Rahmen eines Uni Projektes sollen wir den Zähler 3 mal coden, jedoch 
in verschiedenen Ausführungen:

1.
Wert des Zählers soll in einem Signal vom Wert Integer gespeichert 
werden.

2.
Wert des Zählers als Signal vom Typ unsigned zwischengespeichert werden.

3.
Speicherung des Zählerwerts in einer Variable des Typs unsigned.


Zunächst Variante 1 (Signal vom Typ Integer)

Ich denke das sollte so passen und zur Typen Wandlung habe ich passende 
Funktionen im Skript gefunden. (falls ich was verbessern könnte in 
diesem Zähler, bitte anmerken ich muss wissen wo meine denkfehler sind 
:))
1
LIBRARY IEEE;
2
USE IEEE.std_logic_1164.ALL;
3
USE IEEE.numeric_std.ALL;
4
    
5
ENTITY counter IS
6
   PORT(clk, enab, res : IN std_logic;
7
       cnt_val : OUT std_logic_vector(4 DOWNTO 0));
8
END counter;
9
10
ARCHITECTURE struct OF counter IS
11
12
SIGNAL sig1 : unsigned (4 DOWNTO 0);
13
SIGNAL cnt : integer RANGE 0 TO 24;
14
15
BEGIN
16
PROCESS(clk)
17
18
      BEGIN
19
          
20
          IF clk'EVENT AND clk='1' THEN
21
            
22
             IF res='0' AND enab = '1' AND cnt <= 23 THEN
23
                 cnt <= cnt + 1;
24
             ELSIF res='1' OR cnt>=24 THEN
25
                 cnt <= 0;
26
             END IF;
27
            
28
       END IF;
29
30
END PROCESS;
31
--cnt signal von Größe 25 zu Unsigned der Größe 5
32
sig1 <= to_unsigned(cnt, 5);
33
--jetzt das neue unsigned Signal der Größe 5 (sig1) zu einem
34
--std_logic_vector wandeln, ist das so korrekt?
35
cnt_val <= std_logic_vector(sig1);
36
37
END struct;
Keine fehler soweit ich denke das könnte stimmen...


Soweit sogut, heute wollte ich die Variante mit dem Zählersignal des 
Typs unsigned machen und stoße auf einige Fragen.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity counter is 
6
  port(enab,res,clk: in std_logic;
7
    cnt_val: out std_logic_vector (4 downto 0)
8
  );
9
end counter;
10
11
architecture arch_cnt of counter is
12
13
signal sgn: unsigned (4 downto 0);
14
signal cnt: unsigned (24 downto 0);
15
16
begin
17
process(clk)
18
begin
19
  if(rising_edge(clk))then--hab diesmal eine andere methode versucht
20
    if(res='0' and enab='1')then
21
      if(cnt<=23)then
22
      cnt<=cnt+1;
23
      else
24
      --dies soll ein reset sein
25
      --wieso kann ich hier nicht einfach: cnt<=0;  machen?
26
      --Da gibts dann Errors beim Compilen?
27
      cnt<=(cnt-cnt); 
28
      end if;
29
    elsif(res='1')then
30
    cnt<=(cnt-cnt);
31
    end if;
32
  end if;
33
end process;
34
35
--hier ist die Eigentliche Quelle des Verzweifelns :)
36
--Ich habe ja schon ein unsigned Signal, aber es ist noch zu groß.
37
--ich kann ja hier keine type casts anwenden weil unsigned und --std_logic_vector ja verwand sind, aber wie bekomme ich mein 25 großes --signal auf die Größe 5 runter verkleinert?
38
sgn<=std_logic_vector(cnt);
39
cnt_val<=sgn;
40
41
end arch_cnt;

Ich würde mich sehr über Verbesserungsvorschläge freuen und natürlich 
noch mehr über Lösungsansätze bezüglich meines "type casts Problems". :)
Vielen Dank schon mal im Voraus!

Mit freundlichen Grüßen, Henry.

: Bearbeitet durch User
von peter (Gast)


Lesenswert?

Bei einer bestimmten Zuweisung:
cnt <=to_unsigned(0,cnt'length);

Addieren geht:
cnt <=cnt+1;

Gruss

von Henry D. (micro48)


Lesenswert?

vielen dank, das hat schon mal einige meiner Probleme gelöst, da hab ich 
vorhin bei den functions was missverstanden :)

Noch eine Frage:
Wieso kann ich beim Integer Signal (24 downto 0) Werte so zuweisen:
cnt<='0';
und bei signalen und variablen anderer art (24 downto 0) nur so:
cnt<=(others => '0');

??

Was für eine Logik steckt dahinter?


Vielen Dank! :)

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


Lesenswert?

Henry D. schrieb:
> Wieso kann ich beim Integer Signal (24 downto 0)
Ein Integer hat keine Breite, sondern einen Range.

> Werte so zuweisen:
> cnt<='0';
Eher so: cnt <= 0;

> und bei signalen und variablen anderer art (24 downto 0) nur so:
> cnt<=(others => '0');
Das ist bei Vektoren der Fall. Dort muss jedes einzelne Element 
explizit angesprochen werden.

> Was für eine Logik steckt dahinter?
Die Datentypen sind so definiert.

: Bearbeitet durch Moderator
von Henry D. (micro48)


Lesenswert?

Vielen Dank! :)

D.h., dass der Integer das einzige format ist, bei dem man mit
cnt <= 0; zuweist/zuweisen kann?

Bei allen anderen Formaten, die eine Range oder Breite/Raum haben müsste 
man jedem element einzelnt zuweisen? (also Vektoren und Unsigned/signed 
signalen z.b.)

Also so: cnt<=(others => '0');

??

Vielen Dank :)

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


Lesenswert?

Henry D. schrieb:
> D.h., dass der Integer das einzige format ist, bei dem man mit
> cnt <= 0; zuweist/zuweisen kann?
Nein, mit natural und anderen abgeleiteten Datentypen geht das auch. 
Und mit einem real...

> Bei allen anderen Formaten, die eine Range oder Breite/Raum haben müsste
> man jedem element einzelnt zuweisen? (also Vektoren und Unsigned/signed
> signalen z.b.)
Bei jedem Datentyp, der ein Array aus einzelnen Werten ist (ein 
std_logic_vector ist wie ein signed oder ein unsigend ein Array aus 
std_logic), muss jedes einzelne Element angesprochen und zugewiesen 
werden.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Wenn man einen Zähler haben will, dann nutzt man geschickterweise 
Integer oder unsigned mit diesen Typen kann man mit der Zuhilfenahme der 
Numeric_std addieren und subrahieren. Das hast du sicher schon erkannt, 
dass der Typ std_logic_vector ungünstig ist.



Für die Casts gibt es ein gutes Diagramm von Lothar.


http://www.lothar-miller.de/s9y/uploads/Bilder/Usage_of_numeric_std.pdf

Der hilft ungemein.

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


Lesenswert?

René D. schrieb:
> Für die Casts gibt es ein gutes Diagramm von Lothar.
Das passende Stichwort dazu ist "numeric_std":
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

von Henry D. (micro48)


Lesenswert?

OK, vielen Lieben Dank für die Hilfestellung, da wurden schon mal einige 
Verständnisprobleme geklärt :)
Auch vielen dank für das Diagramm an René D und an Lothar Miller für 
seine tolle Seite!

@ René D.: Die Aufgabenstellung war so, dehalb mussten wir einen 
sdt_logic_vector hernehmen, aber vielen dank für den tipp! ;)

MFG, Henry.

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.