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.
Náhled zapojení samotné klávesnice.
Zvětšené zapojení
klavesnice.
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
;