Laboratório - Projeto e implementação de um conversor BCD para SSD

De MediaWiki do Campus São José
Revisão de 18h07min de 18 de outubro de 2023 por Moecke (discussão | contribs) (Criou página com ';Objetivos: * Projetar um circuito digital que realize a conversão de uma entrada BCD para um saída de um mostrador de 7 segmentos. * Descrever através de uma '''tabela ve...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar
Objetivos
  • Projetar um circuito digital que realize a conversão de uma entrada BCD para um saída de um mostrador de 7 segmentos.
  • Descrever através de uma tabela verdade o funcionamento de um circuito
  • Usar a técnica do mapa de Karnaugh para minimizar a função lógica de cada saída
  • Fazer a descrição do hardware (em VHDL) do circuito obtido
  • Utilizar um kit FPGA para implementar o circuito.
  • Verificar se o circuito funciona
  • Redigir um relatório completo sobre a atividade realizada
Procedimento de laboratório
Passo 1 - Preparação
Passo 2 - Obtenção do circuito em VHDL
  • Uma vez obtidas as expressões lógicas de cada saída, escreva o código VHDL que implemente essas funções, utilizando apenas portas (and, or e not)
-- declaração da entidade.  descrição dos nomes do circuito, entradas e saidas
entity bcb2ssd is
  port (
    bcd_A, bcd_B, bcd_C, bcd_D  : in bit;   -- bits da entrada BCD
    led_A, led_B, led_C, led_D  : out bit;   -- bits da entrada BCD
    ssd_a, ssd_b, ssd_c, ssd_d, ssd_e, ssd_f, ssd_g  : out bit);   -- bits da saida SSD para o mostrador
end entity;

architecture ifsc_v1 of bcb2ssd is

begin
  -- Descrever as funcoes logicas minimizadas de cada saida SSD
  -- a = A + C + BD + B'D'
  ssd_a <= bcd_A or bcd_C or (bcd_B and bcd_D) or ((not bcd_B) and (not bcd_D));
  -- b = 
  ssd_b <=
  ...
end architecture;
  • Fazer a análise e síntese desse circuito. Corrija eventuais erros.
  • Se desejar realize a simulação com o Modelsim, variando as entradas de 0 a 15, e verifique se os valores das saídas estão corretos para 0 até 9. (opcional)
  • Anote os valores das saídas para as entradas entre 10 e 15. Os valores não foram predeterminados, pois foi usado o don't care para estas entradas.
Passo 2 - Gravação do circuito no kit FPGA
  • Veja a documentação em Preparando para gravar o circuito lógico no FPGA
  • Para o kit DE2-115, devemos escolher a FAMILY: Cyclone® IV E e o DEVICE: EP4CE115F29C7
  • Defina que as chaves SW3, SW2, SW1, SW0 serão utilizadas como as entradas bcd_A, bcd_B, bcd_C, bcd_D.
  • Defina que os leds LEDR0, LEDR1, LEDR2, LEDR3 serão utilizados para mostrar quando as entradas estão em alto
  • Defina que o mostrador HEX0 será usado para mostrar a saída.
  • Configure a associação dos pinos do FPGA com as portas do circuito:
porta da ENTITY nome do pino no FPGA número do pino no FPGA
bcd_A SW[3]
bcd_B SW[2]
bcd_C SW[1] PIN_AC28
bcd_D SW[0] PIN_AB28
led_A LEDR[3]
led_B LEDR[2]
led_C LEDR[1] PIN_F19
led_D LEDR[0] PIN_G19
ssd_a HEX0[0] PIN_G18
ssd_b HEX0[1] PIN_F22
ssd_c HEX0[1]
ssd_d HEX0[1]
ssd_e HEX0[1]
ssd_f HEX0[1]
ssd_g HEX0[1]
Passo 3
  • Realizar os seguintes testes, acionando as chaves e observando o resultado nos LEDs:
  1. Carregar um valor nas chaves DATA[3..0], mudar LOAD para ALTO e acionar a chave CLK. Verificar e anotar o comportamento. Repetir com valores diferentes nas DATA[3..0].
  2. Mudar RST para ALTO, e verificar e anotar o comportamento.
  3. Manter LOAD em BAIXO e acionar a chave CLK várias vezes (no mínimo 16 vezes). Verificar e anotar o comportamento. O comportamento é o esperado para o número de mudanças da chave CLK?
Passo 4
  • Eliminar o repique da chave CLK, inserindo no código um circuito anti-repique, com um tempo de anti-repique de 10ms:
entity COUNTER_db is
...
    CLK50MHz : in std_logic;
...
end entity

architecture ifsc_v2 of COUNTER_db is
...
	signal CLK_db:	std_logic := '0';
...
begin
	-- debouncer de 10ms
	process (CLK50MHz, CLK, RST, CLK_db) is
		constant max_cnt: natural := 500000; -- 500000 10ms para clk 20ns
		variable cnt_db : integer range 0 to max_cnt-1;
	begin
			if (RST = '1') then
				cnt_db := 0;
				CLK_db <= '0';
			elsif ((CLK = '0') and (CLK_db = '0')) or 
			      ((CLK = '1') and (CLK_db = '1')) then
				cnt_db := 0;
			elsif (rising_edge(CLK50MHz)) then
				if (cnt_db = max_cnt - 1) then
					CLK_db <= not CLK_db;
				else
					cnt_db := cnt_db + 1;
				end if;
			end if;
 	end process;
...
-- Troque no process(RST,CLK) a entrada '''CLK''' do circuito anterior pela entrada '''CLK_db'''
  • Acrescentar o pinos de entrada CLK50MHz:
CLK50MHz:     PIN_T1
  • acrescente um arquivo para restringir a análise temporal (Timing Analysis) a 50MHz para a entrada de clock CLK50MHz
Restringir a frequencia máxima de clock no Quartus II
create_clock -name CLK50MHz -period 50MHz [get_ports -no_case {clk*}]
Passo 5
  • Repita os teste feitos no Passo 3, acionando as chaves e observando o resultado nos LEDs:
  1. Carregar um valor nas chaves DATA[3..0], mudar LOAD para ALTO e acionar a chave CLK. Verificar e anotar o comportamento. Repetir com valores diferentes nas DATA[3..0].
  2. Mudar RST para ALTO, e verificar e anotar o comportamento.
  3. Manter LOAD em BAIXO e acionar a chave CLK várias vezes (no mínimo 16 vezes). Verificar e anotar o comportamento. O comportamento é o esperado para o número de mudanças da chave CLK?
  4. O que ocorre quando o contador chega ao seu valor máximo? Quais seriam as alternativas "teóricas" para evitar que isso ocorra? Proponha soluções, sem se preocupar com um código de descrição do hardware (HDL).
  • Reduza o tempo do circuito anti-repique para 1us (microsegundo) max_cnt = 50, e verifique o funcionamento da chave CLK
Relatório Técnico
  • Documentar o experimento em um relatório técnico que contenha no mínimo:
  • Identificação (título, disciplina, data, autores);
  • Introdução;
  • Descrição do procedimento realizado;
  • Resultados obtidos (com imagens dos itens importantes) e análise dos resultados;
  • Conclusão.
  • Apêndice (se desejar pode ser disponibilizados vídeos do funcionamento do circuito nos Passos 3 e 5
  • O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.

|}