Forum: FPGA, VHDL & Co. Can't determine definition of operator ""and"" -- found 0 possible definitions


von Eric Cartman (Gast)


Lesenswert?

Hallo,

fuer die Uni muss ich einen kleinen Taschenrechner in VHDL 
implementieren, die Hardwareprogrammierung ist mir aber noch etwas 
fremd. Den im Titel beschriebenen Fehler bekomm ich, wenn ich zwei 
Variablen vom Typ std_logic_vector miteinander verknuepfen will. Laut 
unseren VL-Folien sollte das aber machbar sein!

Hier mal der wesentliche Code:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity calculator_core is port(
 inc, sel, rst : in std_logic;
 stageOut : out std_logic_vector(2 downto 0);
 outputVal : out std_logic_vector(7 downto 0));
end calculator_core

architecture behavioral of calculator_core is
 signal aS : std_logic_vector(7 downto 0);
 signal bS : std_logic_vector(7 downto 0);
 signal opS : std_logic_vector(7 downto 0);
 signal resS : std_logic_vector(7 downto 0);
 signal stateS : std_logic_vector(2 downto 0);


begin

...
...

selProc:process(sel,rst)
 variable aV : std_logic_vector(7 downto 0):= "00000000";
 variable bV : std_logic_vector(7 downto 0):= "00000000";
begin
 if state = "100" then
   if inc'event and inc = '0' then
     case op(2 downto 0) is
     when "001" => res := a + b;
     when "010" => res := a - b;
     when "100" => res := (aV(7 downto 0) and bV(7 downto 0));
     when others => res :=0;
    end case;
   end if;
  end if;
end process;
end behavioral;

Auch when "100" => res := aV and bV; geht nicht. Die noetigen Libs sind 
doch eigentlich eingebunden? Auch kompiliert der Code, wenn ich die 
"and"-Zeile auskommentiere und das Programm arbeitet auf der Hardware 
auch so wie es soll.

Irgendwer eine Idee?

Danke schon mal fuer die Hilfe.

Gruss

Eric Cartman

P.S. Gibt es hier keinen "Code"-Kasten oder hab ich den uebersehen?

von Valko Z. (hydravliska)


Lesenswert?

Und wo ist "res" definiert?
Ausserdem ist die sensitivity list falsch.

von Eric Cartman (Gast)


Lesenswert?

Arrrrg! Danke!
Das war jetzt zwar nicht die Loesung aber doch hat sie mich nochmal zum 
genauen anschauen des Codes verleitet. res ist vom Typ integer und auch 
bei aV und bV definiert aber das hatte ich hier mal ausenvorgelassen. 
Also der Fehler war, dass ich zwei std_logic_vectoren in einen integer 
schreiben wollte.

Jetzt muesst ihr mir nur noch eines verraten: Warum kann Quartus da 
keine richtige Fehlermeldung wie "Can't write std_logic_vector to 
integer @line 12334" oder so bringen? Sondern es kommt eine Meldung die 
mal garnichts mit dem Fehler zu tun hat!!?

von Eric Cartman (Gast)


Lesenswert?

Achja, was ist eine "sensitivity list"?

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


Lesenswert?

Eric Cartman schrieb:
> use ieee.std_logic_arith.all;
> use ieee.std_logic_unsigned.all;
> use ieee.numeric_std.all;
Warum denn immer nur... :-/
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Eric Cartman schrieb:
> Achja, was ist eine "sensitivity list"?
Das ist das, wovon du meinst, dass der Prozess vom Simulator (nur den 
interessiert diese Liste) neu berechnet werden muss:
Das hier-----------.
                   v
> selProc:process(sel,rst)
Du sagst dem Simulator damit, das du meinst, es reiche aus, den Prozess 
bei einer Änderung von sel oder rst neu zu berechnen. Das reicht in 
deinem Fall sicher nicht aus, weil ja auch eine Änderung von state 
oder inc eine Neuberechnung zwingend erfordert!!!
So wie es jetzt da steht, ist die Simulation einfach FALSCH, weil da 
Signale fehlen...

BTW:
Das hier:
1
 if state = "100" then
2
   if inc'event and inc = '0' then
3
   :
Ist eine aussergewöhnlich extrem unüblich Schreibweise eines 
Clock-Enables...

Sieh dir mal die "üblichen" Beispiele in den büchern an. Findest du da 
sowas? Nein?
Dann könnte deine Beschreibung unüblich und evtl. sogar nicht 
synthetisierbar sein...  :-o

von Eric Cartman (Gast)


Lesenswert?

Ok, klingt ja ganz interessant...

Ich hab bisher genau eine VL zu VHDL gehoert und mich an die Vorgaben 
gehalten...
Das mit use ieee.std_logic_arith.all; werd ich mal weiterleiten, dass 
war schon in der Vorlage von der Uni drin.


Das da ein Signal fehlt hab ich verstanden, nur warum laesst Quartus 
dass durchgehen? Es compiliert und ich kann dass Programm auch auf die 
Hardware schreiben und dort testen, es laeuft problemlos.

Meinst du, ich sollte
1
if state = "100" then
2
   if rising_edge(clk) then

schreiben? Ist auch bei uns in den Folien drin, und wurde als 
gleichwertig dazu vorgestellt.

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


Lesenswert?

Eric Cartman schrieb:
> Meinst du, ich sollte
> if state = "100" then
>    if rising_edge(clk) then
> schreiben?
Nein. "Üblich" im Sinne der heute verwendeten Literatur ist das hier:
1
   if rising_edge(clk) then
2
     if state = "100" then
Das können alle Synthesizer und das kann jeder lesen und erkennen, der 
bisher schon VHDL gemacht hat. Natürlich gehen auch die anderen 
Methoden:
Siehe http://www.lothar-miller.de/s9y/categories/6-Clock-Enable

>> if inc'event and inc='0' then
> Meinst du, ich sollte
>    if rising_edge(clk) then
> schreiben?
Das wäre hier ganz falsch, denn die obere Zeile beschreibt Fragmente 
eines falling_edge().
Ein rising_edge() entspräche dem
1
if inc'event and inc='1' then
Ein richtiges rising_edge, das du auch mit einem Oszi nachmessen kannst, 
hast du aber erst mit
1
if inc'event and inc'last='0' and inc='1' then
Und genau so sieht die Funktion rising_edge() dann auch aus...

von Duke Scarring (Gast)


Lesenswert?

Eric Cartman schrieb:
> Das mit use ieee.std_logic_arith.all; werd ich mal weiterleiten, dass
> war schon in der Vorlage von der Uni drin.
Dann sind die hoffnungslos veraltet... (leider)

Duke

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.