[VHDL] wyświetlanie 4 cyfr na wyświetlaczu siedmiosegmentowy

qwerz
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 16 sty 2016, o 19:20
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 11 razy

[VHDL] wyświetlanie 4 cyfr na wyświetlaczu siedmiosegmentowy

Post autor: qwerz »

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:

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;
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ć?
jarek4700
Użytkownik
Użytkownik
Posty: 939
Rejestracja: 26 gru 2009, o 17:38
Płeć: Mężczyzna
Lokalizacja: Mazowsze
Podziękował: 5 razy
Pomógł: 228 razy

[VHDL] wyświetlanie 4 cyfr na wyświetlaczu siedmiosegmentowy

Post autor: jarek4700 »

Kod: Zaznacz cały

WE <= wyjscie
Nie możesz czytać z portu typu out.
ODPOWIEDZ