You are on page 1of 9

Feladat:

Htszegmenses kijelz, amely 4 db kapcsoln belltott hexadecimlis rtket jelez ki.


Megolds:
entity led_dek is
Port ( d : in STD_LOGIC_VECTOR (3 downto 0);
s : out STD_LOGIC_VECTOR (6 downto 0);
digit0 : out STD_LOGIC);
end led_dek;
architecture Behavioral of led_dek is
begin
digit0 <= '0';
s
<=
"1000000" when d="0000" else
"1111001" when d="0001" else
"0100100" when d="0010" else
"0110000" when d="0011" else
"0011011" when d="0100" else
"0010010" when d="0101" else
"0000010" when d="0110" else
"1111000" when d="0111" else
"0000000" when d="1000" else
"0011000" when d="1001" else
"0001000" when d="1010" else
"0000011" when d="1011" else
"1000110" when d="1100" else
"0100001" when d="1101" else
"0000110" when d="1110" else
"0001110" ;
end Behavioral

Feladat:
Az S3 gyakorl panel egyik LED-jt (jobb szlst) villogtasd (kapcsold be ill. ki) msodpercenknt
Megolds:
entity villog1sec_modul is
Port ( clk50 : in STD_LOGIC;
rst : in STD_LOGIC;
led : out STD_LOGIC);
end villog1sec_modul;
architecture Behavioral of villog1sec_modul is
signal hertz_count : std_logic_vector(31 downto 0);
signal masodperc : std_logic := '1';
begin
process (clk50, rst)
begin
if rst = '1' then
hertz_count <= (others => '0');
led <= '0';
masodperc <= '0';
elsif clk50'event and clk50='1' then
hertz_count <= hertz_count + 1;
if hertz_count = 50000000-1 then
masodperc <= not masodperc;
hertz_count <= (others => '0');
end if;
end if;
led <= masodperc;
end process;
end Behavioral;

Feladat:
Az S3 gyakorl panelen kt szomszdos LED msodpercenknt vltva villogjon.

Megolds:
entity villog1sec_modul is
Port ( clk50 : in STD_LOGIC;
rst : in STD_LOGIC;
ledek : out STD_LOGIC_VECTOR(1 downto 0) );
end villog1sec_modul;
architecture Behavioral of villog1sec_modul is
signal hertz_count : std_logic_vector(31 downto 0);
signal masodperc : std_logic := '1';
begin
process (clk50, rst)
begin
if rst = '1' then
hertz_count <= (others => '0');
ledek <= (others => '0');
masodperc <= '0';
elsif clk50'event and clk50='1' then
hertz_count <= hertz_count + 1;
if hertz_count = 50000000-1 then
masodperc <= not masodperc;
ledek <= masodperc & not masodperc;
hertz_count <= (others => '0');
end if;
end if;
end process;
end Behavioral;

entity kij_module is
Port ( clk50 : in STD_LOGIC;
rst : in STD_LOGIC;
kapcsolok : in STD_LOGIC_VECTOR (7 downto 0);
digit : out STD_LOGIC_VECTOR (3 downto 0);
seg : out STD_LOGIC_VECTOR (6 downto 0));
end kij_module;
architecture Behavioral of kij_module is
constant teszt1ms : STD_LOGIC_VECTOR(31 downto 0) := conv_std_logic_vector(50000, 32);
signal curr : std_logic_vector(3 downto 0);
signal frissit_szlo : std_logic_vector(31 downto 0);
signal cd : std_logic_vector(1 downto 0);
signal bcdint : std_logic_vector(15 downto 0);
begin
bcdint <= "00" & kapcsolok(7 downto 6) & "00" & kapcsolok(5 downto 4) &
"00" & kapcsolok(3 downto 2) & "00" & kapcsolok(1 downto 0);
process (clk50, rst, cd)
begin
if rst = '1' then
cd <= (others => '0');
frissit_szlo <= (others => '0');
elsif clk50'event and clk50 = '1' then
frissit_szlo <= frissit_szlo + 1;
if frissit_szlo = teszt1ms -1 then
frissit_szlo <= (others => '0');
cd <= cd + 1;
end if;
end if;
end process;
curr <= bcdint(3 downto 0) when cd = "00" else
bcdint(7 downto 4) when cd = "01" else
bcdint(11 downto 8) when cd = "10" else
bcdint(15 downto 12);
digit <= "1111" when rst = '1' else
"1110" when cd = "00" else
"1101" when cd = "01" else
"1011" when cd = "10" else
"0111";
seg <= "1111111" when rst = '1' else
"1000000" when curr = "0000" else
"1111001" when curr = "0001" else
"0100100" when curr = "0010" else
"0110000";
end Behavioral;

