Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.86 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity Lab8_del2_ag_vo is
  6. port(
  7. CLOCK_50 : in std_logic;
  8. KEY : in std_logic_vector(3 downto 0);
  9. SW : in std_logic_vector(17 downto 0);
  10. GPIO : inout std_logic_vector(35 downto 0);
  11. LEDR : out std_logic_vector(17 downto 0);
  12. LEDG : out std_logic_vector(7 downto 0);
  13. LCD_RS, LCD_EN : out std_logic;
  14. LCD_RW : out std_logic;
  15. LCD_ON : out std_logic;
  16. LCD_DATA : inout std_logic_vector(7 downto 0);
  17. HEX0, HEX1, HEX2, HEX3, HEX4, HEX5 : out std_logic_vector(6 downto 0)
  18. );
  19. end entity Lab8_del2_ag_vo;
  20.  
  21. architecture RTL of Lab8_del2_ag_vo is
  22.  
  23. component enable_gen is
  24. port(
  25. clock_50 : in std_logic;
  26. resetn : in std_logic;
  27. velg_enable : in std_logic_vector(2 downto 0);
  28. enable : out std_logic
  29. );
  30. end component enable_gen;
  31.  
  32. component reset_synchronizer is
  33. port(
  34. clk : in std_logic;
  35. reset_key3 : in std_logic;
  36. reset_clk : out std_logic
  37. );
  38. end component reset_synchronizer;
  39.  
  40. component synkronisering is
  41. port(
  42. clk : in std_logic;
  43. data_inn : in std_logic;
  44. data_ut : out std_logic
  45. );
  46. end component synkronisering;
  47.  
  48. component baudrate_gen is
  49. port(
  50. CLOCK_50 : in std_logic;
  51. resetn : in std_logic;
  52. velg_baudrate : in std_logic_vector(2 downto 0);
  53. start_teller : in std_logic;
  54.  
  55. baud_enable_m : out std_logic;
  56. baud_enable_s : out std_logic
  57. );
  58. end component baudrate_gen;
  59.  
  60. component LCD_Display is
  61. port(
  62. reset, clk_48Mhz : IN STD_LOGIC;
  63. Hex_Display_Data : IN STD_LOGIC_VECTOR(23 DOWNTO 0);
  64. LCD_RS, LCD_E : OUT STD_LOGIC;
  65. LCD_RW : OUT STD_LOGIC;
  66. DATA_BUS : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));
  67. end component LCD_Display;
  68.  
  69. component L4_klokke_AG is
  70. port(
  71. CLOCK_50 : in std_logic;
  72. resetn : in std_logic;
  73. KEY : in std_logic_vector(3 downto 0);
  74. SW : in std_logic_vector(2 downto 0);
  75. HEX0, HEX1, HEX2, HEX3, HEX4, HEX5 : out std_logic_vector(6 downto 0);
  76. bcd_hours : out std_logic_vector(7 downto 0);
  77. bcd_minutes : out std_logic_vector(7 downto 0);
  78. bcd_seconds : out std_logic_vector(7 downto 0)
  79. );
  80. end component L4_klokke_AG;
  81.  
  82. signal resetn : std_logic;
  83. signal hallo_enable : std_logic;
  84. signal hallo : std_logic;
  85. signal sender : std_logic;
  86. signal mottatt_blink : std_logic;
  87. signal vippe_a, vippe_b : std_logic;
  88.  
  89. signal start_teller : std_logic;
  90. signal baud_enable_m : std_logic;
  91. signal baud_enable_s : std_logic;
  92.  
  93. signal data_inn : std_logic;
  94. signal data_ut : std_logic;
  95.  
  96. signal start_sender : std_logic;
  97. signal start_q, start_qq : std_logic;
  98. signal send_shift_register : std_logic_vector(9 downto 0);
  99.  
  100. constant START_BIT : std_logic := '0';
  101. constant STOPP_BIT : std_logic := '1';
  102.  
  103. -- sender
  104. type sender_state_type is (s_idle, s_transmit, s_shift_out, s_finish, s_wait);
  105. signal sender_state : sender_state_type;
  106.  
  107.  
  108. signal data_inn_q : std_logic;
  109. signal data_inn_qq : std_logic;
  110. signal data_inn_qqq : std_logic;
  111.  
  112. signal error : std_logic;
  113. signal mottak_shift_reg : std_logic_vector(10 downto 0);
  114. signal mottatt_data : std_logic_vector(7 downto 0);
  115.  
  116. -- del 3
  117. signal bcd_sec : std_logic_vector(7 downto 0);
  118. signal bcd_min : std_logic_vector(7 downto 0);
  119. signal bcd_hour : std_logic_vector(7 downto 0);
  120. signal LCD_bcd : std_logic_vector(23 downto 0);
  121.  
  122. -- ram til tid
  123. type ram_array_bcd is array (0 to 2) of std_logic_vector(7 downto 0);
  124. signal bcd_tid : ram_array_bcd;
  125.  
  126. signal ord_teller : integer range 0 to 2;
  127. signal ord_teller_m : integer range 0 to 2;
  128.  
  129.  
  130. -- mottaker
  131. type mottak_state_type is (s_idle_mottak, s_wait_for_sender, s_shift_in, s_offload, s_error);
  132. signal mottak_state : mottak_state_type;
  133.  
  134. -- del 3
  135. -- ram til tid
  136. type mem_array_bcd is array (0 to 2) of std_logic_vector(7 downto 0);
  137. signal mem : mem_array_bcd;
  138.  
  139. begin
  140.  
  141. -- del 3
  142. bcd_tid(0) <= bcd_sec;
  143. bcd_tid(1) <= bcd_min;
  144. bcd_tid(2) <= bcd_hour;
  145.  
  146. LCD_ON <= '1';
  147.  
  148. LCD_Display_inst : component LCD_Display
  149. port map(
  150. reset => resetn,
  151. clk_48Mhz => CLOCK_50,
  152. Hex_Display_Data => LCD_bcd,
  153. LCD_RS => LCD_RS,
  154. LCD_E => LCD_EN,
  155. LCD_RW => LCD_RW,
  156. DATA_BUS => LCD_Data
  157. );
  158.  
  159. enable_gen_inst : component enable_gen
  160. port map(
  161. clock_50 => CLOCK_50,
  162. resetn => resetn,
  163. velg_enable => "000",
  164. enable => hallo_enable
  165. );
  166.  
  167. reset_synkroniserer : reset_synchronizer
  168. port map(
  169. clk => CLOCK_50,
  170. reset_key3 => KEY(3),
  171. reset_clk => resetn
  172. );
  173.  
  174. klokke : component L4_klokke_AG
  175. port map(
  176. CLOCK_50 => CLOCK_50,
  177. resetn => resetn,
  178. KEY => KEY,
  179. SW => SW(13 downto 11),
  180. HEX0 => HEX0,
  181. HEX1 => HEX1,
  182. HEX2 => HEX2,
  183. HEX3 => HEX3,
  184. HEX4 => HEX4,
  185. HEX5 => HEX5,
  186. bcd_hours => bcd_hour,
  187. bcd_minutes => bcd_min,
  188. bcd_seconds => bcd_sec
  189. );
  190.  
  191. p_hallo : process(CLOCK_50) is
  192. begin
  193. if rising_edge(CLOCK_50) then
  194. if resetn = '0' then
  195. hallo <= '0';
  196. elsif hallo_enable = '1' then
  197. hallo <= not hallo;
  198. end if;
  199. end if;
  200. end process p_hallo;
  201.  
  202. LEDR(17) <= hallo;
  203.  
  204. sender <= SW(17);
  205. LEDG(0) <= sender;
  206. LEDG(7) <= mottatt_blink;
  207.  
  208. p_send_motta_hallo : process(CLOCK_50) is
  209. begin
  210. if rising_edge(CLOCK_50) then
  211. if sender = '1' then
  212. GPIO(1) <= hallo;
  213. mottatt_blink <= '0';
  214. else
  215. -- mottar hallo
  216. GPIO(1) <= 'Z';
  217. vippe_a <= GPIO(1);
  218. vippe_b <= vippe_a;
  219. mottatt_blink <= vippe_b;
  220. end if;
  221. end if;
  222. end process p_send_motta_hallo;
  223.  
  224. p_baud_rate_gen : component baudrate_gen
  225. port map(
  226. CLOCK_50 => CLOCK_50,
  227. resetn => resetn,
  228. velg_baudrate => SW(16 downto 14),
  229. start_teller => start_teller,
  230. baud_enable_m => baud_enable_m,
  231. baud_enable_s => baud_enable_s
  232. );
  233.  
  234. data_inn <= GPIO(7) when sender = '0' else '1';
  235. GPIO(7) <= data_ut when sender = '1' else 'Z';
  236.  
  237. p_start_teller : process(CLOCK_50) is
  238. begin
  239. if rising_edge(CLOCK_50) then
  240. if resetn = '0' then
  241. start_teller <= '0';
  242. data_inn_q <= '0';
  243. data_inn_qq <= '0';
  244. data_inn_qqq <= '0';
  245.  
  246. else
  247. start_teller <= '0';
  248. data_inn_q <= data_inn;
  249. data_inn_qq <= data_inn_q;
  250. data_inn_qqq <= data_inn_qq;
  251. if data_inn_qqq = '1' and data_inn_qq = '0' then
  252. -- fallende flanke
  253. if mottak_state = s_wait_for_sender then
  254. start_teller <= '1';
  255. end if;
  256. end if;
  257. end if;
  258. end if;
  259. end process p_start_teller;
  260.  
  261. start_sender <= KEY(0);
  262.  
  263. p_synk_start_sender : process(CLOCK_50) is
  264. begin
  265. if rising_edge(CLOCK_50) then
  266. if resetn = '0' then
  267. start_q <= '0';
  268. start_qq <= '0';
  269. else
  270. start_q <= not start_sender; -- lager aktiv hΓΈy puls
  271. start_qq <= start_q;
  272. end if;
  273. end if;
  274. end process p_synk_start_sender;
  275.  
  276. p_bcd : process(CLOCK_50) is
  277. begin
  278. if rising_edge(CLOCK_50) then
  279. if sender = '1' then
  280. LCD_bcd <= bcd_tid(2) & bcd_tid(1) & bcd_tid(0);
  281. else
  282. LCD_bcd <= mem(2) & mem(1) & mem(0);
  283. end if;
  284. end if;
  285. end process;
  286.  
  287.  
  288. p_sender_tilstandsmaskin : process(CLOCK_50) is
  289. begin
  290. if rising_edge(CLOCK_50) then
  291. if resetn = '0' then
  292. sender_state <= s_idle;
  293. data_ut <= '1';
  294. else
  295. if sender = '1' then
  296. case sender_state is
  297. when s_idle =>
  298. data_ut <= '1';
  299. --bcd <= bcd_tid(2) & bcd_tid(1) & bcd_tid(0);
  300. send_shift_register <= (others => '0');
  301. if start_qq = '1' then
  302. sender_state <= s_transmit;
  303. end if;
  304. when s_transmit =>
  305. data_ut <= '1';
  306. --send_shift_register <= STOPP_BIT & SW(8 downto 1) & START_BIT;
  307. case ord_teller is
  308. when 0 =>
  309. send_shift_register <= STOPP_BIT & bcd_sec & START_BIT;
  310. when 1 =>
  311. send_shift_register <= STOPP_BIT & bcd_min & START_BIT;
  312. when 2 =>
  313. send_shift_register <= STOPP_BIT & bcd_hour & START_BIT;
  314. when others =>
  315. send_shift_register <= (others => '0');
  316. end case;
  317. if baud_enable_s = '1' then
  318. sender_state <= s_shift_out;
  319. end if;
  320. when s_shift_out =>
  321. if baud_enable_s = '1' then
  322. if send_shift_register = "0000000000" then
  323. sender_state <= s_finish;
  324. data_ut <= '1';
  325. else
  326. data_ut <= send_shift_register(0);
  327. send_shift_register <= '0' & send_shift_register(9 downto 1);
  328. end if;
  329. end if;
  330. when s_finish =>
  331. if (ord_teller = 2) then
  332. ord_teller <= 0;
  333. else
  334. ord_teller <= ord_teller + 1;
  335. end if;
  336. data_ut <= '1';
  337. if baud_enable_s = '1' then
  338. sender_state <= s_wait;
  339. end if;
  340. when s_wait =>
  341. data_ut <= '1';
  342. if baud_enable_s = '1' then
  343. sender_state <= s_transmit;
  344. end if;
  345. end case;
  346. else
  347. data_ut <= '1';
  348. end if;
  349. end if;
  350. end if;
  351. end process p_sender_tilstandsmaskin;
  352.  
  353. p_mottak_tilstandsmaskin : process(CLOCK_50) is
  354. begin
  355. if rising_edge(CLOCK_50) then
  356. if resetn = '0' then
  357. mottak_state <= s_idle_mottak;
  358. mottatt_data <= "00000000";
  359. else
  360. if sender = '0' then
  361. case mottak_state is
  362. when s_idle_mottak =>
  363. error <= '0';
  364. --bcd <= mem(2) & mem(1) & mem(0);
  365. mottak_shift_reg <= "10000000000";
  366. if data_inn_qq = '1' then
  367. mottak_state <= s_wait_for_sender;
  368. end if;
  369. when s_wait_for_sender =>
  370. if start_teller = '1' then
  371. mottak_state <= s_shift_in;
  372. end if;
  373. when s_shift_in =>
  374. if mottak_shift_reg(0) = '1' and mottak_shift_reg(10) = '0' then --Dette skal aldri skje
  375. mottak_state <= s_error;
  376. elsif mottak_shift_reg(0) = '1' and mottak_shift_reg(10) = '1' then --Mottat alle databit
  377. mottak_state <= s_offload;
  378. elsif baud_enable_m = '1' then
  379. mottak_shift_reg <= data_inn_qq & mottak_shift_reg(10 downto 1);
  380. end if;
  381. when s_offload =>
  382. --mottatt_data <= mottak_shift_reg(9 downto 2);
  383. mem(ord_teller_m) <= mottak_shift_reg(9 downto 2);
  384. if (ord_teller_m = 2) then
  385. ord_teller_m <= 0;
  386. else
  387. ord_teller_m <= ord_teller_m + 1;
  388. end if;
  389. mottak_state <= s_idle_mottak;
  390. when s_error =>
  391. error <= '1';
  392. end case;
  393. end if;
  394. end if;
  395. end if;
  396. end process p_mottak_tilstandsmaskin;
  397.  
  398. LEDR(16) <= error;
  399. LEDR(8 downto 1) <= mottatt_data;
  400.  
  401. end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement