Display de 7 Segmentos Registrado

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:

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:

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.

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.

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.

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:

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.