Die Überschrift beschreibt unser Problem. Wieso können wir auf den Vektor nicht addieren? In einem anderen Code haben wir dies getan und es hat funktioniert. Wo liegt das Problem? signal transmission_count : std_logic_vector(4 downto 0):= "00000"; ------------------------------------------------------------------------ --- if rising_edge(SCLK_internal) then transmission_count <= transmission_count + 1; if state = pause then transmission_count <= "00000"; end if; end if;
signal transmission_count : std_logic_vector(4 downto 0):= "00000"; if rising_edge(SCLK_internal) then if (state = pause ) then transmission_count <= "00000"; else transmission_count <= transmission_count + "00001"; end if; end if;
tmn schrieb: > Die Überschrift beschreibt unser Problem. > Wieso können wir auf den Vektor nicht addieren? Welche Bibliotheken verwendest du? Mit uneingeschränkten Vektoren rechnet man nicht:
1 | signal transmission_count : std_logic_vector(4 downto 0):= "00000"; |
2 | :
|
3 | transmission_count <= transmission_count + 1 |
Sieh dir mal das mit der numeric_std an: http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
Das funktioniert nicht. Da kommt der gleiche Fehler. Wir hatten dies so ähnlich davor schon getestet. Wir haben eine Lösung gefunden, ob es die beste ist wissen wir nicht, aber es funktioniert. if rising_edge(SCLK_internal) and state /= pause then transmission_count <= std_logic_vector(unsigned(transmission_count) + 1); elsif rising_edge(SCLK_internal) and state = pause then transmission_count <= "00000"; end if; Wo ist Lothar Miller? Kann Lothar Miller die Frage beantworten?
Wow die Antwort war schneller als wir. Wir verwenden die Libary bereits. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;
tmn schrieb: > library ieee; > use ieee.std_logic_1164.all; > use ieee.numeric_std.all; Dann verwendet man die Typen unsigned und signed zum Rechnen:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | ...
|
6 | |
7 | signal transmission_count : unsigned(4 downto 0):= "00000"; |
8 | |
9 | ------------------------------------------------------------------------
|
10 | |
11 | process(SCLK_internal) |
12 | begin
|
13 | if rising_edge(SCLK_internal) then |
14 | transmission_count <= transmission_count + 1; |
15 | if state = pause then |
16 | transmission_count <= (others => '0'); |
17 | end if; |
18 | end if; |
19 | end process; |
Btw: rising_edge(SCLK_internal) --> Wieviele Takte habt Ihr in Eurem Design? Duke
IEEE.STD_LOGIC_ARITH.ALL kann sowas, gilt aber als obsolete. Folgende RefCard listet schön alle Funktionen der gängigen VHDL-Bibliotheken auf: http://www.gstitt.ece.ufl.edu/courses/eel4712/labs/1164pkg.pdf Greetings Earthlings,
Ja daran haben wir auch gedacht, aber in der Aufgabe steht, dass wir transmission_count als 5 Bit Vektor deklarieren sollen. Wir haben eine 50MhZ Clock und eine 1MhZ Clock
tmn schrieb: > Ja daran haben wir auch gedacht, aber in der Aufgabe steht, dass wir > transmission_count als 5 Bit Vektor deklarieren sollen. Auch ein unsigend-Vektor ist ein Vektor. Er ist aber kein uneingeschränkter Vektor mehr und man kann damit Rechnen. tmn schrieb: > Wir haben eine Lösung gefunden, ob es die beste ist wissen wir nicht, > aber es funktioniert. > if rising_edge(SCLK_internal) and state /= pause then Naja, wieder mal diese unübliche Beschreibung eines Clock-Enables... tmn schrieb: > Wir haben eine 50MhZ Clock und eine 1MhZ Clock Das ist ein Takt zuviel. Nehmt den 50MHz, der reicht dann locker für alles.
:
Bearbeitet durch Moderator
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.