Układy cyfrowe i systemy wbudowane 1 – laboratorium mgr inż. Antoni Sterna Pt 1245 - 1500
SPRAWOZDANIE
W czasie zajęć naszym zadaniem było napisanie generatora treści do wyświetlenia na wbudowanym w Spartana wyświetlaczu LCD za pomocą gotowego modułu LCDWrite. Ćwiczenia zrealizowaliśmy w programie Xilnix ISE Project Navigator, a nasze projekty programowaliśmy na układzie Spartan.
Generator treści dla modułu wyświetlacza LCD
Jak już wspomnieliśmy wcześniej, układ zbudowaliśmy wykorzystując gotowy moduł do obsługi wyświetlacza LCDWrite. Do tego modułu podłączyliśmy napisany przez nas moduł generujący treść do wyświetlenia. Najważniejszym problemem przy realizacji tego zadania było przełączanie układu sterującego wyświetlaczem w odpowiedni tryb pracy (tryb danych lub tryb komend) w odpowiednim czasie. Służy do tego linia DnI. Ponadto niezbędne było użycie linii Write Enable w momencie, kiedy chcieliśmy przesłać dane. Niestety, w czasie projektowania modułu generatora dokonaliśmy zbyt dużych uproszczeń wewnątrz struktury (niestety, większość czasu spędziliśmy na szukaniu przyczyny, którą udało się znaleźć dopiero z pomocą prowadzącego), co poskutkowało tym, że moduł nie działał poprawnie. Ze względu na ograniczony czas na zajęciach nie zdążyliśmy już poprawić naszych błędów, dlatego prezentujemy to, co udało nam się zrobić. Schemat układu przedstawiał się następująco:
A oto kod generatora:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity generator is
port
(
clk : in std_logic;
reset : in std_logic;
selector : in std_logic;
busy : in std_logic;
dni : out std_logic;
data : out std_logic_vector(7 downto 0);
write_enable : out std_logic
);
end generator;
architecture generator_arch of generator is
type state is
(
working_state,
finished_state
);
type bytes_type is array (integer range <>) of std_logic_vector(7 downto 0);
constant bytes : bytes_type := (X"30", X"31");
signal st : state;
signal counter : integer range 0 to bytes'length - 1;
begin
process (clk, reset, st, b, counter)
begin
if reset = '1' then
st <= working_state;
counter <= 0;
elsif rising_edge(clk) and st = working_state and busy = '0' then
if counter < bytes'length - 1 then
counter <= counter + 1;
else
st <= finished_state;
end if;
end if;
end process;
dni <= '1';
write_enable <= '1' when (st = working_state and clk = '1') else '0';
data <= bytes(counter);
end generator_arch;
Wnioski:
Dzięki tym zajęciom mogliśmy doskonalić nasze umiejętności w zakresie programowania w języku VHDL, a także poznać specyfikę obsługi wyświetlacza LCD wbudowanego w układ Spartan. Mimo, iż zaprojektowany przez nas układ okazał się nie działać, to dzięki własnym doświadczeniom i wskazówkom prowadzącego mamy nadzieję, że podobny problem nie spotka nas na kolejnych zajęciach. Podobnie jak w czasie poprzednich zajęć, bardzo pomocna okazała się również funkcja eksportu modułu napisanego w VHDL do symbolu, dzięki czemu łatwo mogliśmy zbudować schemat naszego układu.