Zadání: Fakulta informačních technologií VUT v Brně Ústav počítačových systémů Technika personálních počítačů, cvičení ITP FITkit Řízení 7mi-segmentového displeje Úloha č. 3. 1. Seznamte se s výukovou platformou FITkit (http://merlin.fit.vutbr.cz/fitkit/). 2. Prostudujte zapojení LED displeje a způsob připojení k FITkitu prostřednictvím pinheaderu. 3. Prostudujte zdrojové kódy v šabloně top_level.vhd. 4. Doplňte chybějící VHDL kód čítače a dekodéru do šablony top_level.vhd. 5. Proveďte simulaci Vašeho návrhu prostřednictvím vhodného programu (ModelSim, QDevKit, ) 6. Proveďte syntézu vašeho návrhu do FITkitu a ověřte funkčnost Vaší implementace na připojeném LED displeji. 7. Modifikujte zadání podle Vaší fantazie (časování, dekrementace hodnot, ).
Blokové schéma desky FITkit Propojky J8, J9 tvoří pár. Pokud jsou vyjmuty, provede se reset MCU a MCU začne běžet bez nutnosti mít spuštěn terminál. Při programování musí být obě propojky uzavřeny. Propojky J11 a J12 slouží k připojení MCU k sériovému portu, který poskytuje USB převodník. Pokud jsou vyjmuty, nebude možné komunikovat s MCU pomocí terminálu. Schéma propojení LED displeje s FITKitem
Schéma propojení segmentovky
Entita tlv_pc_ifc Entita tlv_pc_ifc je určena pro aplikace, které přistupují k následujícím rozhraním: VGA, PS2, RS232. Aby se aktivoval příslušný budič, musí být zkratována propojka J6. Část sběrnice označená jako (Pinheaders), která není využita pro výše uvedené periferie (kontrétně piny 0-26), je přístupná přes signál X. Synchronizace je řízena přes hodiny SMCLK, resetování přes signál RESET. Obrázek 2.2: Entita tlv_pc_ifc Postup práce: 1. Prostudujte možnosti popisu číslicového systémů a prostředky jazyka VHDL. 2. Důkladně nastudujte způsob připojení LED displeje k FITkitu a princip zobrazení čísel na displeji. 3. Prostudujte ovládání aplikace QDevKit pro práci s FITkitem. 4. Rozbalte soubor (šablonu) z E:\FITkit\LEDsablona\7segment.zip do pracovního adresáře C:\apps (musí vzniknout platná cesta C:\apps\itp\...). Tato šablona obsahuje důležité části VHDL kódu, který využijete při řešení úlohy. Části viditelně označené komentáři v souboru top_level.vhd je třeba doplnit. Důkladně šablonu prostudujte, analyzujte a snažte se pochopit její chování viz příloha. Pro editaci šablony můžete využít prostředí ModelSim nebo Xilinx ISE. 5. Prostudujte, jak se popisuje binární čítač v jazyce VHDL a vhodně doplňte zdrojové kódy čítače do šablony. 6. Prostudujte, jak se popisuje dekodér v jazyce VHDL a vhodně doplňte zdrojové kódy dekodéru pro zobrazení příslušné číslice na LED displeji. 7. Hotový návrh čítače simulujte s využitím aplikace QDevKit a ModelSim. 8. Ověřte funkčnost Vašeho návrhu syntézou do FITkitu přes aplikaci QDevKit. 9. Dle vlastního uvážení modifikujte návrh na dekrementační čítače s různou rychlostí čítání.
Architektura top_level.vhd: architecture main of tlv_gp_ifc is type t_cntrarr is array (7 downto 0) of std_logic_vector(3 downto 0); signal cnt_reg : std_logic_vector(23 downto 0) := (others => '0'); signal cnt_mxreg : std_logic_vector(16 downto 0); signal cmp_cnt_eq : std_logic; signal shreg : std_logic_vector(3 downto 0); signal segdec : std_logic_vector(7 downto 0); signal cntrs_out : t_cntrarr; signal cntrs_en : std_logic_vector(8 downto 0); signal cntrs_lv : std_logic_vector(7 downto 0); signal mx_cntr : std_logic_vector(3 downto 0); begin LEDF <= cnt_reg(21); --synchronni citac s asynchronnim nulovanim, pouziva se povolovaci signal pro kaskadu citace, urcuje okamzik, kdy dojde ke zvyseni hodnoty process(reset, SMCLK) begin!!! ZDE DOPSAT KÓD ČÍTAČE!!! - (uplatní se signály: cnt_reg, cmp_cnt_eq) end process; --delitel 1843200 odpovida casovaní 250ms cmp_cnt_eq <= '1' when (cnt_reg = conv_std_logic_vector(1843200, 23)) else '0'; -- synchronni citac s asynchronnim nulovanim, pouziva se pro generovani signalu pro multiplexovani displeju, frekvence X*100Hz (kde X je pocet segmentu) 100Hz odpovida deliteli 73728 process(reset, SMCLK) begin if (RESET = '1') then cnt_mxreg <= (others => '0'); shreg <= "0001"; elsif SMCLK'event and SMCLK = '1' then if (cnt_mxreg = conv_std_logic_vector(73728/4,17)) then cnt_mxreg <= (others => '0'); shreg <= shreg(2 downto 0) & shreg(3); else cnt_mxreg <= cnt_mxreg + 1; end if; end if; end process; --pole BCD citacu (kazdy cita od 0 do 9) cntrs_en(0) <= cmp_cnt_eq; counters:for i in 0 to 7 generate counter: entity work.counter generic map (0, 9) port map ( CLK => SMCLK, RESET => reset, EN => cntrs_en(i), DATA_OUT => cntrs_out(i), LAST_VAL => cntrs_lv(i)); cntrs_en(i+1) <= cntrs_en(i) and cntrs_lv(i); end generate;
--posouvání číslic po segmentech mx_cntr <= cntrs_out(1) when shreg(1)='1' else cntrs_out(2) when shreg(2)='1' else cntrs_out(3) when shreg(3)='1' else cntrs_out(0); --segdec - prirazeni bitu cislice jednotlivym ledkam segmentu with conv_integer(mx_cntr) select segdec <= "10000000" when others;!!! ZDE DOPLNIT DEKODER ČÍSLIC přiřazení bitů číslicím!!! -- na LED pripojen 23. bit citace, hodnota se zmeni kazdych 4 194 304 hodinovych taktu X(12) <= '0' when shreg(0) = '1' else 'Z'; X(14) <= '0' when shreg(1) = '1' else 'Z'; X(16) <= '0' when shreg(2) = '1' else 'Z'; X(18) <= '0' when shreg(3) = '1' else 'Z'; X(20) <= segdec(5); --f X(22) <= segdec(6); --g X(24) <= segdec(0); --a X(26) <= segdec(1); --b X(28) <= segdec(7); --tecka X(30) <= segdec(4); --e X(32) <= segdec(3); --d X(34) <= segdec(2); --c end main;