Feladat:
Amelyik gombot megnyomtuk a 4 kzl az a szm jelenjen meg a jobb oldali 7 szegmenses kijelzn
Megolds:
entity gombdetektor is
port ( clk50 : in std_logic; --50MHz-es f rajel
rst
: in std_logic; --aszinkron trls
digit : out std_logic_vector (3 downto 0);--htszegmense kijelz digit eng.
seg
: out std_logic_vector (6downto 0);--htszegmense kijelz segmens vezrls
gomb : in
std_logic_vector (3 downto 0));
TYPE allapotok IS (megnyomasra_var,elengedesre_var);-- az FSM llapotai
end gombdetektor;
architecture Behavioral of gombdetektor is
signal x20ms_out : std_logic;--20ms-os mintavteli id jelzse
signal x20ms_count
: std_logic_vector(31 downto 0) ; -- prellmentest oszt
signal melyik : std_logic_vector(1 downto 0);
begin
--begin dekad_kij komponens
digit
<= "1110";-- csak a jobb szls kijelzt engedlyezem a 4 kzl
seg <= "1111001" when melyik = "00" else--1
"0100100" when melyik = "01" else--2
"0110000" when melyik = "10" else--3
"0011001" when melyik = "11" else "1111111";
--begin oszto_20ms komponens
process (clk50, rst)
begin
if rst = '1' then
x20ms_count <= (others => '0') ;
x20ms_out <= '0';
elsif clk50'event and clk50 = '1' then -- f rajel felfut le
x20ms_count <= x20ms_count + 1 ;
-- ketyeg az ra
if x20ms_count = 1000000-1 then
-- 50 MHz-et kell leosztani 20 ms-ra
x20ms_out <= '1' ;
--20ms-os kimenetet aktivlom (1 rajel ideig fog csak tartani!)
x20ms_count <= (others => '0') ;
else
x20ms_out <= '0' ; --csak 1 rajel ideig tarthat a kiadott parancs (ez most 1 bites parancs!)
end if ;
end if ;
end process ;
--begin prellment komponens
process (clk50, rst)
begin
if rst = '1' then melyik<="00";
elsif clk50'event and clk50 = '1' then -- f rajel felfut le esemny
if x20ms_out = '1' then --mintavtelezs parancs rkezett
if gomb="0001" then melyik<="00";
elsif gomb="0010" then melyik<="01";
elsif gomb="0100" then melyik<="10";
elsif gomb="1000" then melyik<="11";
end if;
end if;
end if ;
end process ;
end Behavioral;

