Eu construí um contador mod-16, e o resultado da saída é um INTEGER (todos os exemplos que vi usados INTEGER).
Eu construí um decodificador de exibição hexadecimal para 7 segmentos e sua entrada é um STD_LOGIC_VECTOR (escrevi dessa maneira porque era fácil mapear a tabela verdade).
Gostaria de conectar a saída do contador à entrada do decodificador, mas recebo erros de 'incompatibilidade de tipo' ao tentar compilar no QuartusII.
Existe uma maneira de converter de um tipo INTEGER para um tipo STD_LOGIC_VECTOR em uma listagem VHDL?
Digamos que seu contador de 4 bits tenha uma saída INTEGER SOME_INTEGER e você queira convertê-lo em um STD_LOGIC_VECTOR de 4 bits
Você também pode usar isso para inicializar vetores com números significativos
Eu acho que você pode precisar adicionar "use IEEE.STD_LOGIC_ARITH.ALL;" e / ou STD_LOGIC_UNSIGNED.
A operação complementar é conv_integer (vetor). Eu gosto de usar isso quando faço comparações. Então eu posso declarar
E então, mais tarde, eu posso usar isso em uma instrução if
EDIT: você não precisa declarar a variável como um número inteiro. Tente alterar a declaração para std_logic_vector. Os operadores + e - trabalham em std_logic_vectors.
fonte
Você pode estar interessado em usar os tipos
unsigned
esigned
deieee.numeric_std
. Eles são compatíveis comstd_logic_vector
, mas têm uma interpretação numérica (binária ou com 2 complementos). Há também a opção de colocar essa interpretaçãostd_logic_vector
, mas isso não é recomendado .fonte
Como a resposta principal diz, o método recomendado é o seguinte:
No entanto, gostaria de explicar por que isso é recomendado e por que o VHDL tem uma maneira aparentemente complicada de converter números inteiros em std_logic_vectors.
Tudo se resume a como esses tipos são visualizados pelas ferramentas.
Um standard_logic_vector é literalmente um monte de 1s ou 0s. Eu tenho 10001. Que número é esse? Bem, isto depende. É assinado ou não assinado? O SLV não sabe nem se importa. Quantos bits? Bem, quanto tempo dura o seu SLV?
Um número inteiro é assinado e, geralmente, 32 bits (se bem me lembro).
Etapa 1: Tornar meu número inteiro mais curto e sem sinal. Essa é essa parte:
Etapa 2: Pegue esses bits e use-os para conduzir o my_slv.
(Uma observação sobre terminologia.
A <= B
Em VHDL é lida em voz alta como "A é dirigido por B")Combinado, você recebe:
Quando vem de um background de programação tradicional, é muito fácil ficar preso em uma maneira de pensar em programação. Mas em VHDL o código que você escreve tem implicações físicas no hardware. Saber por que esse método funciona e é recomendado está a um passo de pensar no que você está escrevendo em termos de hardware.
Dica bônus: funções prefixadas por to_ são aquelas que reduzem / alteram os operandos. Eles os fazem sem assinatura ou com um certo comprimento ou ambos. É por isso que to_unsigned exige que você especifique o comprimento. As funções sem to_ (straight std_logic_vector (...) neste exemplo) são usadas quando os tipos já são diretamente compatíveis. "Pegue esses bits e encha-os nesse tipo, não são necessárias modificações". Estes não têm um argumento de comprimento porque os dois lados já são os mesmos. Portanto, ao construir coisas como essa, não preciso procurar, apenas penso em como estou alterando os dados.
fonte
Para converter um número inteiro em std_logic_vector, você tem várias opções. Usando numeric_std:
ou
Usando std_logic_arith:
std_logic_arith não é um padrão ieee, mas a maioria das ferramentas o compila na biblioteca IEEE e é amplamente utilizado.
fonte