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.