Již dříve jsem napsal návod, který se věnoval základnímu zprovoznění FPGA kitu Cyclone II s programátorem USB blaster, který najdete zde. V tomto návodu navazuji na předchozí ukázku blikání LED diodami, kdy jsem si připravil 2 způsoby, jak pracovat s tlačítkem připojeným na vstup.

Vývojový FPGA kit Cyclone II a připojení tlačítka

Pro začátek se podíváme na zapojení. Pro něj je potřeba zapojit tlačítko s pull-up odporem podobným způsobem, jako jste to už zajisté viděli v Arduino návodech. Zapojíme tedy jeden pin tlačítka na GND a druhý přes odpor na VCC. A následně vyvedeme bod mezi odporem a tlačítkem na libovolný volný datový pin FPGA, kdy já jsem zvolil pin 4.

Vývojový FPGA kit Cyclone II a připojení tlačítka

První jednoduchý ukázkový kód pracuje zjednodušeně tak, že přiřadíme vstupní pin tlačítka na LED diodu. Tím dosáhneme toho, že vždy jedna LED dioda svítí a druhá ne, protože je do ní nahraná negovaná (tedy opačná) hodnota.

-- Prace s tlacitkem
-- navody.dratek.cz

-- pripojeni potrebnych knihoven
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- vytvoreni entity s porty
entity pouziti_tlacitka is
  port (
    clk : in std_logic;
    tlac : in std_logic;
    led1 : out std_logic;
    led2 : out std_logic;
    led3 : out std_logic
  );
end pouziti_tlacitka;

-- vytvoreni architektury pro entitu
architecture rtl of pouziti_tlacitka is
-- hlavni blok
begin
  -- prirazeni pinu tlacitka přímo na LED diody
  led1 <= tlac;
  led2 <= not tlac;
end rtl;

Po nahrání tohoto programu do FPGA pomocí vývojového prostředí Quartus II je zapotřebí ještě provést namapování vstupního pinu tlačítka. To provedeme opětovným zavoláním příslušného nástroje, kdy stačí otevřít nabídku „Assignments-Pin Planner“. V tomto nástroji následně uvidíte nepřiřazený pin pro „tlac“, kdy já jsem přiřadil zmíněný PIN_4.

Vývojový FPGA kit Cyclone II a připojení tlačítka

Když nyní provedete kompilaci a nahrání programu do FPGA, můžete si vyzkoušet, že každé stisknutí provede zmíněné rozsvícení LED diod v opačném pořadí.
V běžné praxi ale musíme s tlačítky pracovat trochu složitějším způsobem, abychom vyřešili problematiku zákmitů (anglicky debounce). Pro ten existuje několik řešení, kdy já jsem vybral jedno poměrně dobře čitelné a udělal s ním ukázku čítače pro 3 bity.

Druhý ukázkový kód tedy kromě stejných portů obsahuje také více proměnných, kde si můžete všimnout, že v mém případě je kýžená filtrace zákmitů nastavena na 1 sekundu. Celý program je detailně okomentovaný přímo v kódu.

-- Prace s tlacitkem
-- navody.dratek.cz

-- pripojeni potrebnych knihoven
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- vytvoreni entity s porty
entity pouziti_tlacitka is
  port (
    clk : in std_logic;
    tlac : in std_logic;
    led1 : out std_logic;
    led2 : out std_logic;
    led3 : out std_logic
  );
end pouziti_tlacitka;

-- vytvoreni architektury pro entitu
architecture rtl of pouziti_tlacitka is
  -- zadani rychlosti vstupnich hodin (50 MHz)
  constant CLK_FREKVENCE : integer := 50_000_000;
  -- zadani delky v milisekundach
  constant DELKA_USTALENI : integer := 1000;
  -- velikost prepinace
  constant VELIKOST_CITACE : integer := CLK_FREKVENCE/1000*DELKA_USTALENI;
  -- aktivni hrana pri sepnuti tlacitka
  constant TLAC_AKTIV : std_logic := '0';
  -- promenna citace
  signal CITAC : integer := 0;
  -- vytvoreni typu s 2 stavy
  type state_type is (stav0,stav1);
  -- promenna pro ulozeni aktualniho stavu
  signal AKT_STAV : state_type := stav0;
  -- promenna pro definici prepinace
  signal PREPINAC : std_logic;
  -- promenna pro ulozeni stavu LED jako integeru pro citani
  signal STAV_LED_INT : integer range 0 to 7;
  -- promenna pro ulozeni stavu LED jako vektoru bitu pro prirazeni na LED
  signal STAV_LED : std_logic_vector(2 downto 0);

-- hlavni blok
begin
  -- process citlivy na zmenu hodin clk
  process(clk) begin
    -- detekce nabezne hrany hodin
    if(rising_edge(clk)) then
      -- stavovy automat
      case (AKT_STAV) is
        -- stav0 je vychozi a cekame v nem na aktivaci tlacitka
        when stav0 =>
        -- pri aktivaci tlacitka prechazime do stav1
          if(tlac = TLAC_AKTIV) then  
            AKT_STAV <= stav1;
          else
            AKT_STAV <= stav0; --wait until button is pressed.
          end if;
           -- prirazeni nuly do prepinace pro jeho reset
          PREPINAC <= '0';
        -- stav1 resi citani citace a nastaveni prepinace
        when stav1 =>
          -- pri dosazeni nastavene maximalni hodnoty citace
          -- aktivujeme prepinac pri zmacknutem tlacitku
          if(CITAC = VELIKOST_CITACE) then
            CITAC <= 0;
            if(tlac = TLAC_AKTIV) then
          PREPINAC <= '1';
            end if;
            AKT_STAV <= stav0;
          -- jinak pricteme pouze jednicku do citace
          else
            CITAC <= CITAC + 1;
          end if;
        end case;
    end if;   
  end process;

  -- proces citlivy na zmenu prepinace
  process(PREPINAC) begin
    -- pri nabezne hrani prepinace pricteme jednicku do stavu LED
    if(rising_edge(PREPINAC)) then
      STAV_LED_INT <= STAV_LED_INT + 1;
    end if;
  end process;
  -- priradime hodnotu stavu LED v integer promenne do bitoveho vektoru
  stav_led <= std_logic_vector(to_unsigned(STAV_LED_INT, stav_led'length));
  -- prirazeni jednotlivych bitu promenne stav_led na piny s LED diodami
  led1 <= not stav_led(0);
  led2 <= not stav_led(1);
  led3 <= not stav_led(2);

end rtl;

Po nahrání druhého programu si můžete vyzkoušet, že když budete držet tlačítko méně než 1 sekundu, nic se nestane. Pokud ale dosáhnete času 1 sekundy a více, tak s každým dosažením tohoto času se přičte jednička do čítače, jehož hodnota se promítne v binárním kódu na 3 vestavěné LED diody.

Tento návod pro FPGA kit Cyclone II byl věnován ukázce dvojí práce se vstupními signály, kdy jsem na vstup připojil jednoduché tlačítko. Ve složitější variantě byla předvedena jedna z technik odstranění zákmitů, kdy můžete tzv. debounce řešit i jinými způsoby, protože také záleží, co má být výsledkem – jestli krátký impulz na výstupu jako v tomto případě či trvalé přepnutí výstupu a podobně.

Zmíněný kit můžete koupit zde:
https://dratek.cz/arduino/1508-fpga-ep2c5t144-cycloneii-vyvojovy-kit-altera-usb-blaster-jtag-programator.html

FB tw

Další podobné články