Feladat:
Valamelyik gomb megnyomsa utn elszmol 9ig s gy marad. A gomb megnyomsa megfelel ideig kell hogy tartson.
Megolds:
entity gombdetektor is
port ( clk50 : in std_logic; --50MHz-es f rajel
nyomogomb : in std_logic; --BTN0-s nyomgomb
rst
: in std_logic; --aszinkron trls
digit : out std_logic_vector (3 downto 0);--htszegmense kijelz digit eng.
led
: out std_logic; --LED0
seg
: out std_logic_vector (6downto 0));--htszegmense kijelz segmens vezrls
TYPE allapotok IS (megnyomasra_var,elengedesre_var);-- az FSM llapotai
end gombdetektor;
architecture Behavioral of gombdetektor is
signal d
: std_logic_vector (3 downto 0);
--hexa szamll, htszegmenses kijelzs
signal x20ms_out : std_logic; --20ms-os mintavteli id jelzse
signal gomb_esemeny : std_logic_vector (1 downto 0); -- gombnyoms esemny jelzse
signal x20ms_count
: std_logic_vector(31 downto 0) ;
-- prellmentest oszt
signal fifo : std_logic_vector(1 downto 0) ; --FIFO regiszter a nyomgombhoz
signal stopper : std_logic_vector(31 downto 0); -- real time ra gombnyoms idhz
signal allapot: allapotok; -- automata (FSM) llapotvltozja
signal szamol9ig:std_logic:='1';
signal szamlalo:std_logic_vector(3 downto 0);
signal szamlalo_clock:std_logic_vector(31 downto 0);
begin
--begin dekad_kij komponens
digit
<= "1110";-- csak a jobb szls kijelzt engedlyezem a 4 kzl
seg <= "0000000" when szamlalo = "0000" else-"1111001" when szamlalo = "0001" else--1
"0100100" when szamlalo = "0010" else--2
"0110000" when szamlalo = "0011" else--3
"0011001" when szamlalo = "0100" else--4
"0010010" when szamlalo = "0101" else--5
"0000010" when szamlalo = "0110" else--6
"1111000" when szamlalo = "0111" else--7
"0000000" when szamlalo = "1000" else--8
"0010000" when szamlalo = "1001" else9 "1111111";
--begin oszto_20ms komponens
process (clk50, rst)
begin
if rst = '1' then
x20ms_count <= (others => '0') ;
x20ms_out <= '0';
elsif clk50'event and clk50 = '1' then -- f rajel felfut le
x20ms_count <= x20ms_count + 1 ;
--ketyeg az ra
if x20ms_count = 1000000-1 then -- 50 MHz-et kell leosztani 20 ms-ra
x20ms_out <= '1' ; --20ms-os kimenetet aktivlom (1 rajel ideig fog csak tartani!)
x20ms_count <= (others => '0') ;
else
x20ms_out <= '0' ; --csak 1 rajel ideig tarthat a kiadott parancs (ez most 1 bites parancs!)
end if ;
end if ;
end process ;
--begin prellment komponens
process (clk50, rst)
begin
if rst = '1' then
fifo <= (others => '0') ;
--resetben vagyok, ezrt a szlo minden bitje 0
gomb_esemeny <= (others => '0') ; -- nincs esemny jelzs

elsif clk50'event and clk50 = '1' then


