martaczaska

Untitled

Apr 14th, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.71 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.  
  9. entity DISPLAY is
  10. port(
  11. CLK_i : in STD_LOGIC;
  12. RST_i : in STD_LOGIC; -- ostrzega że reset nie jest używany, ale tutaj i tak nie może być użyte, więc nie trzeba przejmować się tym ostrzeżeniem za bardzo; można ew. zakomentować tę linijkę - wtedy będzie już cutmiut zielono, przynajmniej w syntezie
  13. SW : in STD_LOGIC_vector (7 downto 0);
  14. BTN : in STD_LOGIC_vector (3 downto 0);
  15. AN : out STD_LOGIC_vector (3 downto 0);
  16. SEG : out STD_LOGIC_vector (7 downto 0)
  17. );
  18. end DISPLAY;
  19.  
  20. architecture Behavioral of DISPLAY is
  21.  
  22. signal BTN_ktory : STD_LOGIC_vector (3 downto 0) := "0000";
  23. signal DGT_teraz : STD_LOGIC_vector (31 downto 0) := "11111111111111111111111111111111";
  24. signal CLK_1kHz : STD_LOGIC;
  25.  
  26. component dzielnik_czt is
  27. port (
  28. CLK_i: in STD_LOGIC;
  29. RST_i : in STD_LOGIC;
  30. led7 : out STD_LOGIC
  31. );
  32. end component;
  33.  
  34. component wyswietlacz
  35. port (CLK_i : in STD_LOGIC;
  36. RST_i : in STD_LOGIC;
  37. DGT_i : in STD_LOGIC_VECTOR (31 downto 0);
  38. AN : out STD_LOGIC_VECTOR (3 downto 0);
  39. SEG : out STD_LOGIC_VECTOR (7 downto 0));
  40. end component;
  41.  
  42.  
  43. function zamiana(SW: STD_LOGIC_VECTOR (3 downto 0)) return STD_LOGIC_VECTOR is
  44. begin
  45. case SW is
  46. when "0000" => return "0000001"; -- 0
  47. when "0001" => return "1001111"; -- 1
  48. when "0010" => return "0010010"; -- 2
  49. when "0011" => return "0000110"; -- 3
  50. when "0100" => return "1001100"; -- 4
  51. when "0101" => return "0100100"; -- 5
  52. when "0110" => return "0100000"; -- 6
  53. when "0111" => return "0001111"; -- 7
  54. when "1000" => return "0000000"; -- 8
  55. when "1001" => return "0000100"; -- 9
  56. when "1010" => return "0000010"; -- a
  57. when "1011" => return "1100000"; -- b
  58. when "1100" => return "0110001"; -- C
  59. when "1101" => return "1000010"; -- d
  60. when "1110" => return "0110000"; -- E
  61. when "1111" => return "0111000"; -- F
  62. when others => return "1111111"; -- wygaszenie -- z jakichś powodów nawet gdy są wszystkie możliwe wartości, to narzeka, że nie ma linijki "when others", a właściwie to się buntuje
  63. end case;
  64. end function zamiana;
  65.  
  66.  
  67. begin
  68. dzielonko: dzielnik_czt port map(
  69. CLK_i => CLK_i,
  70. RST_i => '0',
  71. led7 => CLK_1kHz);
  72.  
  73. wyswietlanko: wyswietlacz port map(
  74. CLK_i => CLK_1kHz,
  75. RST_i => '0',
  76. DGT_i => DGT_teraz,
  77. AN => AN,
  78. SEG => SEG);
  79.  
  80. ustawianie : process(CLK_i)
  81. begin
  82. if(rising_edge(CLK_i)) then
  83. BTN_ktory <= BTN; --wyswietlanie wybranej liczby
  84. DGT_teraz(0) <= not SW(4); --dodawanie kropek
  85. DGT_teraz(8) <= not SW(5);
  86. DGT_teraz(16) <= not SW(6);
  87. DGT_teraz(24) <= not SW(7);
  88.  
  89.  
  90. if(BTN_ktory = "1110") then
  91. DGT_teraz(7 downto 1) <= zamiana(SW(3 downto 0)); -- DGT_teraz jako całość ma 32 bity; "szuflada" z informacją, które segmenty mają być
  92. -- pokazane na ostatnim wyświetlaczu (wybóra ostatniego batona, 1110) musi być 7-bitowa
  93. elsif(BTN_ktory = "1101") then -- (tak jak to jest zapisane w funkcji) i być przechowywana we wskazanym miejscu komody
  94. DGT_teraz(15 downto 9) <= zamiana(SW(3 downto 0)); -- o nazwie "DG_teraz" - trzeba wskazać w której części 32 bitowego wektora ma być 7-bitowy
  95. -- wektor (tak na prawdę ta szuflada jest 8-bitowa, ale jeden bit jest już zajęty przez skarpetę
  96. elsif(BTN_ktory = "1011") then -- o nazwie kropka na wyświetlaczu i przypisany w wierszach 84-87, więc bity te pomijamy
  97. DGT_teraz(23 downto 17) <= zamiana(SW(3 downto 0)); -- podczas "wkładania" zawartość switchy tylko do szufladek)
  98.  
  99. elsif(BTN_ktory = "0111") then -- czyli np. DGT_teraz(15 downto 9) <= ... zamiast samego DGT_teraz <= ...
  100. DGT_teraz(31 downto 25) <= zamiana(SW(3 downto 0));
  101.  
  102. else DGT_teraz<= DGT_teraz;
  103.  
  104. end if;
  105. end if;
  106.  
  107. end process;
  108. -- puste szuflady:
  109. -- 31-24 dla wyświetlacza 0111 (AN3)
  110. -- 23-16 dla wyświetlacza 1011 (AN2)
  111. -- 15-8 dla wyświetlacza 1101 (AN1)
  112. -- 7-0 dla wyświetlacza 1110 (AN0)
  113. --
  114. --
  115. -- wolne miejsca w szufladzie, gdy leżą w nich śmierdzonce skarpety (wolne, tzn przeznaczone dla segmentów):
  116. -- 31-25 (przesunięcie ostatniej pozycji o +1 w górę, bo nie możemy jej zająć, długość szufladki skraca się o 1)
  117. -- 23-17 (16+1)
  118. -- 15-9 (8+1)
  119. -- 7-1 (0+1)
  120. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment