2013-04-25 7 views

risposta

7

una soluzione possibile è scrivere multipli di 4 bit come valore esadecimale e aggiungere il resto in binario, ad esempio:

signal v: std_logic_vector(9 downto 0) := "01" & X"1A"; 
4

quanto ne so, non c'è modo "diretto" per ottenere quello che stai cercando. È possibile utilizzare il seguente VHDL valido.

constant init : std_logic_vector (11 downto 0) := X"11A"; 
signal v : std_logic_vector (9 downto 0) := init(9 downto 0); 
+2

o più portabile, ': = init (v'range);' –

+1

La mia risposta iniziale conteneva la parte 'v'range', ma ho provato a compilarla e ho ottenuto un errore di' Unknown identificator "v" '. Sembra che finchè il mio compilatore non ha analizzato l'intera riga non sa di 'v'. – simon

+1

ah probabilmente ha ragione. Se c'è più di una cosa nella dimensione di v, creo un sottotipo per esso (v_type o dataword o un nome di tipo descrittivo). Quindi, la parola di dati potrebbe funzionare. –

9

x"11A" è un "bit esadecimale stringa letterale". Prima di VHDL-2008, questi dovevano essere un multiplo di 4 bit, quindi il problema che stai vedendo. VHDL-2008 ha rimosso questa restrizione, quindi ora è possibile scrivere 10x"11A". Non so quanto supporto ci sia per il 2008, però.

+2

Ho bisogno di saperne di più su VHDL 2008. Sembra essere pieno di utili funzioni :) – simon

+1

C'è un buon sommario rapido sul sito di Doulos - http://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/ – EML

1

Un'altra varietà di brutto hack:

constant init : natural := 16#11A#; 
signal v : std_logic_vector(9 downto 0) := std_logic_vector(to_unsigned(init, 10)); 

Dopo aver scritto che, penso che sia la peggiore delle opzioni offerte, ma lo lascio qui come una possibilità!