Forum: FPGA, VHDL & Co. Error (10327): VHDL error can't determine definition of operator ""+""


von tmn (Gast)


Lesenswert?

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;

von denoune (Gast)


Lesenswert?

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;

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


Lesenswert?

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

von tmn (Gast)


Lesenswert?

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?

von tmn (Gast)


Lesenswert?

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;

von Duke Scarring (Gast)


Lesenswert?

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

von Punkt Setzer (Gast)


Lesenswert?

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,

von tmn (Gast)


Lesenswert?

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

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


Lesenswert?

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