VHDL Wie ein std_logic_vector mit einem std_logic Signal addieren?
-
22-09-2019 - |
Frage
Ich habe
douta : in std_logic_vector (3 downto 0);
doutb : in std_logic_vector (3 downto 0);
c0 : in std_logic;
f1 : in std_logic;
f0 : in std_logic;
res : out std_logic_vector (3 downto 0);
Ich versuche, eine einfache ALU zu bauen, und eine der Funktionen dieser ALU bietet, ist wenn
f1 and f0 both = 1
res = douta plus b plus c0
so schrieb ich
f1 = '1' and f0 = '1' then res <= douta + doutb + c0;
aber offensichtlich seine nicht funktionieren, da der Datentyp douta
und doutb
ist std_logic_vector
wo als co
nur std_logic
, und ich habe diesen Fehler bei der Kompilierung
' Error 603 line 34 : Incompatible types for arithmetic operator: LHS=std_logic_vector!18, RHS=std_logic
eine Idee, wie ich kann dieses Problem beheben?
Bearbeiten auch versucht haben,
f1 = '1' and f0 = '1' then res <= douta + doutb + ("000" & c0);
aber noch kein Glück, diesmal der Compiler sagt
LHS=std_logic_vector!7, RHS=array_1_of_std_logic_3_d_0
Lösung 3
Oh, ich glaube ich ein Update gefunden, muß die folgende Bibliothek
hinzufügenuse ieee.std_logic_arith.all;
und was wir arbeiten versuchen :) Dank @jdehaan
Andere Tipps
Bitte verwenden Sie keine std_logic_vector
wenn du gehst auf sie Arithmetik zu tun. Verwenden ieee.numeric_std
und die signed
oder unsigned
Typen verwenden. Dann können Sie einfach fügen Sie Ihre ‚0‘ oder ‚1‘ zu.
Die Abhilfe std_logic_arith.all
der Verwendung ist ein Fudge eine Nicht-Standard-Bibliothek, die Sie in Portabilität Probleme bekommen können, wenn Sie Werkzeugketten ändern.
Ich schrieb eine detailliertere Seite zu diesem Thema: http://parallelpoints.com/node/3
Es gab einige Diskussionen darüber auf comp.lang.vhdl hier: http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl=en&q= Gruppe:. comp.lang.vhdl + numeric_std # 83cc0f19350fc392 und auch in der comp.lang.vhdl FAQ
Sie könnten c0 in eine std_logic_vector verwandeln. Es ist eine lange Zeit, seit ich gemacht VHDL ...
if f1 = '1' and f0 = '1' then
if c0 = '1' then
res <= douta + doutb + "0001";
else
res <= douta + doutb;
end if;
end if;
Dies ist wahrscheinlich nicht so performant, vielleicht der silizium Compiler synthetisiert es so etwas gut, vielleicht ist es eine bessere Idee, es zu schreiben, so dass c0 in einen Vektor modifiziert wird, und fügen Sie dann alle drei DOUTA, DOUTB und den Konverter c0. Eine andere Möglichkeit wäre, die Berechnungen für Bit Bit zu tun, aber dann, was haben Sie den Compiler für?
Es kann lächerlich klingen, aber manchmal der Compiler erzeugt ein besseres Ergebnis, wenn Sie es einige Hinweise, wie diese geben (es nur ausprobieren und die Ausgabe überprüfen, durch so ein kleines Beispiel keine große Sache):
if f1 = '1' and f0 = '1' then
if c0 = '1' then
res <= douta + doutb + "0001";
else
res <= douta + doutb + "0000";
end if;
end if;
Ein weiterer Rat, wenn Sie schreiben, wenn die und die Ergebnisse etwas seltsam sind, stellen ein anderes, die unentschlossen Zustände zu beheben (einige Compiler verhalten sich schlecht, wenn sie zu viel Freiheit haben!). Aber das ist aus meiner Erfahrung, die bereits zurück zu Jahr 2004 !!!
Sie brauchen nicht auf den std_logic zu einem std_logic_vector konvertieren die Zugabe zu tun. Tun Sie einfach den Zusatz wie sie ist, und stellen Sie sicher, dass „res“ genug Bits hat die maximale Antwort zu halten. In diesem Fall braucht res 5 Bit breit sein, um für sie jetzt überläuft.
Und als Stil nit, benenne nicht Ihre Eingangs-Ports „dout“. Das ist schlechte Form. Rufen Sie sie hier din, denn das ist, was sie sind. Und in der Architektur als Instantiiert diese verbinden Sie eine andere Komponente des Ausgangs-Port namens „dout“ zum „din“ dieser Komponente.