VHDL Come aggiungere uno std_logic_vector con un segnale std_logic insieme?
-
22-09-2019 - |
Domanda
ho
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);
Sto cercando di costruire una semplice ALU, e una delle funzioni questo ALU fornisce è quando
f1 and f0 both = 1
res = douta plus b plus c0
così ho scritto
f1 = '1' and f0 = '1' then res <= douta + doutb + c0;
ma, ovviamente, il suo lavoro non è intenzione perché il tipo di dati e douta
doutb
è std_logic_vector
dove, come co
è solo std_logic
ed ho ottenuto questo errore quando compilazione
' Error 603 line 34 : Incompatible types for arithmetic operator: LHS=std_logic_vector!18, RHS=std_logic
idea di come posso risolvere questo problema?
modifica Inoltre hanno provato
f1 = '1' and f0 = '1' then res <= douta + doutb + ("000" & c0);
, ma ancora senza fortuna, questa volta il compilatore dice
LHS=std_logic_vector!7, RHS=array_1_of_std_logic_3_d_0
Soluzione 3
Oh Credo di avere trovato una correzione, è necessario aggiungere la seguente libreria
use ieee.std_logic_arith.all;
e quello che abbiamo provato funzionerà :) Grazie a @jdehaan
Altri suggerimenti
Si prega di non utilizzare std_logic_vector
se avete intenzione di fare aritmetica su di loro. Utilizzare ieee.numeric_std
, e utilizzare i tipi di signed
o unsigned
. Poi si può semplicemente aggiungere il '0' o '1' ad esso.
La soluzione di utilizzare std_logic_arith.all
è un fondente utilizzando una libreria non standard, che si può ottenere in problemi di portabilità quando si cambia toolchain.
Ho scritto una pagina più dettagliate su questo: http://parallelpoints.com/node/3
Si è discusso su questo su comp.lang.vhdl qui: http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl=en&q= gruppo:. comp.lang.vhdl + numeric_std # 83cc0f19350fc392 e anche nelle FAQ comp.lang.vhdl
Si potrebbe trasformare c0 in uno std_logic_vector. E 'stato molto tempo da quando ho fatto VHDL ...
if f1 = '1' and f0 = '1' then
if c0 = '1' then
res <= douta + doutb + "0001";
else
res <= douta + doutb;
end if;
end if;
Questo è probabilmente non è così performante, forse il compilatore silicio sintetizza così qualcosa di buono, forse è una migliore idea di scriverlo in modo che C0 viene modificato in un vettore e quindi aggiungere tutti e tre douta, doutb e il c0 convertitore. Un'altra opzione sarebbe quella di fare il bit di calcoli per il bit, ma allora che cosa avete il compilatore per?
Può sembrare ridicolo, ma a volte il compilatore produce un risultato migliore se si dà alcuni suggerimenti come questo (basta provare e verificare l'uscita, da un piccolo esempio, tale non è un grosso problema):
if f1 = '1' and f0 = '1' then
if c0 = '1' then
res <= douta + doutb + "0001";
else
res <= douta + doutb + "0000";
end if;
end if;
Un altro consiglio, se si scrive, se del ed i risultati sono un po 'strano, introduce un altro per fissare gli stati indecisi (alcuni compilatori comportarsi male se hanno troppa libertà!). Ma è dalla mia esperienza che è già tornando al 2004 !!!
Non è necessario convertire lo std_logic ad uno std_logic_vector per fare l'aggiunta. Basta fare l'aggiunta come è, e fare in modo che "res" ha abbastanza bit per contenere la risposta max. In questo caso res deve essere largo 5 bit in modo che esso per ora trabocco.
E come nit stile, non il nome del vostro porte di ingresso "dout". Questo è di cattivo gusto. Li chiamano din qui, perché questo è quello che sono. E nell'architettura quanto crea un'istanza questo si collega la porta di uscita di un altro componente denominato "dout" per i "din" di questo componente.