Tutorial VHDL 2: programas VHDL

No tutorial anterior sobre os fundamentos da linguagem de descrição de hardware VHSlC ou VHDL, discutimos o fluxo de design e a estrutura do programa VHDL. Agora é hora de aprender sobre os programas VHDL.

No entanto, observe que o pré-requisito para a programação VHDL são os fundamentos da eletrônica digital e do projeto de circuitos digitais. Para compreender completamente esses programas, é importante que você primeiro tenha conhecimento adequado de álgebra booleana, portas lógicas, circuitos lógicos combinacionais e sequenciais, etc.

Antes de começar aqui, considere fazer uma rápida atualização sobre os fundamentos da eletrônica digital.

Vamos começar com alguns programas VHDL padrão e fáceis…

O programa VHDL somador completo:
biblioteca IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entidade full_adder é
porta (a, b, cin: IN STD_LOGIC;
soma, cout: OUT STD_LOGIC);
fim completo_adder;
arquitetura full_adder_arch de full_adder é
começar
soma <= a xor b xor cin;
cout <= (a e b) ou (b e cin) ou (a e cin);
fim full_adder_arch;

O programa VHDL do decodificador 2 para 4:
biblioteca IEEE;
use IEEE.STD_LOGIC_1164.ALL;
decodificador de entidade2x4 é
porta (a, b,: IN STD_LOGIC;
o0,o1,o2,o3 :OUT STD_LOGIC);
final decodificador2x4;
arquitetura decoder_arch de decoder2x4 é
começar
o0 <= (não a) e (não b);
o1 <= a e (não b);
o2 <= (não a) e b;
o3 <= aeb;
fim decoder_arch;

O programa VHDL conversor de código binário para cinza:
biblioteca IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entidade BtoG é
porta (B0,B1,B2,B3: IN STD_LOGIC;
G0,G1,G2,G3: SAÍDA STD_LOGIC);
fim do BtoG;
arquitetura BtoG_arch de BtoG é
começar
G3 <= B3;
G2 <= B3 xou B2;
G1 <= B2 xou B1;
G0 <= B1 xou B0;
fim decoder_arch;

O programa VHDL gerador de paridade de 4 bits:
biblioteca IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entidade parity_gen é
porta (B0,B1,B2,B3: IN STD_LOGIC;
p:OUT STD_LOGIC);
fim paridade_gen;
arquitetura parity_gen_arch de parity_gen é
começar
p <= B0 xor (B1 xor (B2 xou B3));
fim parity_gen_arch;

Os programas acima apresentam o estilo de modelagem de fluxo de dados normalmente usado para circuitos lógicos combinacionais. Para escrever um programa para o circuito lógico sequencial, é melhor usar o estilo de modelagem comportamental.

Aqui estão alguns exemplos de programas VHDL que usam o estilo de modelagem comportamental.

O programa VHDL multiplexador 4×1:
biblioteca ieee;
use ieee.std_logic_1164.all;

entidade mux41 é
porta (d: em std_logic_vector (0 a 3);
s: em std_logic_vector (0 a 1);
o: fora std_logic);
final mux41;

arquitetura mux41_arch de mux41 é
começar
processo (d,s)
começar
caso s é
quando “00” => o<= d(0);
quando “01” => o<= d(1);
quando “10” => o<= d(2);
quando “11” => o<= d(3);
caso final;
fim do processo;
fim mux41_arch;

O programa VHDL do flip-flop D (com entrada de reinicialização alta ativa):
biblioteca ieee;
use ieee.std_logic_1164.all;

entidade flip_flop é
porta (clk,Din,rst: em std_logic;
P: fora std_logic;
Qnot: fora std_logic);
final flip_flop;

