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
War es hilfreich?

Lösung 3

Oh, ich glaube ich ein Update gefunden, muß die folgende Bibliothek

hinzufügen
use 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top