Układy cyfrowe i systemy wbudowane 1 – laboratorium mgr inż. Antoni Sterna Pt 1245 - 1500
SPRAWOZDANIE
Podobnie jak na poprzednich zajęciach, nasze układy opisywaliśmy przy pomocy języka VHDL. Pierwsze do wykonania ćwiczenie polegało na wykonaniu automatu Moore’a, natomiast drugie ćwiczenie polegało na zbudowaniu układu symulującego działanie systemu sygnalizacji świetlnej na skrzyżowaniu. Ćwiczenia zrealizowaliśmy w programie Xilnix ISE Project Navigator, do sprawdzenia poprawności działania skorzystaliśmy z wbudowanego symulatora ISim Simulator, a następnie zaprogramowaliśmy je w układzie XC9572XL.
Automat Moore’a
Poniżej zamieszczony jest realizacja zadania w kodzie VHDL. Oczywiście zarówno w symulatorze, jak i po zaprogramowaniu na układzie, kod działał prawidłowo.
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 moore is
port(
Clk : in std_logic;
input : in std_logic;
reset : in std_logic;
state_o : out std_logic_vector(1 downto 0);
y : out std_logic := '0');
end moore;
architecture moore_arch of moore is
signal state : unsigned(1 downto 0);
begin
process(Clk, input, reset)
begin
if reset = '1' then
state <= to_unsigned(0, 2);
elsif rising_edge(Clk) then
if state < to_unsigned(3, 2) then
if input = '0' then
state <= state + to_unsigned(1, 2);
else
state <= to_unsigned(0, 2);
end if;
else
if input = '1' then
state <= to_unsigned(0, 2);
end if;
end if;
end if;
end process;
process(state)
begin
if state < to_unsigned(3, 2) then
y <= '0';
else
y <= '1';
end if;
end process;
state_o <= std_logic_vector(state);
end moore_arch;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity moore_use is
port(
Clk_LF : in std_logic;
K0 : in std_logic;
K1 : in std_logic;
S : out std_logic_vector(1 downto 0);
S2 : out std_logic := '0');
end moore_use;
architecture moore_use_arch of moore_use is
COMPONENT moore
PORT(
Clk : IN std_logic;
input : IN std_logic;
reset : in std_logic;
state_o : out std_logic_vector(1 downto 0);
y : OUT std_logic
);
END COMPONENT;
begin
m : moore port map(Clk_LF, K0, K1, S, S2);
end moore_use_arch;
Zbudować układ symulujący działanie sygnalizacji świetlnej na skrzyżowaniu.
Sygnalizacja miała składać się z sygnalizatora dla samochodów, sygnalizatora dla pieszych oraz przycisku do zgłaszania chęci przejścia przez ulicę dla pieszych. Po naciśnięciu przycisku, po określonym czasie sygnalizator dla samochodów powinien zmienić światło na żółte i czerwone, a dla pieszych na zielone. Następnie po upływie określonego czasu sygnalizator pieszych powinien pokazywać czerwone światło, a dla samochodów – zielone. Działanie układu wyglądało poprawnie zarówno w symulatorze, jak i po zaprogramowaniu na układzie Xilinx. Poniżej zaprezentowany jest kod VHDL naszej realizacji:
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 counter is
port(
CLR : in std_logic;
Clk_LF : in std_logic;
modulo : in std_logic_vector(1 downto 0);
count : out std_logic_vector(3 downto 0);
terminal_count : out std_logic);
end counter;
architecture counter_arch of counter is
signal count_internal : unsigned(3 downto 0);
signal modulo_value : unsigned(3 downto 0);
begin
process (modulo) is
begin
case modulo is
when "00" => modulo_value <= to_unsigned(3, 4);
when "01" => modulo_value <= to_unsigned(2, 4);
when "10" => modulo_value <= to_unsigned(8, 4);
when "11" => modulo_value <= to_unsigned(2, 4);
when others => modulo_value <= to_unsigned(0, 4);
end case;
end process;
process (CLR, Clk_LF) is
begin
if CLR = '1' then
count_internal <= to_unsigned(0, count_internal'length);
elsif rising_edge(Clk_LF) then
if count_internal < (modulo_value - to_unsigned(1, count_internal'length)) then
count_internal <= (count_internal + to_unsigned(1, count_internal'length));
else
count_internal <= to_unsigned(0, count_internal'length);
end if;
end if;
end process;
count <= not std_logic_vector(count_internal);
terminal_count <= '1' when (count_internal + to_unsigned(1, 3) = modulo_value) else '0';
end counter_arch;
Wnioski:
Dzięki tym zajęciom mieliśmy okazję doskonalić nasze umiejętności w zakresie programowania w języku VHDL. Dzięki tym ćwiczeniom nauczyliśmy się budować liczniki, a także posługiwać się sygnałami wewnętrznymi i korzystać ze zbocza narastającego sygnału przy konstruowaniu warunków. Ponadto znów mogliśmy wykorzystać wbudowany w środowisko symulator do sprawdzenia poprawności działania naszych realizacji przed zaprogramowaniem ich w układzie, co pomogło nam znaleźć popełnione błędy i ułatwiło ich poprawienie. Nabyte w czasie zajęć umiejętności z pewnością pomogą nam przy wykonywaniu zadań na kolejnych zajęciach.