arquitetura my_flipflop de flip_flop é
começar
processo (clk,Din,rst)
começar
se(rst='1′) então
Q <='0';
Qnot <='1′;
elsif(clk'event e clk='1′) então
Q <=Din;
Qnot <= não Din;
fim se;
fim do processo;
terminar meu_flipflop;

O programa VHDL de contador binário de 4 bits:
biblioteca IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

contador de entidade é
Porta (rst,clk: em std_logic;
o: out std_logic_vector(0 a 3));
contador final;

arquitetura counter_arch do contador é
contagem de sinais: std_logic_vector (0 a 3);
começar
processo(primeiro,clk)
começar
se (rst = '1') então conte <= “0000”;
elsif (clk'event e clk = '1') então conte <= conte + 1;
fim se;
fim do processo;
o <= contagem;
fim counter_arch;

Se o circuito for pequeno e simples, é possível usar os dois estilos de modelagem acima para o programa VHDL. Porém, se o circuito for grande e complexo, é necessário utilizar o estilo de modelagem estrutural.

Neste estilo, um circuito grande é considerado uma interconexão de componentes menores. Isso ocorre porque o circuito completo é representado por um conjunto de componentes interligados.

Aqui está um exemplo de programa VHDL que emprega o estilo de modelagem estrutural.

O circuito somador completo usando o meio somador e OR a porta como componentes:
biblioteca IEEE;

Utilize o IEEE. STD_LOGIC_1164.all;

entidade fulladder IS
porta (a,b,cin:em STD_LOGIC;
soma, realizar: saída STD_LOGIC);
final fulladder;
——————————arquitetura do somador completo
arquitetura FA_arch do fulladder é

—————————–componente meio somador
componente half_adder é

porta (p,q :em STD_LOGIC;
s,cy: saída STD_LOGIC);
componente final;
——————————ou componente de portão
componente or_gate é

porta (p1,q1:em STD_LOGIC;
r1: saída STD_LOGIC);
componente final;
—————————-
sinal s1,c1,c2: STD_LOGIC;
começar
w1: mapa de porta half_adder (a,b,s1,c1);
w2: mapa de porta half_adder (s1,cin,sum,c2);
w3: mapa da porta or_gate (c1,c2,carry);
fim FA_arch;
————————— programa de componente meio somador
entidade half_adder é

porta (p,q: em STD_LOGIC;
s,cy : saída STD_LOGIC);
fim half_adder;
arquitetura HA_arch de half_adder IS
começar
s <= p x ou q;
cy <= p e q;
fim HA_arch;
—————————-ou programa de componente de portão
entidade ou_gate é

porta (p1,q1:em STD_LOGIC;
r1: saída STD_LOGIC);
fim ou_gate;
arquitetura or_gate_arch de or_gate IS
começar
r1 <= p1 ou q1;
fim ou_gate_arch;

Para entender melhor os três estilos de modelagem, vamos projetar um decodificador 2 para 4 usando todos os três métodos.

O decodificador 2 para 4 usando o estilo de modelagem de fluxo de dados (é o mesmo de antes):
biblioteca IEEE;

use IEEE.STD_LOGIC_1164.ALL;
decodificador de entidade2x4 é
porta (a, b,: IN STD_LOGIC;
o0,o1,o2,o3 :OUT STD_LOGIC);
final decodificador2x4;
arquitetura decoder_arch de decoder2x4 é
começar
o0 <= (não a) e (não b);
o1 <= a e (não b);
o2 <= (não a) e b;
o3 <= aeb;
fim decoder_arch;

O decodificador 2 para 4 usando o estilo de modelagem de comportamento:
biblioteca IEEE;

use IEEE.STD_LOGIC_1164.ALL;
decodificador de entidade2x4 é
porta (I: IN STD_LOGIC_VECTOR(0 a 1);
O: OUT STD_LOGIC_VECTOR (0 a 3));
final decodificador2x4;
arquitetura decoder_arch de decoder2x4 é
começar
processo (eu)
começar
caso eu seja
quando “00” => O <= “0001”;
quando “01” => O <= “0010”;
quando “10” => O <= “0100”;
quando “11” => O <= “1000”;
caso final;
fim do processo;
fim decoder_arch;

O decodificador 2 para 4 usando o estilo de modelagem estrutural:
biblioteca IEEE;

use IEEE.STD_LOGIC_1164.ALL;
decodificador de entidade2x4 é
porta (I: IN STD_LOGIC_VECTOR(0 a 1);
O: OUT STD_LOGIC_VECTOR (0 a 3));
final decodificador2x4;

arquitetura decoder_arch de decoder2x4 é
——————— E componente GATE ———————-
componente and_gate é
porta(a, b: em STD_LOGIC;
y: saída STD_LOGIC);
componente final;
——————- NÃO componente GATE ———————–
componente not_gate é
porta(m: em STD_LOGIC;
n: saída STD_LOGIC);
componente final;
—————– sinais de saída intermediários—————–
sinal p,q : STD_LOGIC;
—————- mapeamento de porta do componente ———————-
começar
w1: mapa de porta not_gate (I(0),p);
w2: mapa de porta not_gate (I(1),q);
w3: mapa de porta and_gate (p,q,O(0));
w4: mapa de porta and_gate (I(0),q,O(1));
w5: mapa de porta and_gate (p,I(1),O(2));
w3: mapa de porta and_gate (I(0),I(1),O(3));
fim decoder_arch;
——————— Programa componente AND GATE ————–
entidade and_gate é
porta(a, b: em STD_LOGIC;
y: saída STD_LOGIC);
fim e_gate;
arquitetura and_gate_arch de and_gate é
começar
y <= aeb;
fim and_gate_arch;
——————- Programa componente NOT GATE —————-
entidade not_gate é
porta(m: em STD_LOGIC;
n: saída STD_LOGIC);
fim not_gate;
arquitetura not_gate_arch de not_gate é
começar
n <= não m;
fim not_gate_arch;

Como você pode ver, podemos projetar qualquer circuito digital usando qualquer um dos estilos de modelagem. Cabe ao projetista escolher o estilo de modelagem ideal e mais adequado para descrever o circuito

No próximo tutorial, descreveremos como compilar, simular, executar e verificar esses programas VHDL ao usar a ferramenta de software MAX+II (da Altera).

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.