Mudanças entre as edições de "Laboratório - Projeto e implementação de um conversor BCD para SSD"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(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...')
 
Linha 1: Linha 1:
 
;Objetivos:
 
;Objetivos:
 
* Projetar um circuito digital que realize a conversão de uma entrada BCD para um saída de um mostrador de 7 segmentos.  
 
* 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
+
* 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
+
* 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
+
* Fazer a descrição do hardware (em VHDL) do circuito obtido.
 
* Utilizar um kit FPGA para implementar o circuito.
 
* Utilizar um kit FPGA para implementar o circuito.
 
* Verificar se o circuito funciona
 
* Verificar se o circuito funciona
Linha 11: Linha 11:
 
;Passo 1 - Preparação:
 
;Passo 1 - Preparação:
 
* Identifique no kit FPGA (DE2-115) as chaves, leds e mostrador que será utilizado
 
* Identifique no kit FPGA (DE2-115) as chaves, leds e mostrador que será utilizado
* Escreva a tabela verdade do conversor
+
* Escreva a tabela verdade do conversor.  Lembre-se que nesse kit o mostrador é de catodo comum, e portanto o led acende em BAIXO e apaga em ALTO.
 +
 
 +
{| class="wikitable" style="text-align:center;"
 +
|- style="text-align:left;"
 +
!
 +
! style="font-weight:bold;" |
 +
! style="text-align:center; font-weight:bold;" | Entradas
 +
! colspan="7" style="text-align:center; font-weight:bold;" | Saídas
 +
|- style="font-weight:bold;"
 +
| Valor
 +
| Mostrador
 +
| ABCD
 +
| a
 +
| b
 +
| c
 +
| d
 +
| e
 +
| f
 +
| g
 +
|-
 +
| 0
 +
| [[Arquivo:ssd0.png|10px]]
 +
| 0000
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
| 1
 +
|-
 +
| 1
 +
| [[Arquivo:ssd1.png|10px]]
 +
| 0001
 +
| 1
 +
| 0
 +
| 0
 +
| 1
 +
| 1
 +
| 1
 +
| 1
 +
|-
 +
| 2
 +
| [[Arquivo:ssd2.png|10px]]
 +
| 0010
 +
| 0
 +
| 0
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
| 3
 +
| [[Arquivo:ssd3.png|10px]]
 +
| 0011
 +
| 0
 +
| 0
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
| 4
 +
| [[Arquivo:ssd4.png|10px]]
 +
| 0100
 +
| 1
 +
| 0
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
| 5
 +
| [[Arquivo:ssd5.png|10px]]
 +
| 0101
 +
| 0
 +
| 1
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
| 6
 +
| [[Arquivo:ssd6.png|10px]]
 +
| 0110
 +
| 0
 +
| 1
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
| 7
 +
| [[Arquivo:ssd7.png|10px]]
 +
| 0111
 +
| 0
 +
| 0
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
| 8
 +
| [[Arquivo:ssd8.png|10px]]
 +
| 1000
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
| 0
 +
|-
 +
| 9
 +
| [[Arquivo:ssd9.png|10px]]
 +
| 1001
 +
| 0
 +
| 0
 +
|
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 
* Use a técnica do mapa de Karnaugh para minimizar a função lógica de cada saída (a, b, c, d, e, f, g) (reveja a aula de [https://moodle.ifsc.edu.br/pluginfile.php/260765/mod_resource/content/2/Simplifica%C3%A7%C3%A3o%20de%20express%C3%B5es%20l%C3%B3gicas%20-%20Mapas%20de%20Karnaugh-Veitch.pdf Simplificação de expressões lógicas - Mapas de Karnaugh-Veitch]
 
* Use a técnica do mapa de Karnaugh para minimizar a função lógica de cada saída (a, b, c, d, e, f, g) (reveja a aula de [https://moodle.ifsc.edu.br/pluginfile.php/260765/mod_resource/content/2/Simplifica%C3%A7%C3%A3o%20de%20express%C3%B5es%20l%C3%B3gicas%20-%20Mapas%20de%20Karnaugh-Veitch.pdf Simplificação de expressões lógicas - Mapas de Karnaugh-Veitch]
 +
* Confira a expressão lógica obtida com [https://www.docjava.com/cpe210/kmapExplorer.html Karnaugh Map Explorer 2.0]
  
 
;Passo 2 - Obtenção do circuito em VHDL
 
;Passo 2 - Obtenção do circuito em VHDL
Linha 29: Linha 160:
 
begin
 
begin
 
   -- Descrever as funcoes logicas minimizadas de cada saida SSD
 
   -- Descrever as funcoes logicas minimizadas de cada saida SSD
   -- a = A + C + BD + B'D'
+
   -- a = (A + C + B D + B'D')' (a inversão é necessária pois a função obtida em aula é para display de anodo comum)
   ssd_a <= bcd_A or bcd_C or (bcd_B and bcd_D) or ((not bcd_B) and (not bcd_D));
+
   ssd_a <= not (bcd_A or bcd_C or (bcd_B and bcd_D) or ((not bcd_B) and (not bcd_D)));
   -- b =  
+
  -- a =  A'B'C'D + B C'D' (função obtida para o display de catodo comum)
 +
  ssd_a <= ((not bcd_A) and (not bcd_B) and (not bcd_C)  and bcd_D) or (bcd_B and (not bcd_C) and (not bcd_D));
 +
   -- b = B C'D + B C D' (função obtida para o display de catodo comum)
 
   ssd_b <=
 
   ssd_b <=
 
   ...
 
   ...
Linha 44: Linha 177:
 
*Para o kit DE2-115, devemos escolher a FAMILY: '''Cyclone® IV E'''  e o DEVICE:  '''EP4CE115F29C7'''
 
*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 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 os leds LEDR3, LEDR2, LEDR1, LEDR0 serão utilizados para mostrar quando as entradas estão em alto
 
*Defina que o mostrador HEX0 será usado para mostrar a saída.
 
*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:
+
*Realize a associação dos pinos do FPGA com as portas do circuito.  Consulte as [[Interfaces de entrada e saída da DE2-115]] para encontrar o número dos pinos, e complete a tabela abaixo:
 
<center>
 
<center>
 
{| class="wikitable" style="background-color:#ffffff; color:#202122;"
 
{| class="wikitable" style="background-color:#ffffff; color:#202122;"
Linha 115: Linha 248:
 
|}  
 
|}  
 
</center>
 
</center>
*[[Programando o FPGA através da USB-Blaster]]
+
* Após feita a configuração, realiza a programação (download do bitstream), conforme descrito em[[Programando o FPGA através da USB-Blaster]]
;Passo 3:
 
*Realizar os seguintes testes, acionando as chaves e observando o resultado nos LEDs:
 
:# 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]'''.
 
:# Mudar '''RST''' para ALTO, e  verificar e anotar o comportamento.
 
:# 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:
 
<syntaxhighlight lang=vhdl>
 
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'''
 
</syntaxhighlight>
 
 
 
:* 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
+
;Passo 4 - Testes:
:[[Restringir a frequencia máxima de clock no Quartus II]]
+
*Para verificar se o circuito funciona, realie seguintes testes, acionando as chaves e observando o resultado nos LEDs e no mostrador:
create_clock -name CLK50MHz -period 50MHz [get_ports -no_case {clk*}]
+
* Selecione nas chaves SW3, SW2, SW1, SW0, seguidamento os valores binários correspondentes aos valores de 0 a 15
 +
* Verifique se o leds LEDR3, LEDR2, LEDR1, LEDR0 acendem conforme os números.
 +
* Verifique também se o mostrador mostra corretamente os valores de 0 a 9.
 +
* Anote quais leds acendem para os valores 10 a 15.
  
;Passo 5:
+
;Passo 5 - Documentação:
* Repita os teste feitos no Passo 3, acionando as chaves e observando o resultado nos LEDs:
+
* Ao longo do procedimento anote os valores e procedimentos realizados para incluí-los no relatório.
:# 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]'''.
 
:# Mudar '''RST''' para ALTO, e  verificar e anotar o comportamento.
 
:# 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'''?
 
:# 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:
 
;Relatório Técnico:
Linha 184: Linha 270:
 
* O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.
 
* O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.
 
{{collapse bottom}}
 
{{collapse bottom}}
<!--
 
===AE4 - Conversor de binário para BCD===
 
{{collapse top | bg=lightyellow | AE4 - Conversor de binário para BCD}}
 
;Atividades:
 
Neste laboratório remoto, os alunos deverão implementar uma solução do para um circuito conversor de binário para BCD ('''bin2bcd''') com entrada binária variando entre 0 a 9999.
 
 
*Baseado no exemplo do conversor de binário para BCD - Binary-coded decimal de dois dígitos decimais (00 a 99), mostrado em aula, projete um conversor para 4 dígitos (0000 a 9999).
 
*Escreva o código em VHDL, que dada uma entrada '''A''' (entre 0 e 9999), fornece nas saídas os dígitos da milhar ('''sm'''), centena ('''sc'''), dezena ('''sd''') e unidade ('''su''').
 
 
*Utilize as diferentes estratégias ensinadas para reduzir a quantidade de elementos lógicos, aproveitando resultados intermediários, e definindo com exatidão o número de bits a ser usado. O uso de configurações diferentes no compilador Quartus Prime 20.1.1, uso de restrições de tempo através de comandos no arquivo .SDC,  e escolha do dispositivo da família de FPGA CYCLONE IV E é permitida.
 
*Realize a [[Simulação Funcional usando o ModelSim]] para mostrar que o circuito funciona.
 
{{fig|AE4(a)|Exemplo de simulação funcional de 0 a 9999| bin2bcd_SIM_fucional.png| 600 px |}}
 
 
*Analise o tempo de propagação e área ocupada (número de elementos lógicos) e tente otimizar um ou os dois parâmetros.  Se realizar diversas versões, pode anotar os valores de todas elas e fornecer todas as versões, mas foque no melhor desempenho.
 
*O número de elementos lógicos pode ser obtido no '''Flow Summary''' ou no '''Resource Usage Summary''', conforme mostram as figuras a seguir. Anote a quantidade de elementos lógicos do circuito.
 
 
{{fig|AE4(b)|Obtendo o número de elementos no "Flow Summary"| bin2bcd_logic_elements_basico.png| 600 px |}}
 
{{fig|AE4(c)|Obtendo o número de elementos no "Resource Usage Summary"| bin2bcd_logic_elements_basico_RUS.png| 600 px |}}
 
 
*O tempo máximo de propagação do circuito é obtido no '''Report Datasheet''' dentro do aplicativo '''Timing Analyser''' . 
 
*Antes de abrir o '''Timing Analyser''' é necessário realizar as etapas '''Analysis & Synthesis''',  '''Fitter''' e '''Timing Analysis'''. 
 
*Em seguida no aplicativo '''Timing Analyser''', é necessário executar o '''Create Timing Netlist''', '''Read SDC File''' e  '''Update Timing Netlist'''.
 
*Selecione o '''Set Operation Conditions''' para o modelo '''Slow 1200mV 125ºC''', pois corresponde ao pior tempo dos 3 modelos de simulação.
 
*Em seguida obtenha '''Report Datasheet'''. Anote o tempo máximo de propagação do circuito.
 
 
{{fig|AE4(d)|Exemplo de tempo máximo de propagação | bin2bcd_propagation_delay.png| 600 px |}}
 
 
*Se quiser o(a) estudante pode apresentar dois projetos, sendo um para o '''menor tempo máximo de propagação''' e outro para '''menor área ocupada''' (número de elementos lógicos).
 
 
*O arquivo QAR entregue deve ser plenamente compilável e permitir após a '''Análise e Síntese''' e execução do comando de simulação '''do tb_bin2bcd.do''' deve apresentar o resultado final.
 
 
*Neste laboratório é necessário fornecer a imagem RTL  e Technology Map usadas para obter e melhorar os circuitos, e a imagem da simulação que mostra que a versão entregue funciona.
 
 
* Não é permitido o uso do algoritmo [https://en.wikipedia.org/wiki/Double_dabble Double Dabble] para fazer a conversão entre binário e BCD.
 
 
;Entregas:
 
#Envie os arquivos QAR  contendo todos os arquivos necessário para compilar e simular os projetos.
 
#A entrega será feita através do Moodle da disciplina.
 
#Use preferencialmente o Overleaf para gerar o documento. Mas o uso de MS-Word, Libreoffice e Google Docs também é permitida.
 
#Envie um relato em PDF que:
 
:* Traga identificação (autor, título, data), e as informações essenciais para mostrar que o circuito funciona e mostrar os resultados obtidos para os parâmetros solicitados.
 
:* Descreva a metodologia seguida para reduzir o tempo de propagação e o número de elementos lógicos.
 
:* Apresente o diagrama RTL e o Technology Map do circuito.
 
:* Comprove através de imagens de simulação funcional no MODELSIM que circuito funciona.
 
:* Mostre o número de elementos lógicos usados. 
 
:* Mostre qual o tempo máximo de propagação.
 
 
;Bônus:
 
*0,5 pontos na avaliação A1 - O aluno que apresentar por primeiro a solução funcionando com comprovação por simulação.
 
*0,5 pontos na avaliação A1 - O aluno que apresentar a solução funcionando e fique em primeiro lugar no parâmetro '''menor área ocupada''', com comprovação por simulação.
 
*0,5 pontos na avaliação A1 - O aluno que apresentar a solução funcionando  e fique em primeiro lugar no parâmetro '''menor tempo máximo de propagação entre entradas e saída''', com comprovação por simulação.
 
*0,2 pontos na avaliação A1 - O aluno que apresentar por segundo a solução funcionando com comprovação por simulação.
 
*0,2 pontos na avaliação A1 - O aluno que apresentar a solução funcionando e fique em segundo lugar no parâmetro '''menor área ocupada''', com comprovação por simulação.
 
*0,2 pontos na avaliação A1 - O aluno que apresentar a solução funcionando  e fique em segundo lugar no parâmetro '''menor tempo máximo de propagação entre entradas e saída''', com comprovação por simulação.
 
 
{{collapse bottom}}
 
 
===AE4 - Laboratório de programação de FPGA - Relógio HHMMSS===
 
{{collapse top |expand=true | bg=lightyellow | AE4 - Laboratório de programação de FPGA - Relógio HHMMSS}}
 
;Objetivos:
 
*Desenvolver sistemas utilizando componentes já desenvolvidos.
 
*Apreender a instanciar componentes e conectá-los com sinais.
 
*Realizar um  projeto hierárquico.
 
 
;Consulte:
 
*[[Preparando para gravar o circuito lógico no FPGA]]
 
*[[Interfaces de entrada e saída da DE2-115]]
 
*[[Display de 7 segmentos]]
 
 
;Passo 1 - Projeto do Relogio_HHMMSS:
 
*Projete um relógio para indicar hora (HH), minuto (MM) e segundo (SS), mostrando as unidades e dezenas em 6 [[Display de 7 segmentos]], usando os seguintes componentes:
 
:* Divisor de clock para obter um sinal de período de 1 segundo. ('''div_clk''')
 
*Componente 1 - Divisor de Clock, com o valor da divisão configurável pelo parâmetro '''fclk2'''.  O sinal de saída será usado como "enable" ou "clock" a cada 1 segundo para o componente '''contador_bcd'''.
 
<syntaxhighlight lang=vhdl>
 
component div_clk is
 
generic (fclk2 : natural := 50);      -- frequencia para simulacao
 
port (
 
clk_in : in std_logic;
 
rst : in std_logic;
 
clk_out : out std_logic
 
);
 
end component;
 
 
</syntaxhighlight>
 
:*  de 00 a 99 configurável ('''contador_bcd''')
 
*Componente 2 - Contador de 00 a 99 com saída em BCD, (pode ser um contador em BCD (ou um contador binário + conversor bin2bcd). O valor final deve ser configurável pelos parâmetros '''max_dezena e max_unidade'''
 
<syntaxhighlight lang=vhdl>
 
component contador_bcd is
 
generic (max_dezena : natural := 5; max_unidade : natural := 9);
 
port (
 
  clk: in std_logic;
 
  rst: in std_logic;
 
  fim: out std_logic;
 
  bcd_unidade, bcd_dezena : out std_logic_vector(3 downto 0)
 
);
 
end component;
 
</syntaxhighlight>
 
 
Para esse contador pode ser usado o desenvolvido em aula, mas ele precisa ser modificado para permitir que o ''clock'' seja síncrono em todos os ''flip-flops''.  Assim é necessário usar um sinal de '''enable_in''' para habilitar a contagem durante um período de clock.  Também será necessário gerar o sinal de '''enable_out''' para habilitar a contagem do próximo contador.
 
 
*Componente 3 - Conversor de BCD para SSD, com um parâmetro configurável '''ac_ccn''' para selecionar o tipo de mostrador (Anodo Comum / Catodo Comum).
 
<syntaxhighlight lang=vhdl>
 
component bcd2ssd is
 
generic (ac_ccn : natural := 0);
 
port (
 
bcd_in : in std_logic_vector(3 downto 0);
 
ssd_out : out std_logic_vector(6 downto 0)
 
);
 
end component;
 
</syntaxhighlight>
 
 
*O valor ac_ccn será utilizado para configurar o circuito de modo a acender os segmentos com ALTO para display de catodo comum (ac_ccn=0), ou BAIXO para display de anodo comum (ac_ccn=1).
 
 
 
* '''Opção 1''' - Na entidade TOP LEVEL, podem ser instanciados os componentes '''div_clk''', 3 '''contador_bcd''' e 6 '''bcd2ssd''', e inseridos os inversores necessários para adequar ao hardware do kit DE2-115.
 
 
* '''Opção 2''' -  Se quiser, você pode criar um componente com um '''contador_bcd''' e dois '''bcd2ssd''' e replique 3 vezes esse componente na entidade TOP LEVEL.
 
 
*'''IMPORTANTE''': É necessário incluir um RESET no circuito sequencial e também uma entrada de enable no contador.
 
 
<syntaxhighlight lang=vhdl>
 
entity relogio_HHMMSS IS
 
        -- O valor do fclk2 corresponde a metade do periodo do clock de entrada em Hz
 
generic (fclk2 : natural := 50);  -- ao simular o circuito utilize um valor baixo para acelerar a simulaçao
 
        -- generic (fclk2 : natural := 25000000);  -- ao implementar no hardware use o valor do clock em Hz
 
port
 
(
 
clk_1sec: in  STD_LOGIC;
 
rst_SW: in STD_LOGIC;
 
ligar_SW: in STD_LOGIC;
 
ssd_DS, ssd_DM, ssd_DH: out  STD_LOGIC_VECTOR(6 downto 0);
 
ssd_US, ssd_UM, ssd_UH: out  STD_LOGIC_VECTOR(6 downto 0)
 
);
 
end entity;
 
</syntaxhighlight>
 
 
{{fig|AE5.a|RTL do Relógio Digital de 24 horas| Rtl_relogio24h.png| 800 px |}}
 
 
;Passo 2 - Simule os componentes e o relógio completo:
 
 
* Efetue a simulação funcional do '''div_clock''', definindo a entrada de '''clk_in''' como um sinal de 100 Hz, e realizando a simulação para produzir um clk_out de 1Hz.  Certifique-se que a duração do sinal alto é de apenas 1 período do sinal de clk_in.
 
 
* Efetue a simulação funcional do '''contador_bcd''' fazendo a contagem de 00 a 99 e também de 00 a DU, onde DU é um valor qualquer configurável pelo genéricos D e U. O contador só deverá contar se o '''enable_in''' estiver ALTO.  Durante a mudança de DU para 00 o '''enable_out''' deverá ir para ALTO. Na simulação use um clock de 1 segundo,  e faça uma simulação de pelo menos 120 segundos.
 
 
* Efetue a simulação do '''bcd2ssd''' testando o circuito para as estradas bcd_in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). Para os valores inválidos de entrada (10, 11, 12, 13, 14, 15), a saída deve mostrar "E" (de erro).
 
 
* Nas simulações dos circuitos sequencias é necessário iniciar o circuito com um RESET de 10 ps.
 
 
* Realize a simulação do relógio completo '''relogio_HHMMSS''' durante 48 horas.  Para esta simulação é importante configurar o divisor de clock para realizar uma divisão com um fator menor que aquele a ser usado no circuito final (veja o comentário no código acima).
 
 
{{fig|AE5.b|Simulação funcional do Relógio Digital de 24 horas| Sim_relogio24h.png| 800 px |}}
 
 
{{fig|AE5.b|Simulação funcional do Relógio Digital de 24 horas - detalhe enable 1sec| Sim_relogio24h_enable.png| 800 px |}}
 
 
;Passo 3 - Implemente o relógio no kit DE2-115:
 
 
*Após verificar que a simulação do circuito está funcionando, configurar um FPGA para implementar este circuito.  Existem duas opções de kit disponíveis com displays de sete segmentos. As informações necessárias estão em [[Preparando para gravar o circuito lógico no FPGA]].  Neste caso iremos usar o kit DE2-115 da TERASIC, pois precisamos de 6 mostradores de 7 segmentos.
 
 
* Analise o diagrama esquemático como funcionam as chaves e também o tipo de display. Note que no projeto o signal RST foi descrito como normalmente ALTO, podendo ser necessário acrescentar um inversor para ter o funcionamento correto. O [[Display de 7 segmentos]] da DE2-115 é do tipo cátodo comum.
 
 
*Dica para testar o relógio sem aguardar 24 horas. Acelere o clock de entrada do contador de segundos de 60 ou 1440 vezes, com isso o sistema realizará a contagem de 00:00:00 a 23:59:59 em ( 24 minutos ou 1 minuto).
 
 
;Passo 4 - Entregas:
 
*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, com a descrição dos componentes utilizados e o sistema completo.
 
:*resultados obtidos (com imagens dos itens importantes) e análise dos resultados;
 
:*pinagem utilizada na configuração do FPGA
 
{{collapse top| definição dos pinos}}
 
<pre>
 
</pre>
 
{{collapse bottom}}
 
:*conclusão.
 
:*apêndice (se desejar pode ser disponibilizados vídeos do funcionamento do circuito
 
 
*O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.
 
 
*O arquivo QAR contendo o projeto
 
*Os arquivos para simulação (DO) necessárias para simular o sistema '''relogio_HHMMSS''' e seus componentes.
 
* O arquivo SOF usado na programação do FPGA.
 
<center> {{#ev:youtube|orjy0GURH_U}} </center>
 
{{collapse bottom}}
 
-->
 

Edição das 18h36min de 18 de outubro de 2023

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
  • Identifique no kit FPGA (DE2-115) as chaves, leds e mostrador que será utilizado
  • Escreva a tabela verdade do conversor. Lembre-se que nesse kit o mostrador é de catodo comum, e portanto o led acende em BAIXO e apaga em ALTO.
Entradas Saídas
Valor Mostrador ABCD a b c d e f g
0 Ssd0.png 0000 0 0 0 0 0 0 1
1 Ssd1.png 0001 1 0 0 1 1 1 1
2 Ssd2.png 0010 0 0
3 Ssd3.png 0011 0 0
4 Ssd4.png 0100 1 0
5 Ssd5.png 0101 0 1
6 Ssd6.png 0110 0 1
7 Ssd7.png 0111 0 0
8 Ssd8.png 1000 0 0 0 0 0 0 0
9 Ssd9.png 1001 0 0
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 + B D + B'D')' (a inversão é necessária pois a função obtida em aula é para display de anodo comum)
  ssd_a <= not (bcd_A or bcd_C or (bcd_B and bcd_D) or ((not bcd_B) and (not bcd_D)));
  -- a =  A'B'C'D + B C'D' (função obtida para o display de catodo comum)
  ssd_a <= ((not bcd_A) and (not bcd_B) and (not bcd_C)  and bcd_D) or (bcd_B and (not bcd_C) and (not bcd_D));
  -- b =  B C'D + B C D' (função obtida para o display de catodo comum)
  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 LEDR3, LEDR2, LEDR1, LEDR0 serão utilizados para mostrar quando as entradas estão em alto
  • Defina que o mostrador HEX0 será usado para mostrar a saída.
  • Realize a associação dos pinos do FPGA com as portas do circuito. Consulte as Interfaces de entrada e saída da DE2-115 para encontrar o número dos pinos, e complete a tabela abaixo:
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 4 - Testes
  • Para verificar se o circuito funciona, realie seguintes testes, acionando as chaves e observando o resultado nos LEDs e no mostrador:
  • Selecione nas chaves SW3, SW2, SW1, SW0, seguidamento os valores binários correspondentes aos valores de 0 a 15
  • Verifique se o leds LEDR3, LEDR2, LEDR1, LEDR0 acendem conforme os números.
  • Verifique também se o mostrador mostra corretamente os valores de 0 a 9.
  • Anote quais leds acendem para os valores 10 a 15.
Passo 5 - Documentação
  • Ao longo do procedimento anote os valores e procedimentos realizados para incluí-los no relatório.
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.

|}