Jste zde

Hrátky s hradlovými poli - 2.

Vícemístný sedmisegmentový LED displej je častou periferií pro jednočipový mikropočítač a je zcela logické, že stejnou problematiku bude třeba řešit i s hradlovými poli. V závěru minulého dílu jsem proto slíbil řešení ovládání sedmisegmentového LED displeje pomocí hradlového pole.

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.

library IEEE;
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.

library IEEE;
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_1164.ALL;
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.

library IEEE;
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.

Ing. Jiří Král
jiri.kral@ roznovskastredni.cz

Downloads&Odkazy

Hodnocení článku: