2012-11-18 32 views
5

Esiste un modo per utilizzare tipi predefiniti da STD_LOGIC_1164 o STD_NUMERIC per rappresentare un numero intero compreso tra 0 e 2^32-1? (considerando il tipo intero predefinito varia da -2^31-1 a 2^31-1)Come rappresentare un numero intero superiore a un numero intero

Ho bisogno di implementare un contatore a 32 bit e cercavo un modo per salvare il codice usando il tipo intero invece di std_logic_vector .. Qualche modello di design per questo?

O meglio chiesto: quale è il modo migliore per dichiarare un numero intero (senza segno) a 32 bit che supporta le operazioni>/<, =, + - /?

Tahnks in anticipo

Edit1: Una possibilità che ho trovato è stato quello di dichiarare un segnale come std_logic_vector (31 downto 0), e per eseguire le conversioni quando fare paragoni + o - operazioni .. ex: contatore < = contatore + std_logic_vector (senza segno (valore) + 1). Tuttavia non è stato ancora trovato un modo per eseguire la divisione (nel caso, ad esempio, 1/4 del valore del contatore è necessario)

+0

Preferisco numeric_std su std_logic_vector dove è possibile. Per la divisione per 4 (o le potenze di 2), guarda gli operatori di shift in numeric_std, oppure taglia il vettore da solo. output <= "00" & input (31 downto 2); –

risposta

7

Utilizzando i tipi Integer, si non può (almeno, non portabile, ci possono essere alcuni strumenti VHDL che vanno oltre il minimo e offrono un numero intero a 64 bit)

Usando IEEE.numeric_std, puoi dichiarare un Unsigned con un range completo a 32-bit (o 53-bit se lo desideri) e dovrebbe fare tutto ciò che vuoi. A meno che non fraintendano ciò che stai chiedendo.

+0

Questo ha risolto il problema. Ho dichiarato il mio segnale come unsigned (31 downto 0) e ora supporta le operazioni di cui avevo bisogno (a volte usando però std_logic_vector (counter) per mappare le uscite). Grazie per la risposta. – mbrandalero

+1

Come si scriverebbero interi di grandi dimensioni in un file di testo usando write() e writeline()? Normalmente, converto in numero intero come this to_integer (unsigned (sig1)). Non posso credere che stiamo usando un HDL che non può scrivere in modo nativo grandi numeri su file. –

2
use ieee.numeric_std.all; 

e quindi usare il tipo di dati unsigned - questo funziona come un vettore di bit con le operazioni matematiche definite per esso. Puoi scegliere quanti bit desideri. Ad esempio:

signal mynum : unsigned(234 downto 0) 
Problemi correlati