Display de 7 Segmentos Registrado
O presente projeto é um exercicio relacionado a declaração e uso de flip-flops em VHDL. Esse projeto foi elaborado com base em um exercicio feito durante a aula de laboratório de Sistemas Digitais, ministrada na UFSC (Universidade Federal de Santa Catarina) pelo Professor Doutor Eduardo Augusto Bezerra.
O projeto foi desenvolvido em VHDL, bem como o testbench para a simulação, feita no ModelSim-Altera.
Componentes utilizados:
- 1x Kit CPLD_7064;
- 1x Placa de Botões;
- 2x Placa de Display de 7 segmentos;
- 1x Placa de Chaves;
Descrição do Funcionamento
Os Flip-Flops são elementos sincronos de memória, ou seja, só atualizam seu valor de saída quando há uma variação no clock (borda de subida ou borda de descida). O agrupamento de flip-flops é chamado de registrador. Nesse projeto será utilizado um registrador de 4 bits, ou seja, um grupo de 4 flip-flops.
Figura 1: Conjunto de Flip-Flops, formando um registrador de 4 bits.
O projeto fará a decodificação para dois displays de 7 segmentos, com um dado de quatro bits de entrada. Isso será feito, fazendo com que um dos displays apresente diretamente o valor no dado de entrar e o segundo display só será atualizado quando houver um pulso no Clock dos flip-flops (neste caso será utilizado um botão para o clock). A figura abaixo ilustra o funcionamento do projeto:
Figura 2: Circuito a ser montado.
Projeto em VHDL
Para a implementação do projetos proposto, precisamos primeiramente ver com fazer a declaração de um Flip-Flop em VHDL comportamental. A estrutura abaixo é uma declaração de um flip-flop, onde d é um sinal de um bit de entrada e q a saída de um bit:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
process (CLOCK, CLEARn) if CLEARn = '0' then q <= '0'; elsif CLOCK'event and CLOCK = '1' then q <= '1'; end if; end process; |
O código é equivalente a um flip-flop do tipo D sem preset.
Figura 3: Flip-Flop do tipo D com preset.
Para expandir a quantidade de flip-flops,basta mudar a declaração dos sinais de entrada e saída para um vetor com o número desejado de bits. Utilizaremos declaração (3 downto 0) para declarar os sinais. Abaixo está declarada a entidade do projeto. As saídas serão apenas os segmentos dos displays, a saída dos flip-flops serão ligadas ao decodificador para display de 7 segmentos. O clock utilizado será um botão, que possibilitará a escolha do número a ser armazenado.
1 2 3 4 5 6 7 8 |
entity DISP_7SEG_REG is port ( CLOCK, RESETn : in std_logic; DADO : in std_logic_vector (3 downto 0); DISP_7SEG_1, DISP_7SEG_2 : out std_logic_vector (7 downto 0) ); end DISP_7SEG_REG; |
Dentro da arquitetura, apenas teremos um sinal Q, que será a saída do registrador. Como explicado anteriormente, a estrutura para a declaração do registrador é similar a declaração do flip-flop, a única diferença é que os sinais utilizados agora possuem mais de um bit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
architecture COMPORTAMENTO of DISP_7SEG_REG is signal Q : std_logic_vector (3 downto 0); begin FLIP_FLOP_4D: process(CLOCK, RESETn) begin if RESETn = '0' then Q <= "0000"; elsif CLOCK'event and CLOCK = '1' then Q <= DADO; end if; end process; |
Como temos dois displays, utilizaremos dois decodificadores, com a mesma estrutura, sendo a única diferença os sinais utilizados. Abaixo está apresentado uma das estruturas. Para montar a outra estrutura basta trocar Q por DADO e DISP_7SEG_2 por DISP_7SEG_1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
with Q select DISP_7SEG_2 <= "10000001" when "0000", -- '0' "11001111" when "0001", -- '1' "10010010" when "0010", -- '2' "10000110" when "0011", -- '3' "11001100" when "0100", -- '4' "10100100" when "0101", -- '5' "10100000" when "0110", -- '6' "10001111" when "0111", -- '7' "10000000" when "1000", -- '8' "10000100" when "1001", -- '9' "10001000" when "1010", -- 'A' "11100000" when "1011", -- 'B' "10110001" when "1100", -- 'C' "11000010" when "1101", -- 'D' "10110000" when "1110", -- 'E' "10111000" when "1111", -- 'F' "11111111" when others; |
Simulação
A simulação deste projeto se baseia na inserção de dados na entrada DADO e emulação do pressionamento do botão para o registro do dado que será mostrada no segundo display. Para simulação, será preciso apenas emular alguns valores na entrada DADO e o acionamento do botão e verificar o funcionamento. Poderia ser feito o teste de todas as possibilidades para o valor de dado, mas como o decodificador é identico ao Decodificador para Display de 7 Segmentos, onde foi testada todas as possibilidades, não será necessário emular todos os valores.
O código abaixo apresenta o comportamento do testbench implementado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
SIMULACAO: process begin CLOCK <= '0'; RESETn <= '0'; DADO <= "1000"; wait for 10ms; RESETn <= '1'; CLOCK <= '1'; wait for 10ms; DADO <= "0011"; wait for 5 ms; CLOCK <= '0'; wait for 5ms; CLOCK <= '1'; wait for 5ms; wait; |
Os nomes utilizados no testbench foram os mesmos utilizados no projeto, lembrando que isso não é necessário e a atribuição depende da ordem em que aparece no projeto e na declaração de UUT. O resultado da simulação pode ser visto abaixo na janela do ModelSim-Altera:
Figura 4: Resultado da simulação.
Estrutura Física
Figura 5: Circuito montado e funcionando.
O projeto foi implementado pensando na utilização do Kit CPLD_7064, onde o será gravado o projeto. Nas portas CON1 e CON2 serão conectados placas de display de 7 segmentos, na porta CON3 será conectada uma placa de chaves e na porta CON4 será conectada a placa de botões, que pode ser subistituída pelo botão de clock de baixa frequência, caso deseje-se utilizar mais algum periférico no projeto. O CPLD utilizado é o EPM7064 da família MAX7000S
Montagem e Roteamento
A montagem pode ser feita como na ilustração abaixo, feita no Fritizing:
Figura 6: Ilustração da montagem no Fritizing.
Com base na montagem feita e na pinagem da placa, podemos definir a pinagem do componente:
Figura 7: Pinagem atribuida para o projeto.
Gravação e Teste
Para a gravação do projeto, basta seguir as instruções dadas no tutorial. O teste é feito montando os periféricos junto ao kit CPLD e testando a inserção de dados.