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;