-- f rajel felfut le esemny
if x20ms_out = '1' then
--prellmentests mintavteli idpontja : 20 ms-onknt
fifo <= fifo(0) & nyomogomb ;--gombnyomst belptetem (mintavtelezem)
gomb_esemeny(0) <= (fifo(1) xor fifo(0)) and fifo(0) ;--megnyoms esemny trtnt
gomb_esemeny(1) <= (fifo(1) xor fifo(0)) and (not fifo(0)) ;--elengeds esemny trtnt
else
gomb_esemeny <= (others => '0') ; -- gomb esemny jelzs vge
end if;
end if ;
end process ;
--begin fsm komponens
process (clk50, rst)
begin
if rst = '1' then
--inicializls
stopper <= (others => '0') ;
led <= '0' ;
d <= (others => '0') ;
allapot <= megnyomasra_var ;
elsif clk50'event and clk50 = '1' then -- f rajel felfut le van
if stopper < 2* 50000000 then -- az idmrst 5 sec-nl lelltom (ez legyen nagyobb a max. mrend idnl
stopper <= stopper +1; -- hogy ne csorduljon tl az ra
end if;
case allapot is --az llapottl fggen kell vizsglni az esemnyeket
when megnyomasra_var =>
if gomb_esemeny = "01" then
--gomb megnyoms esemny jelzs rkezett
led <= '1' ; --gy ltom a gomb megnyomst
stopper <= (others => '0') ;
allapot <= elengedesre_var;
end if;
when elengedesre_var =>
if gomb_esemeny = "10" then ----gomb elengeds esemny jelzs rkezett
led <= '0' ; --most engedtem el a gombot, a kijelzst ezrt kikapcsolom
if (stopper <= 50000000) then --500 ms-nl hosszabb a gombnyoms hossza, elfogadom
szamol9ig<='1';
else szamol9ig<='0';
end if;
allapot <= megnyomasra_var; --megyek a kvetkez gombnyomsra vrakoz llapotba
end if;
when others => null ;
end case ;
end if ;
end process ;
process (clk50,rst)
begin
if rst='1' then
szamlalo<=(others =>'0');
elsif clk50'event and clk50='1' then
if szamol9ig='1' then
szamlalo_clock<=szamlalo_clock+1;
if szamlalo_clock=10000000 then
szamlalo<=szamlalo+1;
szamlalo_clock<=(others =>'0');
if szamlalo=10 then szamlalo<="0000"; end if;
end if;
else
szamlalo<="1010";
end if;
end if;
end process;
end Behavioral;

Feladat:
Valamelyik gomb megnyomsa utn, ha az legalbb 200ms-ig tartott akkor egy LED 3s vilgit
Megolds:
entity gombdetektor is
port ( clk50 : in std_logic; --50MHz-es f rajel
nyomogomb : in std_logic; --BTN0-s nyomgomb
rst
: in std_logic; --aszinkron trls
digit : out std_logic_vector (3 downto 0);--htszegmense kijelz digit eng.
led : out std_logic; --LED0
led_jo : out std_logic:='0'; --LED0
led_rossz : out std_logic:='0';
seg
: out std_logic_vector (6downto 0);--htszegmense kijelz segmens vezrls
d1 : out std_logic;
d2 : out std_logic);
TYPE allapotok IS (megnyomasra_var,elengedesre_var);-- az FSM llapotai
end gombdetektor;
architecture Behavioral of gombdetektor is
signal d
: std_logic_vector (3 downto 0);--hexa szamll, htszegmenses kijelzs
signal x20ms_out : std_logic;--20ms-os mintavteli id jelzse
signal gomb_esemeny : std_logic_vector (1 downto 0);-- gombnyoms esemny jelzse
signal x20ms_count
: std_logic_vector(31 downto 0) ; -- prellmentest oszt
signal fifo : std_logic_vector(1 downto 0) ;--FIFO regiszter a nyomgombhoz
signal stopper : std_logic_vector(31 downto 0);-- real time ra gombnyoms idhz
signal allapot: allapotok; -- automata (FSM) llapotvltozja
signal x3s_count
: std_logic_vector(31 downto 0) ;
signal joled : std_logic;
signal rossz_led : std_logic;
begin
[--- mint a korbbiban a fsm, oszto, digit, stb ---]
--begin fsm komponens
process (clk50, rst)
begin
if rst = '1' then --inicializls --aszinkron resetben alaphelyzetbe kell lltani a modul vltozit, ill. kimeneti portjait
stopper <= (others => '0') ;
led <= '0' ;
d <= (others => '0') ;
allapot <= megnyomasra_var ;
elsif clk50'event and clk50 = '1' then -- f rajel felfut le van
if stopper < 2* 50000000 then
-- az idmrst 5 sec-nl lelltom (ez legyen nagyobb a max. mrend idnl
stopper <= stopper +1; -- hogy ne csorduljon tl az ra
end if;
case allapot is --az llapottl fggen kell vizsglni az esemnyeket
when megnyomasra_var =>
if gomb_esemeny = "01" then --gomb megnyoms esemny jelzs rkezett
led <= '1' ; --gy ltom a gomb megnyomst
stopper <= (others => '0') ;
allapot <= elengedesre_var;
end if;
when elengedesre_var =>

if gomb_esemeny = "10" then ----gomb elengeds esemny jelzs rkezett


led <= '0' ; --most engedtem el a gombot, a kijelzst ezrt kikapcsolom
if (stopper >= 10000000) then --500 ms-nl hosszabb a gombnyoms hossza, elfogadom
d <= d + 1;
if d = "0011" then
d<="0000";
end if;
allapot <= megnyomasra_var; --megyek a kvetkez gombnyomsra vrakoz llapotba
end if;
when others => null ;
end case ;
end if ;
end process ;
process (clk50)
begin
if rst='1' then
joled<='0';
rossz_led<='0';
x3s_count<=(others => '0');
elsif clk50'event and clk50='1' then
x3s_count<=x3s_count+1;
if x3s_count=150000000 then
x3s_count<=(others => '0');
if d
>= 3 then
joled<='1';
rossz_led<='0';
else
rossz_led<='1';
joled<='0';
end if;
end if;
end if;
end process;
led_jo <= joled;
led_rossz <= rossz_led;
d1<=d(0);
d2<=d(1);
end Behavioral;

You might also like