Tradução do Laboratory Exercise 3 disponível em <http://www.altera.com/education/univ/materials/digital_logic/labs/unv-labs.html> Exercícios de Laboratório 3 Latches, Flip-Flops e Registradores Este exercício tem como finalidade investigar o funcionamento de latches, flip-flops e registradores. Parte I Os FPGAs da Altera têm flip-flops dedicados que podem ser usados para implementar circuitos. Nós vamos mostrar como utilizar esses flip-flops nas partes IV deste exercício. Mas antes vamos aprender como guardar dados sem utilizar os flip-flops dedicados. A Figura 1 mostra um latch RS com circuito fechado. Uma possibilidade de descrição, a qual usa somente expressões lógicas, é mostrada na Figura 2. Se esse latch for implementado em um FPGA que contém tabelas de pesquisa de 4 entradas (LUT), então somente uma tabela é necessária, como mostra a Figura 3a. Figura 1. Latch RS com circuito fechado.
- - Descrição de um LATCH RS com circuito fechado LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY part1 IS PORT ( Clk, R, S : IN STD_LOGIC; Q : OUT STD_LOGIC); END part1; ARCHITECTURE Structural OF part1 IS SIGNAL R_g, S_g, Qa, Qb : STD_LOGIC ; ATTRIBUTE keep : boolean; ATTRIBUTE keep of R_g, S_g, Qa, Qb : SIGNAL IS true; BEGIN R_g <= R AND Clk; S_g <= S AND Clk; Qa <= NOT (R_g OR Qb); Qb <= NOT (S_g OR Qa); Q <= Qa; END Structural; Figura 2. Cuircuito Latch RS usando expressões lógicas. Apesar de o latch poder ser corretamente descrito, essa implementação não deixa que os sinais internos, como R_g e R_s, serem observados, porque eles não geram saídas para a LUT. Para preservar esses sinais é necessário incluir uma diretiva de compilação no código. Na Figura 2 a diretiva keep é incluída usando-se a declaração ATTRIBUTE; essa declaração instrui o compilador do Quartus II a usar elementos lógicos diferentes para cada sinal R_g, R_s, Qa e Qb. Ao compilar o código, o circuito gerado terá quatro LUTs de 4 entradas., como mostrado na Figura 3a.
Parte II Figura 3. Implementação do circuito da Figura 1. Crie um novo projeto no Quartus II e siga os seguintes passos: 1. Crie um novo projeto para o latch RS. Lembre-se de selecionar o chip Cyclone II EP2C35F672C6. 2. Gere um arquivo VHDL com o circuito da Figura 2 e inclua no projeto. 3. Compile o código. Usando a ferramenta RTL Viewer, examine o circuito gerado e compare com os da Figura 3. 4. Crie um arquivo vetor de formato de onda (.vwf). Desenhe formas de onda para as entradas do circuito e examine os demais sinais e saídas para confirmar o funcionamento do circuito. Utilize a simulação funcional e temporal. A Figura 4 mostra o circuito de um latch D. Execute os seguinte passos: Figura 4. Circuito de um latch D fechado.
Parte III 1. Crie um novo projeto. Usando o código de Figura 2 como base, crie um arquivo VHDL que implemente o latch D. Use a diretiva keep para garantir que o Quartus II use elementos lógicos separados para cada sinal interno. 2. Compile o código e use o RTL Viewer para examinar o circuito gerado. 3. Verifique o funcionamento do circuito usando a simulação funcional. 4. Crie um novo projeto para ser usado como entidade Top Level, a qual usará o latch D como componente. Use o SW 0 para fornecer entrada para D e SW 1 para o Clock. Conecte a saída Q ao LEDR 0. 5. Recompile seu projeto e carregue-o na placa. 6. Teste seu circuito alterando D e Clk e observando Q. A Figura 5 mostra para um flip-flop D mestre-escravo. Execute: Figura 5. Circuito de um flip-flop D mestre-esravo. 1. Crie uma novo projeto no Quartus II. Gere um arquivo VHDL que instancie duas cópias de um latch D, visto na Parte II, para implementar o esquema mestreescravo. 2. Inclua em seu projeto as devidas entradas físicas para simular o circuito na placa DE2. Use SW 0 para a entrada D, e SW 1 para o Clock. Conecte Q ao LEDR 0. 3. Compile 4. Use o RTL Viewer para examinar o circuito gerado. 5. Carregue o circuito na placa e teste sua funcionalidade alterando as entradas e observando a saída. Parte IV A Figura 6 mostra um circuito com três elementos de memória diferentes: um latch D com circuito fechado, um flip-flop D ativado na borda de subida e um flip-flop D ativado na borda de descida.
Figura 6. Circuito e formato de onda para a Parte IV. Implemente esse circuito fazendo o seguinte: 1. Crie um novo projeto. 2. Crie um arquivo VHDL que instancie os três elementos citados. Você não deve mais utilizar a diretiva keep nessa parte do exercício. A Figura 7 mostra a implementação comportamental que especifica o circuito da Figura 4. O mesmo pode ser implementado com apenas uma tabela de 4 entradas. Use analogia para implementar os flip-flops da Figura 6. 3. Compile o projeto e analise o circuito gerado usando o RTL Viewer. Verifique que o latch uma LUT e os flip-flops são implementados usando elementos lógicos do próprio FPGA. 4. Crie um arquivo de vetor de formato de onda (.vwf) que especifique as entradas e saídas do circuito. Desenhe as entradas D e Clk indicadas na Figura 6. Use a simulação funcional para obter as saídas. Observe o comportamento de cada elemento de memória.
LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY latch IS PORT ( D, Clk : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END latch ; ARCHITECTURE Behavior OF latch IS BEGIN PROCESS ( D, Clk ) BEGIN IF Clk = 1 THEN Q <= D ; END IF ; END PROCESS ; END Behavior ; Figura 7. Código comportamental que especifica o latch D com circuito fechado. Parte V Nós desejamos mostrar um valor hexadecimal A de 16 bits no display de 7 segmentos, HEX7 4. Nós também queremos que o valor hexadecimal B, também de 16 bits, seja mostrado em HEX3 0. O valores A e B são providos através dos SW 15-0. Isso será feito colocando os switches com o valor de A e depois com o valor de B; portanto, o valor de A deve ser armazenado no circuito. 1. Crie um novo projeto. 2. Escreve um arquivo VHDL que implemente as funcionalidades necessárias. Use KEY 0 como reset assíncrono ativo na borda de descida (active-low) e KEY 1 como Clock. Compile o circuito. 3. Carregue-o na placa DE2 e teste a funcionalidade do seu circuito movimentando os switches e observando os displays.