Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> VHDL

Dominando std_logic_vector: Criando Vetores de Sinais em VHDL

O tipo std_logic_vector é o padrão do VHDL para definir barramentos de sinais. Enquanto std_logic modela o estado de um único fio, std_logic_vector estende isso para um array de fios, permitindo a representação de barramentos multi-bit.

Diferente do std_logic de bit único, std_logic_vector é um tipo composto — uma coleção indexada de elementos std_logic. Ele pode conter um número arbitrário de bits, tornando-o ideal para conectar componentes que trocam dados multi-bit.

Este post do blog é parte da série Tutoriais Básicos de VHDL.

Declare um sinal std_logic_vector com a seguinte sintaxe:
signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
ou
signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
onde <name> é um identificador escolhido pelo usuário e <initial_value> é opcional. <lsb> e <msb> denotam os índices do bit menos e mais significativo, respectivamente.

A palavra-chave to ou downto especifica a direção do intervalo (ou seja, endianness). Ambas as formas funcionam, mas a maioria dos designers favorece downto para clareza. Recomendo consistentemente usar downto ao declarar vetores de bits para evitar confusão.

O código VHDL para um vetor de tamanho byte é:

signal MySlv : std_logic_vector(7 downto 0);

O código VHDL para um vetor de um bit é:

signal MySlv : std_logic_vector(0 downto 0);

O código VHDL para um intervalo vazio (zero bits) é:

signal MySlv : std_logic_vector(-1 downto 0);

Exercício

Neste tutorial em vídeo, aprenderemos como declarar sinais std_logic_vector e dar-lhes valores iniciais. Também aprendemos como iterar sobre os bits em um vetor usando um For-Loop para criar um registrador de deslocamento:

O código final que criamos neste tutorial:

 library ieee; use ieee.std_logic_1164.all; entity T11_StdLogicVectorTb is end entity; architecture sim of T11_StdLogicVectorTb is signal Slv1 : std_logic_vector(7 downto 0); signal Slv2 : std_logic_vector(7 downto 0) := (others => '0'); signal Slv3 : std_logic_vector(7 downto 0) := (others => '1'); signal Slv4 : std_logic_vector(7 downto 0) := x"AA"; signal Slv5 : std_logic_vector(0 to 7) := "10101010"; signal Slv6 : std_logic_vector(7 downto 0) := "00000001"; begin -- Registrador de deslocamento process is begin wait for 10 ns; for i in Slv6'left downto Slv6'right + 1 loop Slv6(i) <= Slv6(i-1); end loop; Slv6(Slv6'right) <= Slv6(Slv6'left); end process; end architecture; 

A janela de forma de onda no ModelSim após pressionarmos run, e darmos zoom na linha do tempo:Dominando std_logic_vector: Criando Vetores de Sinais em VHDL

Análise

Neste exercício, declaramos seis barramentos std_logic_vector, cada um com oito bits (um byte).

Sinal Slv1 foi declarado sem valor inicial. O barramento aparece como XX na captura de tela da forma de onda porque a exibição hexadecimal não pode representar valores desconhecidos. Um olhar mais atento revela que os bits individuais são na verdade U.

Sinal Slv2 usa a atribuição agregada (others => '0') para definir todos os bits como zero. Esta sintaxe concisa garante que cada elemento receba o valor especificado independentemente da largura do vetor.

Sinal Slv3 emprega a mesma técnica agregada para inicializar todo bit como um, que é exibido como FF (hex para oito 1s).

Sinal Slv4 demonstra um inicializador hexadecimal: AA. Como cada dígito hex mapeia para quatro bits, dois dígitos cobrem o vetor de 8 bits.

Sinal Slv5 contém o valor idêntico, mas expresso em binário (10101010). Ambos Slv4 e Slv5 renderizam como AA na forma de onda.

Sinal Slv6 começa com todos zeros exceto o bit menos significativo definido como 1. Um processo implementa um registrador de deslocamento para a esquerda que cicla o 1 através do vetor a cada 10 ns.

O processo aproveita os atributos left e right para manter o código genérico; redimensionar o vetor não requer mudanças no código.

Atributos adicionais existem, mas estão além do escopo deste tutorial introdutório.

Dominando std_logic_vector: Criando Vetores de Sinais em VHDL

Conclusão

Faça o Quiz Básico de VHDL – Parte 2 »
ou
Vá para o próximo tutorial »

VHDL

  1. Guia Completo de Conversões de Tipos VHDL com Numeric_Std e Std_Logic_Arith
  2. Dominando Tipos Signed vs Unsigned em VHDL: Insights Práticos
  3. Criando Listas de Strings em VHDL: Boas Práticas e Exemplo
  4. Criando um Testbench Dirigido por Tcl para um Módulo Code-Lock VHDL
  5. Finalizando Graciosamente uma Simulação de Testbench VHDL
  6. Implementando um Controlador PWM em VHDL: Projeto, Simulação e Demo em FPGA
  7. Gerando Números Aleatórios em VHDL: De Uniforme a OSVVM
  8. Projetando um FIFO Ring Buffer Robusto em VHDL com Block RAM
  9. Como Construir um Testbench de Auto-Verificação em VHDL – Guia Prático
  10. Implementando Lista Encadeada Dinâmica em VHDL com Tipos Protegidos e Ponteiros de Acesso