martaczaska

Untitled

Apr 7th, 2019
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.62 KB | None | 0 0
  1. --DISPLAY:
  2.  
  3. library IEEE;
  4. use IEEE.STD_LOGIC_1164.ALL;
  5. use IEEE.STD_LOGIC_ARITH.ALL;
  6. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  7.  
  8. entity DISPLAY is
  9. port(
  10. CLK : in STD_LOGIC;
  11. RST : in STD_LOGIC;
  12. SW : out STD_LOGIC_vector (7 downto 0);
  13. BTN : in STD_LOGIC_vector (3 downto 0);
  14. AN : out STD_LOGIC_vector (3 downto 0);
  15. SEG : out STD_LOGIC_vector (7 downto 0)
  16. );
  17. end DISPLAY;
  18.  
  19. architecture Behavioral of DISPLAY is
  20.  
  21. signal BTN_ktory : STD_LOGIC_vector (3 downto 0) := "0000";
  22. signal DGT_teraz : STD_LOGIC_vector (31 downto 0) := "11111111111111111111111111111111";
  23. signal CLK_1kHz : STD_LOGIC;
  24.  
  25. component dzielnik_czt is
  26. port (
  27. clock : in STD_LOGIC;
  28. reset : in STD_LOGIC;
  29. led7 : out STD_LOGIC
  30. );
  31. end component;
  32.  
  33. component wyswietlacz
  34. port ( CLK_i : in STD_LOGIC;
  35. RST_i : in STD_LOGIC;
  36. DGT_i : in STD_LOGIC_VECTOR (31 downto 0);
  37. AN : out STD_LOGIC_VECTOR (3 downto 0);
  38. SEG : out STD_LOGIC_VECTOR (7 downto 0));
  39. end component;
  40.  
  41.  
  42. function zamiana(SW: STD_LOGIC_VECTOR (3 downto 0)) return STD_LOGIC_VECTOR is
  43. begin
  44. case SW is
  45. when "0000" => return "0000001"; -- 0
  46. when "0001" => return "1001111"; -- 1
  47. when "0010" => return "0010010"; -- 2
  48. when "0011" => return "0000110"; -- 3
  49. when "0100" => return "1001100"; -- 4
  50. when "0101" => return "0100100"; -- 5
  51. when "0110" => return "0100000"; -- 6
  52. when "0111" => return "0001111"; -- 7
  53. when "1000" => return "0000000"; -- 8
  54. when "1001" => return "0000100"; -- 9
  55. when "1010" => return "0000010"; -- a
  56. when "1011" => return "1100000"; -- b
  57. when "1100" => return "0110001"; -- C
  58. when "1101" => return "1000010"; -- d
  59. when "1110" => return "0110000"; -- E
  60. when "1111" => return "0111000"; -- F
  61. end case;
  62. end function zmiana;
  63.  
  64. -- Trochę to działa jak w C++ / Javie, tylko że jakby od dupy strony
  65. -- w C++ podaję: typ funkcji (co zwraca) nazwę funkcji listę argumentów/parametrów w postaci "typ parametru, nazwa"
  66. -- np. float Miłosz (int ile_wypił) ---> Miłosz zwraca jakąś liczbę zmiennoprzecinkową, parametrem jest ile butelek wypił
  67. --
  68. --
  69. -- w VHDL podaję: nazwę funkcji listę argumentów (nazwa, typ) typ funkcji (co zwraca)
  70. -- w tym przypadku argumentem funkcji jest awizo (za "awizo" będziemy później podstawiać wektor SW (3 downto o) - przesłany
  71. -- do tej funkcji jako parametr
  72. --
  73. -- w zależności od tego, co prześlemy (tzn zależnie od wartości wektora SW) funkcja będzie zwracała inny wektor, który później
  74. -- będzie rzucony na segmenty (czyli zwróci jakiś STD_LOGIC_VECTOR); samo działanie jest ofc takie samo jak tego procesu, który
  75. -- był tu przed chwilą, tyle że możemy w razie czego ten "proces" wywołać w kilku miejscach, nawet z innymi parametrami, jeśli
  76. -- zajdzie taka potrzeba (tu jej nie ma, przesyłamy zawsze SW)
  77.  
  78.  
  79. begin -- jeśli zamienimy to wyżej na funkcję, to begin musi być po niej
  80. dzielonko: dzielnik_czt port map(CLK_i => CLK_i,
  81. RST_i => '0',
  82. CLK_o => CLK_1kHz);
  83.  
  84. wyswietlanko: wyswietlacz port map(CLK_i => CLK_1kHz,
  85. RST_i => '0',
  86. DGT_teraz => DGT_teraz,
  87. AN => AN,
  88. SEG => SEG);
  89.  
  90. ustawianie : process(CLK_i)
  91. begin -- odkomentowane begin
  92. if(rising_edge(CLK_i)) then
  93. BTN_ktory <= BTN; --wyswietlanie wybranej liczby
  94. DGT_teraz(0) <= not SW(4); --dodawanie kropek
  95. DGT_teraz(8) <= not SW(5);
  96. DGT_teraz(16) <= not SW(6);
  97. DGT_teraz(24) <= not SW(7);
  98.  
  99.  
  100. if(BTN_ktory = '0') then -- := zamienione na = (:= oznacza przypisanie do zmiennej)
  101. DGT_teraz <= zmiana(SW(3 downto 0)); -- lepiej zostawić funkcję, nie można "wywoływać"
  102. -- procesu (też tak chciałem xD)
  103. elsif(BTN_ktory = '1') then -- i tu
  104. DGT_teraz <= zmiana(SW(3 downto 0)); -- "process" zamieniony na nazwę wywoływanej funkcji
  105.  
  106. elsif(BTN_ktory = '2') then -- i tu
  107. DGT_teraz <= zmiana(SW(3 downto 0)); -- "process" zamieniony na nazwę wywoływanej funkcji
  108.  
  109. elsif(BTN_ktory = '3') then -- i tu
  110. DGT_teraz <= zmiana(SW(3 downto 0)); -- "process" zamieniony na nazwę wywoływanej funkcji
  111.  
  112. end if;
  113. end if;
  114.  
  115. end process;
  116.  
  117. end Behavioral;
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. --DZIELNIK:
  132.  
  133.  
  134. library IEEE;
  135. use IEEE.STD_LOGIC_1164.ALL;
  136.  
  137. entity dzielnik_czt is
  138. port (
  139. clock : in STD_LOGIC;
  140. reset : in STD_LOGIC;
  141. led7 : out STD_LOGIC
  142. );
  143. end dzielnik_czt;
  144.  
  145. architecture behavioral of dzielnik_czt is
  146.  
  147. constant N : integer := 50 ; -- tutej zmienić na 50000
  148. signal wynik: STD_LOGIC := '0';
  149. signal licz : integer range 0 to (N - 1);
  150.  
  151. begin
  152.  
  153. dzielnik_czestot: process (reset, clock)
  154. begin
  155. if (reset = '1') then
  156. wynik <= '0';
  157. licz <= 0;
  158. elsif (rising_edge(clock)) then
  159. licz <= licz + 1;
  160. if( N = 2) then
  161. wynik <= not(wynik);
  162. licz <= 0;
  163. elsif(licz = (N/2)) then
  164. wynik <= '1';
  165. elsif(licz = (N - 1)) then
  166. wynik <= '0';
  167. licz <= 0;
  168. end if;
  169. end if;
  170. end process dzielnik_czestot;
  171.  
  172. led7 <= wynik;
  173.  
  174. end Behavioral;
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185. --WYSWIETLACZ:
  186.  
  187. library IEEE;
  188. use IEEE.STD_LOGIC_1164.ALL;
  189.  
  190. entity wyswietlacz is
  191. port(
  192. CLK : in STD_LOGIC;
  193. RST : in STD_LOGIC;
  194. DGT : in STD_LOGIC_vector (31 downto 0);
  195. AN : out STD_LOGIC_vector (3 downto 0);
  196. SEG : out STD_LOGIC_vector (7 downto 0)
  197. );
  198. end wyswietlacz;
  199.  
  200.  
  201.  
  202. architecture Behavioral of wyswietlacz is
  203. signal aktywny_AN: STD_LOGIC_VECTOR (3 downto 0) := "1111";
  204.  
  205. begin
  206. process(CLK, RST, DGT, aktywny_AN)
  207.  
  208. begin
  209. if(RST = '1') then
  210. AN <= "0000";
  211. SEG <= "00000000";
  212. elsif(rising_edge(CLK)) then
  213. case aktywny_AN is
  214. when "0000" => aktywny_AN <= "0111";
  215. when "0111" => aktywny_AN <= "1011";
  216. when "1011" => aktywny_AN <= "1101";
  217. when "1101" => aktywny_AN <= "1110";
  218. when "1110" => aktywny_AN <= "0111";
  219. when others => aktywny_AN <= "0111";
  220. end case;
  221.  
  222. case aktywny_AN is
  223. when "0111" => SEG <= DGT(31 downto 24);
  224. when "1011" => SEG <= DGT(23 downto 16);
  225. when "1101" => SEG <= DGT(15 downto 8);
  226. when "1110" => SEG <= DGT(7 downto 0);
  227. when others => SEG <= "00000000";
  228. end case;
  229.  
  230. end if;
  231. AN <= aktywny_AN;
  232. end process;
  233.  
  234. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment