VHDL: Le infradito

Introduzione

Un flip-flop è un circuito logico in grado di mantenere i valori delle sue uscite indipendentemente dalle variazioni dei valori di ingresso, cioè di costituire uno stato di “memoria”. Questo è l’elemento che consente il passaggio dalla logica combinatoria alla logica sequenziale.

Esistono diversi tipi di infradito: astabili, bistabili e monostabili.

Astabile: è un flip-flop che comprende 2 stati instabili e che commuta periodicamente (periodo T) e spontaneamente da uno stato
all’altro.

Bistabile: che ha due stati stabili. In logica questo si traduce negli stati logici “1” o “0”.

Monostabile: ha un solo stato stabile, l’altro stato è temporaneo.

Esistono due tipi di flip-flop: asincroni e sincroni. I flip-flop sincroni hanno un ingresso Clock, cosa che non avviene nei flip-flop asincroni.

Flip-flop asincroni
– Il bilanciere RS
– Il D Latch
Flip-flop sincroni
– Il rocker D
– L’interruttore JK

Qual è la differenza tra un flip-flop e una porta logica?

Un flip-flop è un circuito logico in grado di mantenere i valori delle sue uscite indipendentemente dalle variazioni dei valori di ingresso, cioè di costituire uno stato di “memoria”. Questo è l’elemento che consente il passaggio dalla logica combinatoria alla logica sequenziale.
Un flip-flop è spesso composto da diverse porte logiche. Ecco un esempio con il flip-flop D:

Qual è la differenza tra un pulsante a levetta e un pulsante a scatto?

La differenza principale tra un flip-flop e un latch è che il flip-flop controlla gli input ma modifica l’output solo nei momenti definiti dal segnale di clock o da qualsiasi altro segnale di controllo, mentre il latch controlla gli input continuamente e risponde immediatamente alle modifiche di input.

Flip-flop D

Ora esamineremo un flip-flop D con reset asincrono. Per questo utilizzeremo un input dati per i dati che desideri comunicare.

Abbiamo bisogno di un clock (clk) perché è un flip-flop sincrono. Infine la funzione reset per passare i dati da d a q o per resettare il flip-flop.

Come funziona il flip-flop D?

  • Se il reset è 1, l’uscita q assume il valore 0.
  • Se il reset è 0, allora trasmettiamo il valore proveniente da d con q a ogni tick del clock.
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY bascule_D IS
PORT (d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END bascule_D;

ARCHITECTURE comportement OF bascule_D IS
BEGIN
PROCESS (clk, rst)
BEGIN
IF (rst='1') THEN
q <= '0';
ELSIF (clk'EVENT AND clk='1') THEN
q <= d;
END IF;
END PROCESS;
END comportement;
Ecco il risultato della simulazione:
1° tick del clock: il clock è alto, così come il reset, quindi il segnale di ingresso d non può passare nel segnale di uscita q.

Flip-flop JK

Il flip-flop JK è un tipo di flip-flop bistabile, ovvero ha due stati stabili distinti. Il suo nome, “JK”, deriva dalle lettere associate ai suoi principali porti di ingresso: J e K. Quando J e K hanno valori diversi, il flip-flop JK cambia stato secondo una sequenza ben definita. Se J è alto (1) e K è basso (0), il flip-flop assumerà lo stato “SET” (1). Se J è basso (0) e K è alto (1), il flip-flop assumerà lo stato “RESET” (0). Se J e K sono entrambi alti (1), il flip-flop si alternerà tra gli stati a ogni impulso di clock.
library ieee;
use ieee.std_logic_1164.all;

entity Bascule is
 port(J,K,Clk,Set, Reset : in std_logic;
 Q, Q_bar : out std_logic);
end Bascule;

architecture bascule_JK of Bascule is 
 signal SIG : std_logic;
 signal JK : std_logic_vector (1 downto 0);
begin
 JK(1) <= J;
 JK(0) <= K;
 process(Clk, Set, Reset)
 begin
 if (Reset = '0'and Set = '0') then
    SIG <= '0';
 elsif (Reset = '0' and Set = '1') then
    Sig <= '0';
   elsif (Reset ='1' and Set ='0') then
 Sig <='1'; 
 elsif (Reset = '1' and Set ='1') then
 if (Clk'event and Clk ='0') then 
  case JK is 
   when "00" => SIG <= SIG;
   when "01" => SIG <= '0';
   when "10" => SIG <= '1';
   when "11" => SIG <= not SIG; 
   when others => SIG <= '-';
  end case; 
  else 
   SIG <= SIG;
  end if; 
 end if; 
 end process; 
 Q <= SIG; 
 Q_bar <= not SIG; 
end bascule_JK; 
 
Ecco il risultato della simulazione: