Decodificador para Display de 7 Segmentos em VHDL - Portal - FPGA para Todos
Publicado em Quarta, 09 Maio 2012 11:04
Este artigo apresentará o desenvolvimento de um decodificador binario para display de 7 segmentos implementado em VHDL, que apresentará o valor hexadecimal no display. O projeto foi testado no ModelSim-Altera, através de um testbench.
Figura 1: Bloco decodificador de 7 segmentos
1x Kit CPLD;
1x Placa display de 7 segmentos, anodo comum;
1x Placa de chaves.
O decodificador receberá um dado binário de quatro bits e apresentará na saída os sinais necessários para a visualização do algarismo hexadecimal correspondente ao dado de entrada no display de 7 segmentos. A tabela abaixo mostra os algarismos e os sinais necessários para que o display mostre o algarismo. Vale lembrar que se o display fosse do tipo catodo comum, as saídas presisariam receber o valor inverso.
Tabela 1: Tabela da verdade para o decodificador (valida para anodo comum).
Diferentemente do projeto em modo esquemático, no modelamento em VHDL comportamental não é necessário a elaboração do circuito lógico correspondente, basta descrever o seu funcionamento. Isso é muito útil quando se trata de projetos com mais complexos, nos quais é muito difícil elaborar o circuito. No VHDL, apresenta-se a descrição do circuito via programação e o compilador elabora o circuito correspondente.
Inicialmente, é necessário declarar as bibliotecas que serão utilizadas durante o código VHDL. As bibliotecas STD e work são declaradas implicitamente e não precisam ser declaradas novamente no VHDL. As demais bibliotecas precisam ser declaradas. A biblioteca ieee merece destaque por ser amplamente usada.
Além de declarar as bibliotecas, ainda é necessário declarar quais os pacotes da biblioteca serão utilizados. Na biblioteca ieee vale destacar os pacotes std_logic_1164, std_logic_unsigned, o numeric_std e o std_logic_arith. O primeiro define o tipo std_logic, normalmente utilizado para declarar os sinais do projeto.
Abaixo segue a declaração das bibliotecas e pacotes para este projeto:
Em seguida é necessário declarar a entidade do projeto. A entidade apresenta as entradas e saídas do projeto, sendo praticamente modelando um bloco. Além das entradas e saídas, podem ser feitas declarações genéricas, onde são declaradas constantes que podem ser referenciadas durante o código e podem ser alteradas facilmes muandando os seus valores na declaração de entidade. Neste projeto não será utilizado essa declaração. A entrada do circuito será um dado de 4 bits, declarado como um veto de std_logic numerados de 3 a 0.A saída será os 7 sinais para o display de 7 segmentos.
entity bin_7seg is
DADO : in STD_LOGIC_VECTOR(3 DOWNTO 0);
-- Sinais de saída
end bin_7seg;
Depois da declaração da entidade, será declarado a arquitetura. A arquitetura descreverá o funcionamento do projeto. Dentro dela podem ocorrer intruções concorrente ou sequencialmentes. As intruções sequenciais ocorrem em dentro da estrutura "process". Neste programa apenas utilizaremos intruções concorrentes.
Dentro da arquitetura são declarados sinais, que funcionam como ligações internas do projeto. Os sinais precisam ser declarados depois da declaração da arquitetura e antes do inicio da descrição do comportamento, como mostrado abaixo.
architecture decodificador of bin_7seg is
signal S : STD_LOGIC_VECTOR(0 to 6);
Será utilizado como sinal um vetor com 7 std_logic, os quais serão utilizados na decodificação e passaram o valor correspondennte para a saída.
Em seguida será feita as intruções do decodificador. Utilizaremos a estrutura with-select para fazer a decodificação. Essa estrutura analisa o valor de uma expressão ou dado e, dependendo desse valor, atribui um valor para a saída. Neste projeto, o dado a ser analisado é a entrada DADO, e a saída será o sinal declarado na arquitetura.
with DADO select
S <= "0000001" when "0000", -- '0'
"1001111" when "0001", -- '1'
"0010010" when "0010", -- '2'
"0000110" when "0011", -- '3'
"1001100" when "0100", -- '4'
"0100100" when "0101", -- '5'
"0100000" when "0110", -- '6'
"0001111" when "0111", -- '7'
"0000000" when "1000", -- '8'
"0000100" when "1001", -- '9'
"0001000" when "1010", -- 'A'
"1100000" when "1011", -- 'B'
"0110001" when "1100", -- 'C'
"1000010" when "1101", -- 'D'
"0110000" when "1110", -- 'E'
"0111000" when "1111", -- 'F'
Por ultimo, faz-se a atribuição dos valores do sinal para as saídas:
A <= S(0);
B <= S(1);
C <= S(2);
D <= S(3);
E <= S(4);
F <= S(5);
G <= S(6);
A simulação pode ser feita de através do modo interativo ou via testebench. Para este projeto utilizaremos um testbench. O inicio do testbench é similar ao VHDL do projeto. Primeiro declara-se as bibliotecas que serão utilizadas (normalmente as mesmas do projeto) e depois a entidade do testbench, que não possui entradas nem saídas.
entity tb_bin_7seg is
end tb_bin_7seg;
Em seguida faz-se a declaração da arquitetura e a declaração dos sinais. Os sinais foram nomeados igualmente ao aos nomes utilizados no projeto, porém isso não é necessários.
architecture simulacao of tb_bin_7seg is
signal DADO: std_logic_vector(3 downto 0);
signal A, B, C, D, E, F, G : STD_LOGIC;
Depois de declarar os sinais, faz-se a instanciação da UUT (unity under test - Unidade sob teste, tradução livre). Nesse ponto, é necessário que os sinais sejam declarados na ordem em que são declarados na UUT, independente de nomes, porém é necessário que sejam do mesmo tipo.
UUT: entity work.bin_7seg
DADO,A, B, C, D, E, F, G
Com a UUT instanciada, pode-se dar as instruções de teste. Utilizaremos um processo, estrutura onde os comando são executados sequencialmente, para fazer a simulação. No testbench foram colocadas todas os possiveis valores de DADO (de 0 a F). Abaixo segue algumas atribuições:
-- DADO recebe 0
DADO <= "0000";
wait for 100us;
-- DADO recebe 1
DADO <= "0001";
wait for 200us;
-- DADO recebe 2
DADO <= "0010";
No final do processo e da simulação é necessário, respectivamente, de um "end process;" e "end architecture;". Após completar o testbench, execute uma analise e síntese. Agora é preciso configurar o projeto para compilar o testbench quando a ferramenta de simulação for chamada. Siga o tutorial a seguir feito no wink:
COLOCAR TUTO WINK
O projeto é composto pelo módulo de CPLD, uma placa de display de sete segmentos de anodo comum e outra de chaves, conectados respectivamente no CON1 e no CON2 do CPLD, como mostra a Figura 10. Lembre-se de que o CPLD usado é o EPM7064, da família MAX7000S.
No projeto, as entradas são implementadas pela placa de chaves, as saídas pela placa de display e as funções lógicas pelo kit de CPLD.
Figura 10: Estrutura Física do Projeto
Fique atento para que o Vcc e o GND dos periféricos fiquem alinhados com o do CPLD. Veja em detalhe a ilustração da montagem do projeto, feita no Fritzing, na Figura 11.
Figura 11: Ligação na Matriz de Contatos
A Figura 12 mostra a pinagem atribuida no Pin Planner, no Quartus II, de acordo com a ligação na matriz de contatos.
Para testar o funcionamento desse projeto, monta-se a periferia como relatada na "Estrutura Física" e atribuem-se níveis lógicos na placa de chaves, analisando a combinação posta com a decodificação no display de sete segmentos. O vídeo na introdução desse exemplo apresenta o teste realizado.