[VHDL] wyświetlanie 4 cyfr na wyświetlaczu siedmiosegmentowy
: 22 maja 2016, o 01:21
Dzień dobry.
Chcę napisać kod VHDL, który da się zaimplementować w układzie CPLD, aby wyświetlał ciągle liczbę czterocyfrowa na czterocyfrowym multipleksowym wyświetlaczu siedmiosegmentowym.
Pozycję wyświetlacza uaktywnia się poprzez podanie stanu niskiego na poszczególne wyprowadzenia anod 1-4. Cykliczne przełączanie stanu niskiego na poszczególne wyprowadzenia muszę zrobić wykorzystując automat stanów. Wyjścia automatu podaję na poszczególne wyprowadzenia wyświetlacza. To generalnie w moim kodzie działa.
Wyboru zestawu bitów podawanych na odpowiednie segmenty wyświetlacza w zależności od zestawu bitów podawanych na poszczególne wyprowadzenia anod 1-4 muszę dokonać za pomocą instrukcji with ... select. O ile samą instrukcję potrafię napisać, to mam problem z podaniem co ma być na wejściu tej instrukcji.
Poniżej mój kod:
Program sygnalizuje błąd w linii 79 i wyświetla komunikat "Cannot read from 'out' object an4 ; use 'buffer' or 'inout'", wnioskuję zatem, że błędnie podaję dane na wejście instrukcji with select. Czy ktoś wie, jak to powinno prawidłowo wyglądać?
Chcę napisać kod VHDL, który da się zaimplementować w układzie CPLD, aby wyświetlał ciągle liczbę czterocyfrowa na czterocyfrowym multipleksowym wyświetlaczu siedmiosegmentowym.
Pozycję wyświetlacza uaktywnia się poprzez podanie stanu niskiego na poszczególne wyprowadzenia anod 1-4. Cykliczne przełączanie stanu niskiego na poszczególne wyprowadzenia muszę zrobić wykorzystując automat stanów. Wyjścia automatu podaję na poszczególne wyprowadzenia wyświetlacza. To generalnie w moim kodzie działa.
Wyboru zestawu bitów podawanych na odpowiednie segmenty wyświetlacza w zależności od zestawu bitów podawanych na poszczególne wyprowadzenia anod 1-4 muszę dokonać za pomocą instrukcji with ... select. O ile samą instrukcję potrafię napisać, to mam problem z podaniem co ma być na wejściu tej instrukcji.
Poniżej mój kod:
Kod: Zaznacz cały
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity maszyna is
Port ( clk_wejscie : in STD_LOGIC;
an1 : out STD_LOGIC;
an2 : out STD_LOGIC;
an3 : out STD_LOGIC;
an4 : out STD_LOGIC);
g : out STD_LOGIC;
f : out STD_LOGIC;
e : out STD_LOGIC;
d : out STD_LOGIC;
c : out STD_LOGIC;
b : out STD_LOGIC;
a : out STD_LOGIC);
end maszyna;
architecture Behavioral of maszyna is
type stany is (s0, s1, s2, s3);
signal aktualny_stan, nastepny_stan: stany;
signal wyjscie: std_logic_vector (0 to 3);
signal licznik: integer range 0 to 199999:=0;
signal tym: std_logic:='0';
signal clk_wyjscie: std_logic;
--wejscie i wyjscie segmentow
signal WY : STD_LOGIC_VECTOR(6 downto 0);
signal WE : STD_LOGIC_VECTOR(3 downto 0);
begin
--maszyna stanów
process (aktualny_stan)
begin
case aktualny_stan is
when s0 =>
wyjscie <= "0111";
nastepny_stan <= s1;
when s1 =>
wyjscie <= "1011";
nastepny_stan <= s2;
when s2 =>
wyjscie <= "1101";
nastepny_stan <= s3;
when s3 =>
wyjscie <= "1110";
nastepny_stan <= s0;
end case;
end process;
--dzielnik częstotliwości
process (clk_wejscie)
begin
if (rising_edge(clk_wejscie)) then
if (licznik = 199999) then
tym <= not tym;
licznik <= 0;
else
licznik <= licznik+1;
end if;
end if;
end process;
clk_wyjscie <= tym;
-- zmiana stanu
process (clk_wyjscie)
begin
if (rising_edge(clk_wyjscie)) then
aktualny_stan <= nastepny_stan;
end if;
end process;
an1<=wyjscie(0);
an2<=wyjscie(1);
an3<=wyjscie(2);
an4<=wyjscie(3);
--podawanie zestawu bitow na wyswietlacz siedmiosegmentowy
WE <= an4 & an3 & an2 & an1;
with WE select
WY <= "1000000" when "0111", --wyswietla 0
"1111001" when "1011", --wyswietla 1
"0100100" when "1101", --wyswietla 2
"0000000" when "1110", --wyswietla 8
"1111111" when others; --nie wyswietla nic
g <= WY(6);
f <= WY(5);
e <= WY(4);
d <= WY(3);
c <= WY(2);
b <= WY(1);
a <= WY(0);
end Behavioral;