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?
Und wo ist "res" definiert? Ausserdem ist die sensitivity list falsch.
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!!?
Achja, was ist eine "sensitivity list"?
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
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.