Sedmisegmentový displej
Princip displeje je založen na LED prvcích, které jsou uspořádány tak, že jednu zobrazovanou číslice tvoří sedm segmentů a obvykle desetinná tečka. Číslice jsou pak v pouzdru jednotlivě, případně vícenásobně. Obrázek ukazuje čtyřmístný segmisegmentový displej včetně označení jednotlivých segmentů. Zbývá jen doplnit, že desetinná tečka bývá označována jako H nebo DP.
Aby bylo možné omezit počet vývodů na minimum, jsou vývody sdruženy. K tomu je však třeba zvolit buď společnou anodu nebo společnou katodu. Ta elektroda, která je společná, pak tvoří jeden vývod příslušné číslice. Všechny odpovídající segmenty jsou rovněž propojeny. Celý displej pak musí pracovat v dynamickém režimu. U kitu, který byl popsán v minulém dílu, se celé řízení odehrává podle následujícího obrázku.
Přivedením nuly na budič displeje AN3 je připojena anoda nejvýznamnější číslice na plus napájení. Po přivedení potřebných signálů na vývody segmentů se rozsvítí příslušný znak. Pak se totéž odehraje s druhou číslicí, pak další a nakonec s nejméně významnou. Celý tento cyklus se v uzavřené smyčce neustále opakuje. Rychlost přepínání pak musí být taková, aby setrvačnost oka zajistila dojem trvalého rozsvícení. Pro řešení potřebného programu je třeba doplnit, že pro rozsvícení segmentu je třeba na budič přivést nulu.
Programové řešení
Protože program je určen pro výuku, musí splňovat podmínku názornosti. Proto byl celý rozdělen na několik bloků a ty pak byly propojeny ve formě blokového schématu.
Pro vysvětlení činnosti je nejlépe postupovat od konce, ale nejdříve je třeba vysvětlit, co je na jednotlivých vývodech. Na vstupy Bt0 až Bt3 jsou připojena tlačítka a na SwL a SwH jsou připojeny přepínače. Na vstup clk je připojen oscilátor 50 MHz. Výstupy jsou pak typu segment pro připojení segmentů displeje a digit pro připojení anod.
Stisknutí tlačítka rozsvítí příslušnou desetinnou tečku, přepínače pak nastavují v binárním kódu vstupní číslo.
Bin7Seg
Tento blok slouží k ovládání segmentů. Je to vlastně dekodér, který má binární vstup a vstup desetinné tečky, výstup pak je osmi bitový. Nula na výstupu znamená, že příslušný segment se rozsvítí. Tato část programu je v souboru Bin7Seg.vhd.
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Bin7Seg is
Port ( BinInp : in STD_LOGIC_VECTOR (3 downto 0);
clk, dp : in STD_LOGIC;
seg : out STD_LOGIC_VECTOR (7 downto 0));
end Bin7Seg;
architecture Behavioral of Bin7Seg is
begin
process (clk)
begin
if clk"event and clk = "1" then
case BinInp is
when "0000" => seg <= "0000001" & dp; -- 0
when "0001" => seg <= "1001111" & dp; -- 1
when "0010" => seg <= "0010010" & dp; -- 2
when "0011" => seg <= "0000110" & dp; -- 3
when "0100" => seg <= "1001100" & dp; -- 4
when "0101" => seg <= "0100100" & dp; -- 5
when "0110" => seg <= "0100000" & dp; -- 6
when "0111" => seg <= "0001111" & dp; -- 7
when "1000" => seg <= "0000000" & dp; -- 8
when "1001" => seg <= "0000100" & dp; -- 9
when "1010" => seg <= "0001000" & dp; -- A
when "1011" => seg <= "1100000" & dp; -- B
when "1100" => seg <= "0110001" & dp; -- C
when "1101" => seg <= "1000010" & dp; -- D
when "1110" => seg <= "0110000" & dp; -- E
when others => seg <= "0111000" & dp; -- F
end case ;
end if;
end process;
end Behavioral;
DigReg
Postupně spíná v nekonečné smyčce anody jednotlivých číslic a rozhoduje tedy, která právě svítí. Program vytváří efekt putující nuly. V downloadu je to soubor DigReg.vhd.
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DigReg is
Port ( pos : in STD_LOGIC_VECTOR (1 downto 0);
clk : in STD_LOGIC;
digit : out STD_LOGIC_VECTOR (3 downto 0));
end DigReg;
architecture Behavioral of DigReg is
begin
process (clk)
begin
if clk"event and clk = "1" then
case pos is
when "00" => digit <= "1110";
when "01" => digit <= "1101";
when "10" => digit <= "1011";
when others => digit <= "0111";
end case ;
end if;
end process;
end Behavioral;
Mux
Tato část programu řídí celý dynamický režim displeje. Je v něm sdružen dvoubitový čítač a čtyřvstupový multiplexer. Dvoubitový čítač nabývá postupně jeden ze čtyř stavů a multiplexer pak podle něj na svůj výstup posílá data příslušného vstupu. Soubor ke stažení je pojmenován Mux.vhd.
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Mux is
port(clk: in std_logic;
TimeIn: in std_logic;
BinInp1: in std_logic_vector(3 downto 0);
BinInp2: in std_logic_vector(3 downto 0);
BinInp3: in std_logic_vector(3 downto 0);
BinInp4: in std_logic_vector(3 downto 0);
dp3,dp2,dp1,dp0: in std_logic;
BinOut: out std_logic_vector(3 downto 0);
dp: out std_logic;
pos: out std_logic_vector(1 downto 0));
end Mux;
architecture Behavioral of Mux is
signal cd: std_logic_vector(1 downto 0);
begin
process (clk) begin
if clk"event and clk = "1" then
if TimeIn = "1" then
cd <= cd + 1;
end if;
case cd(1 downto 0) is
when "00" => BinOut <= BinInp1; dp <= not dp0;
when "01" => BinOut <= BinInp2; dp <= not dp1;
when "10" => BinOut <= BinInp3; dp <= not dp2;
when others => BinOut <= BinInp4; dp <= not dp3;
end case ;
end if;
end process;
pos <= cd;
end Behavioral;
Timing
Protože displej je řízen dynamicky, musí být součástí také tato část. Program tohoto bloku vytváří řídící signál 1 kHz. Ač se to nezdá, je tato část jedinou citlivou částí celého programu. Pokud by řídící signál byl mnohem nižší než mnou zvolený, displej by blikal. Pokud by však byl mnohem vyšší, způsobí to efekt, kdy slabě svítí i neaktivní segmenty. Příslušný soubor Timing.vhd je k dispozici opět v downloadu.
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Timing is
Port ( Clk: in STD_LOGIC;
TimeOut: out std_logic);
end Timing;
architecture Behavioral of Timing is
signal timer: std_logic_vector(15 downto 0);
begin
process (clk) begin
if clk"event and clk = "1" then
timer <= timer + 1 ;
if timer = "1100001101010000" then
TimeOut <= "1" ;
timer <= (others => "0") ;
else
TimeOut <= "0" ;
end if ;
end if ;
end process ;
end Behavioral;
SegDisp.sch
Je tzv. vrcholový soubor programu. V něm došlo k propojení jednotlivých bloků a je to vlastně to schéma, které bylo ukázáno výše. Aby bylo možné přejít od vhd souborů k blokovému schématu je třeba mít vytvořeny také odpovídající sym soubory. Ty jsou rovněž k dispozici ke stažení. Kromě toho byl opět vytvořen potřebný ucf soubor, který konfiguruje vstupy a výstupy.
Pokud si budete chtít program vyzkoušet, postupujte jak bylo popsáno v prvním dílu. Založte ve WebPacku projekt, ale do něj netvořte žádné soubory. Do adresáře projektu pak nakopírujte všechny soubory z downloadu a přidejte je do projektu. Pokud máte k dispozici kit, přidejte do projektu taky ucf soubor a po vytvoření konfiguračního souboru můžete program zavést do konfigurační paměti.
Pokud budete chtít program pouze simulovat, je jistým problémem obvod Timing, resp. to, že obvod představuje děličku 1 : 50 000. To by samozřejmě způsobilo neúměrné roztažení výstupu simulace, se všemi důsledky z toho plynoucími. Pro simulaci je proto vhodné zkrátit dělící poměr třeba na 1 : 10. Efekt svitu neaktivních segmentů se v simulátoru neobjeví.
Závěr
Ne vždy nám však bude vyhovovat ovládání tímto způsobem. V případě, že je displej vzdálen od vlastního řídícího obvodu, připadá v úvahu propojení přes I2C sběrnici. V příštím díle proto ukážu, jak na to.
jiri.kral@ roznovskastredni.cz
Downloads&Odkazy
- První díl seriálu - Hrátky s hradlovými poli - 1
- Soubory ke stažení - Hratky_2.zip
- Domovské stránky Xilinx http://www.xilinx.com/products/spartan3/boards/SP3kitSS.pdf
- Domovské stránky Digilent http://www.digilentinc.com