Processing math: 100%

Cursos / Automação Industrial / Sistemas Digitais / Aula

arrow_back Aula 09 - Circuitos Sequenciais (Parte II)

Construindo um Flip-Flop JK

Como visto nas aulas anteriores, o circuito flip-flop (FF) serve como base para a construção de circuitos de armazenamento. O Flip-Flop JK é um dos exemplos dessa classe de circuitos de armazenamento, podendo ser de borda de subida ou borda de descida. Aqui vamos implementar o FF JK com borda de subida, que funciona de acordo com a tabela 01.

J K Q ¯Q
0 0 Q ¯Q
0 1 0 1
1 0 1 0
1 1 ¯Q Q
Tabela 1 - Tabela do Flip-Flop JK

Considerando Q o valor anterior de Q. Para ocorrer essa atribuição dos valores de Q e ¯Q é necessário que ocorra uma borda de subida do clock (CLK) do circuito, ou melhor, o CLK passe do valor ‘0’ para ‘1’. A linguagem de descrição de hardware VHDL tem uma função específica para sentir essa mudança no clock, chamada de “event”.

A função “event” é aplicada a um sinal e retorna verdadeiro quando ocorre qualquer mudança no sinal. Veja nas duas expressões abaixo como sentir quando ocorre uma borda de subida ou uma borda de descida no sinal CLK.

  • Expressão 01:((CLKevent)and(CLK=1))
  • Expressão 02:((CLKevent)and(CLK=0))

A expressão 01, acima, tem duas condições, uma que retorna verdadeiro quando ocorre uma mudança no sinal CLK, realizada pela função “event”, e outra que verifica se o sinal CLK é o valor ‘1’ naquele momento. Essa expressão realiza verificação de uma borda de subida no sinal CLK. Verifique que a expressão 02 implementa uma borda de descida no sinal CLK.

Agora que você já sabe como implementar uma borda de subida ou descida analise o código 01, dado abaixo, que implementa um circuito do FF JK.

x
1
        library ieee;
2
    use ieee.std_logic_1164.all;
3
4
    --Entidade--
5
    entity flipflopJK is
6
    port(J, K, clk: in std_logic;
7
    Q, notQ: inout std_logic);
8
    end flipflopJK;
9
10
    --Arquitetura--
11
    architecture ffJK of flipflopJK is
12
    begin
13
    process(J, K, clk)
14
    begin
15
    if(clk'event and clk='1') then
16
    if(J='0' and K='0') then
17
    Q <= Q;
18
    notQ <= notQ;
19
    elsif(J='1' and K='0') then
20
    Q <= '1';
21
    notQ <= '0';
22
    elsif(J='0' and K='1') then
23
    Q <= '0';
24
    notQ <= '1';
25
    elsif(J='1' and K='1') then
26
    Q <= not Q;
27
    notQ <= not notQ;
28
    end if;
29
    end if;
30
    end process;
31
    end ffJK;
32
33
Código 1

Versão 5.3 - Todos os Direitos reservados