Zdroj: http://prochazka.clanweb.eu/index.php?a=knihovnicka/vhdl_cast3  •  Vydáno: 12.1.2008 13:14  •  Autor: hacesoft

Popis jazyka VHDL čast 3

Další díl popisu jazyka VHDL. Tentokrát je velice podrobně komentován konkrétní kód který je s úpravou použit ve vývojové desce PIC a XILINX...

si můžete stáhnou celý projekt, který v druhé a třetí části popisuji, včetně schematu zapojení vlastní součástky. Projekt se jmenuje vývojová deska a pro nedostatek času je nedokončený mám v planu ho někdy dokončit...

Popis klávesnice v multiplexním provozu

Na obrázku máte blokové schéma klávesnice.
Fialové vodiče jsou vyvedeny na vývody pouzdra hradlového pole. Jedná se o vstupy či výstupy.
Směr šipky na libovolném spoji ukazuje tok dat.

multi_kl

Náhled zapojení samotné klávesnice.
Zvětšené zapojení klavesnice. multi_kl1

VHDL code
--
-- by HaCeSOFT
--
-- Datum : 9.7.2001
--
--
 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Deklarace entity klávesnice.
Signál RADKY se propojí se vstupy klávesnice V0, V1 a V2.
Totéž se provede se signálem SLOUPCE. Ty se připojí na výstup klávesnice S0, S1, S2 a S3.
Vstupní signály RESET a CLK nepotřebují komentář.
Klávesnice obsahuje 12 tlačítek. Stejné množství výstupu (12) obsahuje výstupní signál VYSTUP_LED1.

VHDL code
entity klavesnice is
 Port (sloupce : in std_logic_vector(3 downto 0);
       radky : out std_logic_vector(2 downto 0);
       vystup_LED1 : buffer std_logic_vector(11 downto 0);
       reset : in std_logic;
       clk : in std_logic);
end klavesnice;

Signál AKUMULATOR je výstup z obvodu, který je na blokovém schématu označen jako MUX.

VHDL code
architecture kl1 of klavesnice is
 signal radky1 : std_logic_vector(1 downto 0);
 signal sloupce1 : std_logic_vector(1 downto 0);
 signal akumulator : std_logic;
 signal buf : std_logic_vector (3 downto 0);
begin
 
 process (clk, reset) begin

Vynuluje všechny sčítače a výstupní buffer.

VHDL code
  if reset = '0' then
   sloupce1 <= "00";
   radky1 <= "00";
   vystup_LED1 <= "000000000000";
 
  elsif clk = '1' and clk'event then
 
   Sčítač sloupců.
 
   sloupce1 <= sloupce1 +1;

Obvod MUX.

VHDL code

   case sloupce1 is
    when "00" => akumulator <= sloupce (0);
    when "01" => akumulator <= sloupce (1);
    when "10" => akumulator <= sloupce (2);
    when "11" => akumulator <= sloupce (3);
    when others => NULL;
   end case;

Abychom mohli adresovat dekodér 1 z 12 pomocí dvou různých sčítačů musíme výstupy sčítačů spojit do jednoho signálu. Kterým je tady signál BUF.

VHDL code

   buf (3 downto 2) <= radky1;
   buf (1 downto 0) <= sloupce1;

Dekodér 1 z 12.
Až při realizaci tohoto obvodu zjistíme že při stisku tlačítka A se na výstupu VYSTUP_LED1 neobjeví log. 1 na bitu 0 ale na bitu 8! To jsme si vysvětlili už při realizaci LED display v multiplexním provozu.
Nápravu opět nechám na vás.

VHDL code
   case buf is
    when "0000" => vystup_LED1 (0) <= not akumulator;
    when "0001" => vystup_LED1 (1) <= not akumulator;
    when "0010" => vystup_LED1 (2) <= not akumulator;
    when "0011" => vystup_LED1 (3) <= not akumulator;
    when "0100" => vystup_LED1 (4) <= not akumulator;
    when "0101" => vystup_LED1 (5) <= not akumulator;
    when "0110" => vystup_LED1 (6) <= not akumulator;
    when "0111" => vystup_LED1 (7) <= not akumulator;
    when "1000" => vystup_LED1 (8) <= not akumulator;
    when "1001" => vystup_LED1 (9) <= not akumulator;
    when "1010" => vystup_LED1 (10) <= not akumulator;
    when "1011" => vystup_LED1 (11) <= not akumulator;
    when others => NULL;
   end case;
 
   Podmínka SLOUPCE.
 
   if sloupce1 = "11" then
 
   Sčítač RADKY.
 
    radky1 <= radky1 + 1;
 
   Vynulovat sčítač RADKY, když dosáhne stavu "10".
 
    if  radky1 = "10" then radky1 <= "00"; end if;
 
   Dekodér 1 ze 3.
 
    case radky1 is
     when "00" => radky <= "110";
     when "01" => radky <= "101";
     when "10" => radky <= "011";
     when others => NULL;
    end case;
   end if;
  end if;
 end process;
end kl1;