Sapientia EMTE
Digitális elektronika gyakorlat
FELADATOK 1. Felhasználva az XSA 50 FPGA lapon található 100MHz-es programozható oszcillátort, tervezzetek egy olyan VHDL modult, amely 1 Hz-es órajelet állít elő. A feladat megoldható az FPGA lap órajelének a megfelelő leosztásával. 2. Tervezzetek egy 4 bit-es, BCD kodú számlálót megvalósító VHDL modult. 3. Tervezzetek egy 7 szegmenses dekodoló VHDL modult. 4. A Schematic Editor segítségével kössétek őssze a megvalósított órajelgenerator modult a számlálót és a 7 szegmenses dekodoló modult, a dekdoló kimeneteit pedig vezessétek ki az FPGA lapon található 7 szegmenses kijelzőre.
1
Sapientia EMTE
Digitális elektronika gyakorlat
1. 1 Hz órajelt generáló modul Az XSA 50 FPGA lapon tlálható progrmozható oszcillátórt az előző gyakorlatokban megismert GXSSetClk alkalmazást használva programozhatjuk. Valójában 2 hatványaival osztható az oszcillátor 100 Mhz-es alapfrekvenciája. A gyakorlatunk esetén a 100 Mhz-es alapfrekvenciát 2vel osztva, 50 Mhz-es frekvenciájú órajelhez jutunk. Ez a jel hozzáférhető az FPGA lap MasterClk elnevezésú portján. A port számát kikereshetjük az XSA Board User Manual-ban található táblázatokból. Ahhoz, hogy 1 Hz frekvenciájú órajelet allítsunk elő, az 50 Mhz frekvenciájú jelet 50.000.000-val kellene osztani. A frekvenciaosztó áramkör elve egy számláló, amely 25.000.000-ig számol, és minden számolási ciklus után megtagadja a saját kimenetét. (25.000.000)10=(1011111010111100001000000)2 Tehát 25.000.000 binárisan 25 bit-en ábrázolható. Deklaráljuk a bemeneti és kimeneti portokat: clk_in és clk_out, valamint egy reset portot, mely segítségével leállíthatjuk az órajel taktusait. Az architektura részben deklarálunk két segédváltozót: clk_cnt, amely 25.000.000-ig számol és clk_out amely az órajelgenerétorunk kimeneti bit-je. Megvizsgáljuk, a reset bemenet állapotát. Ha a reset bemenet 0 logikai értékű, a kimenetet és a belső számláló tartalmát nullázzuk. Ellenkező esetben a bemeneti órajel minden felfutó élénél (rising_edge) n0velj-k eggyel a belső számláló értékét és ha 25.000.000-hoz ért, nullázzuk es megtagadjuk a kimeneti bit értékét. Az alábbiakban megtalálható az órajelgeneráló modul VHDL forráskódja. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity clock_1hz is Port ( reset : in std_logic; clk_in : in std_logic; clk_out : out std_logic); end clock_1hz; architecture behavioral of clock_1hz is signal clk_cnt : unsigned(24 downto 0); signal clk_bit : std_logic; begin 2
Sapientia EMTE
Digitális elektronika gyakorlat
gen_clock: process (clk_in, reset) is begin if (reset = '0') then clk_cnt <= "0000000000000000000000000"; clk_bit <= '0'; elsif rising_edge(clk_in) then if (clk_cnt = 25_000_000) then clk_cnt <= "0000000000000000000000000"; clk_bit <= not clk_bit; else clk_cnt <= clk_cnt + 1; end if; end if; end process; clk_out <= clk_bit; end behavioral;
3
Sapientia EMTE
Digitális elektronika gyakorlat
2. 4 bit-es számláló modul LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY count IS PORT ( clock: sload: data: result: ); END count;
IN STD_LOGIC; IN STD_LOGIC; IN integer RANGE 0 TO 31; OUT integer RANGE 0 TO 31
ARCHITECTURE rtl OF count IS SIGNAL result_reg : integer RANGE 0 TO 31; BEGIN PROCESS (clock) BEGIN IF (clock'event AND clock = '1') THEN IF (sload = '1') THEN result_reg <= data; ELSE result_reg <= result_reg + 1; END IF; END IF; END PROCESS; result <= result_reg; END rtl;
4
Sapientia EMTE
Digitális elektronika gyakorlat
3. Hétszegmenses dekodoló modul A hétszegmenses dekodoló modul eg y4 bit-es bináris számot kap bemenetként (A, B, C, D) és egy 8 bi-ből álló vektort ad kimenetként. A 8 bit megfelel egy hétszegmenses kijelző a, b, c, d, e, f, g szegmenseinek és a DP (decimal point) tízedesvesszőnek.
1.Ábra: Hétszegmenses kijelző A négy bemeneti bit ősszesen 16 bemeneti kombinációt enged meg. Mindeniknek megfelel egy kimeneti kombináció. A case útasítás segítségével értékelhetjük ki a bemeneten kapott értéket, miután egy 4 elemű vektorba másoljuk ezeket, és minden bemeneti kombináció esetén a kimeneti vektor elemeit a kivánt megjelenítendő szám szerint töltjük fel. Az alábbiakban megtalálható az hétszegmenses dekodoló modul VHDL forráskódja. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity hex_display is Port( A : in std_logic; B : in std_logic; C : in std_logic; D : in std_logic; segm : out std_logic_vector(7 downto 0) ); end hex_display; architecture Behavioral of hex_display is signal val : std_logic_vector(3 downto 0); begin process(A,B,C,D) 5
Sapientia EMTE
Digitális elektronika gyakorlat
begin val(0)<=A; val(1)<=B; val(2)<=C; val(3)<=D; case val is when "0000" => segm<="01111110"; when "0001" => segm<="00001100"; when "0010" => segm<="10110110"; when "0011" => segm<="10011110"; when "0100" => segm<="11001100"; when "0101" => segm<="11011010"; when "0110" => segm<="11111010"; when "0111" => segm<="00001110"; when "1000" => segm<="11111110"; when "1001" => segm<="11011110"; when "1010" => segm<="11101110"; when "1011" => segm<="11111000"; when "1100" => segm<="01110010"; when "1101" => segm<="10111100"; when "1110" => segm<="11110010"; when "1111" => segm<="11100010"; when others => segm<="00000000"; end case; end process end Behavioral;
6