WebElektronika

Hétszegmenses kijelzés (0-9999) megvalósítása VHDL nyelven

person access_time 2015.11.19.
A Nexys 3 panelon találunk négy darab hétszegmenses kijelzőt, amelyeknél az a,b,c,d,e,f,g szegmensek közösek. Készítünk most egy olyan alkalmazást, ahol ezeket a kijelzőket használjuk fel. Egy konstanst (3526) jelenítünk meg a négy darab hétszegmenses kijelzőn.


Folytatjuk most a Spartan 6-os FPGA alapszintű, gyakorlati megismerését. Készítsünk most el egy olyan konvertert, amelynek segítségével 0-9999 közötti számot tudunk megjeleníteni a Nexys 3 panelon lévő hétszegmenses kijelzőkön.

Több megoldás is létezik, a későbbiekben egy másikat is be fogunk mutatni.

Ebben a VHDL file-ban három process található. Az első process-ben a panelon lévő órajelet leosszuk, hogy a leosztott órajellel (SCLK) meg tudjuk "hajtani" a hétszegmenses kijelzőt. A négy számot közös szegmensekkel jelenítjük meg, az az, egyszerre csak az egyik szegmenst tudjuk használni. 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

entity szamol is
    port(CLK, CLR : in std_logic;
            SEL : out std_logic_vector(3 downto 0);
            KI : out std_logic_vector(6 downto 0));
end szamol;

architecture Behavioral of szamol is
type hsz is array(9 downto 0) of std_logic_vector(6 downto 0); 
signal    pelda : hsz := ("0010000","0000000","1111000","0000010",
                                    "0010010","0011001","0110000","0100100",
                                    "1111001","1000000"); 
signal    seged, kijelzo : integer := 0;
signal    osztashsz : integer := 100000;
signal    s0, s1, s2, s3 : integer;
signal    SCLK : std_logic;
begin

    process(CLK, CLR, seged)
    begin
        if CLR = '1' then
            seged <= 0;
        else
            if rising_edge(CLK) then
                seged <= seged + 1;
            else
                null;
            end if;
        end if;
        if seged < osztashsz then
            SCLK <= '0';
        else
            SCLK <= '1';
            seged <= 0;
        end if;
    end process; 
    
    process(SCLK, CLR, kijelzo)
    begin
        if CLR = '1' then
            kijelzo <= 0;
        else
            if rising_edge(SCLK) then
                kijelzo <= kijelzo + 1;
                if kijelzo > 2 then
                    kijelzo <= 0;
                else
                    null;
                end if;
            else
                null;
            end if;
        end if;
    end process;
    
    process(kijelzo, pelda)
    begin
        s0 <= 3526 mod 10;
        s1 <= (3526 / 10) mod 10;
        s2 <= (3526 / 100) mod 10;
        s3 <= (3526 / 1000) mod 10;
        
        if kijelzo = 0 then
            SEL <= "1110";
            KI <= pelda(s0);
        elsif kijelzo = 1 then
            SEL <= "1101";
            KI <= pelda(s1);
        elsif kijelzo = 2 then
            SEL <= "1011";
            KI <= pelda(s2);
        else
            SEL <= "0111";
            KI <= pelda(s3);
        end if;
    end process;

end Behavioral;

 

A második processben elszámolunk 0-tól 3-ig. Ez a megjeleníteni kívánt szám nagyságától függ. A harmadik processben egy előre megadott számot (3526) bontunk fel egyesekre, tízesekre, százasokra és ezresekre. Ezután ezeket az értékeket jelenítjük meg egymás után a második process segítségével a négy hétszegmenses kijelzőn.

Az ucf file segítségével a fordítás után olyan bit file-t kapunk, amelyet a Nexys 3-as panelbe letöltve a kijelzőn a 3256 érték megjelenik.

NET "CLK" LOC = V10;
NET "CLR" LOC = C9;

NET "SEL(0)" LOC = N16;
NET "SEL(1)" LOC = N15;
NET "SEL(2)" LOC = P18;
NET "SEL(3)" LOC = P17;

NET "KI[0]" LOC = T17;
NET "KI[1]" LOC = T18;
NET "KI[2]" LOC = U17;
NET "KI[3]" LOC = U18;
NET "KI[4]" LOC = M14;
NET "KI[5]" LOC = N14;
NET "KI[6]" LOC = L14; 

 

A Nexys 3 fejlesztőpanelon futó projekt látható az első ábrán.

kep
1. ábra   A konstans érték megjelenítése