baku123 Poziom 3

Joined: 21 Mar 2007 Posts: 5 Location: Białystok
|
#1
06 Dec 2011 00:25 przeliczanie na drogę ALTERA Cyclone w Quartusie |
|
|
|
Mam do zrobienia "miernik odległości" a ma to wyglądać tak że włączam jednym przyciskiem stoper tym samym wyłączam go tzn wynik nalicza i zatrzymuje się na wyświetlaczu segmentowym, a drugim przyciskiem reset (TO JUŻ JEST W KODZIE PONIŻEJ). Kolejnym przyciskiem przeliczamy ten czas na drogę mając już przypisaną w kodzie domyślną prędkość światła lub dźwięku i wyświetlenie to na segmentowym. jak narazie zrobiłem coś takiego jak widać poniżej i jestem w kropce. Mam nadzieję że ktoś mi podpowie jak dalszą część dopisać tak jak wytłumaczyłem.
| Code: |
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is
port ( R,P,CLK : in std_logic; --wejscia reset, przycisk i zegar z plyty
ps : buffer std_logic :=('0'); --stan przycisku liczenia
LED : out std_logic_vector(7 downto 0); -- stany wyswietlacza
Y,y1,y2,y3,y4 : buffer std_logic_vector(3 downto 0); --kolejna liczba dziesietna licznika
C1,C2,C3,C4 : buffer std_logic; --stany do uruchomienia cyfry wyswietlacza
CL4 : buffer std_logic_vector(1 downto 0); -- wybor cyfry wyswietlacza
cc,cy : buffer std_logic_vector(15 downto 0) :=("0000000000000000"); --podzielniki zegarow cm i cLed
cm,CLed : buffer std_logic); --zegary
end counter;
architecture czasomierz of counter is
begin
process (CLK) --zegar 1kHz cm
begin
if rising_edge(CLK) then
if (cc = "110000110101000") then
cm <= not cm;
cc <= "0000000000000000";
else
cc <= cc + 1;
end if;
end if;
end process;
process (CLK) --zegar 1kHz cLed
begin
if rising_edge(CLK) then
if (cy ="110000110101000") then
CLed <= not CLed;
cy <= "0000000000000000";
else
cy <= cy + 1;
end if;
end if;
end process;
process(cm,R,P) --liczenie miedzy nacisnieciami przycisku P
begin
if (P='0' and P'event)then -- stan przycisku
ps <= not ps;
end if;
if (R='0') then
y4 <= "0000";
y3 <= "0000";
y2 <= "0000";
y1 <= "0000";
ps<='0';
elsif(ps = '1' and rising_edge(cm))then
y1 <= y1 + 1;
if(y1 = "1001") then
y1 <= "0000";
y2 <= y2 + 1;
if(y2 ="1001") then
y2 <= "0000";
y3 <= y3 + 1;
if(y3 ="1001") then
y3 <= "0000";
y4 <= y4 + 1;
if(y4 = "1001") then
y4 <= "0000";
end if;
end if;
end if;
end if;
end if;
end process;
process(y1,y2,y3,y4,CLed,CL4) --wyswietlacz
begin
if rising_edge(CLed) then
CL4<= CL4+1;
if (CL4 = "00") then
C1<='1';
C2<='1';
C3<='1';
C4<='0';
Y<=y3;
end if;
if (CL4 = "01") then
C1<='1';
C2<='1';
C3<='0';
C4<='1';
Y<=y2;
end if;
if (CL4 = "10") then
C1<='1';
C2<='0';
C3<='1';
C4<='1';
Y<=y1;
end if;
if (CL4 = "11") then
C1<='0';
C2<='1';
C3<='1';
C4<='1';
Y<=y4;
end if;
case Y is
when "0000" => LED <= "10010000"; --0
when "0001" => LED <= "10011111"; --1
when "0010" => LED <= "01011000"; --2
when "0011" => LED <= "00011001"; --3
when "0100" => LED <= "00010111"; --4
when "0101" => LED <= "00110001"; --5
when "0110" => LED <= "00110000"; --6
when "0111" => LED <= "10011101"; --7
when "1000" => LED <= "00010000"; --8
when "1001" => LED <= "00010001"; --9
when others => LED <= "11101111"; --oth
end case;
end if;
end process;
end czasomierz;
|
Jeżeli ktoś ma lepszy pomysł i prostszy to niech się podzieli rozwiązaniem gdyż ja raczej na tą chwile nic lepszego nie wymyślę
Pozdrawiam.
|
|