VHDL Come aggiungere uno std_logic_vector con un segnale std_logic insieme?

StackOverflow https://stackoverflow.com/questions/1592582

  •  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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top