Can't determine definition of operator ""and"" -- found 0 possible definitions

Gast #2198615
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?
Gast #2198709
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!!?
Moderator (Firma: Titel) Persönliche Seite #2198717
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
Gast #2198735
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.
Moderator (Firma: Titel) Persönliche Seite #2198842
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren