Pinkel

CONTROL

Jun 6th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.66 KB | None | 0 0
  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.numeric_std.ALL;
  4. ENTITY control IS
  5. PORT (
  6. clk : IN std_logic;
  7. IR : IN signed(15 DOWNTO 0);
  8. reset, C, Z, S, INT : IN std_logic;
  9. Salu, Sbb, Sbc, Sba : OUT bit_vector(3 DOWNTO 0);
  10. Sid : OUT bit_vector(2 DOWNTO 0);
  11. Sa : OUT bit_vector(1 DOWNTO 0);
  12. LDF, Smar, Smbr, WR, RD, INTA, MIO : OUT BIT
  13. );
  14. END ENTITY;
  15. ARCHITECTURE rtl OF control IS
  16. TYPE state_type IS (fetch, dec, wait_1, call_1, call_2, call_3, call_4,
  17. RET_1, RET_2, RET_3, push, pop_1, pop_2, neg, inc, dec_1, not_1, shr, shl,
  18. m29, mov_r, mov_rm, add, sub, and_1, or_1, xor_1, in_r, out_io, jump_1, jump_2,
  19. long_jump, r_st16, r_adr32, m9,
  20. mov_arg1_arg2, add_arg1_arg2, sub_arg1_arg2, gethx_arg1_arg2,getlx_arg1_arg2,
  21. shl_arg1_arg2, shr_arg1_arg2, jmp_etykieta);
  22. SIGNAL state : state_type;
  23. BEGIN
  24. PROCESS (clk, reset)
  25. BEGIN
  26. IF reset = '1' THEN
  27. state <= fetch;
  28. ELSIF (clk'EVENT AND clk = '1') THEN
  29. CASE state IS
  30. WHEN fetch =>
  31. state <= dec;
  32. WHEN dec =>
  33. CASE IR(15 DOWNTO 13) IS
  34. WHEN "000" =>
  35. CASE IR(12 DOWNTO 11) IS
  36. WHEN "00" =>
  37. IF (INT = '0') THEN
  38. state <= fetch;
  39. ELSE
  40. state <= m9;
  41. END IF;
  42. WHEN "01" => state <= wait_1;
  43. WHEN "10" => state <= call_1;
  44. WHEN "11" => state <= RET_1;
  45. WHEN others => state <= fetch;
  46. END CASE;
  47. WHEN "001" =>
  48. CASE IR(12 DOWNTO 8) IS
  49. WHEN "00000" => state <= push;
  50. WHEN "00001" => state <= pop_1;
  51. WHEN "00010" => state <= neg;
  52. WHEN "00011" => state <= inc;
  53. WHEN "00100" => state <= dec_1;
  54. WHEN "00101" => state <= not_1;
  55. WHEN "00110" => state <= shr;
  56. WHEN "00111" => state <= shl;
  57. WHEN "01000" => state <= m29;
  58. WHEN "01001" => state <= mov_r;
  59. WHEN "01010" => state <= mov_rm;
  60. WHEN "01011" => state <= add;
  61. WHEN "01100" => state <= sub;
  62. WHEN "01101" => state <= and_1;
  63. WHEN "01110" => state <= or_1;
  64. WHEN "01111" => state <= xor_1;
  65. WHEN "10000" => state <= in_r;
  66. WHEN "10001" => state <= out_io;
  67. WHEN OTHERS => state <= fetch;
  68. END CASE;
  69. WHEN "010" => state <= jump_1;
  70. WHEN "011" => state <= jump_2;
  71.  
  72. WHEN "100" =>
  73. case IR(12 downto 8) is
  74. when "000000" => state <= mov_arg1_arg2;
  75. when "000001" => state <= add_arg1_arg2;
  76. when "000010" => state <= sub_arg1_arg2;
  77. when "000011" => state <= gethx_arg1_arg2;
  78. when "000100" => state <= getlx_arg1_arg2;
  79. when "000101" => state <= shl_arg1_arg2;
  80. when "000110" => state <= shr_arg1_arg2;
  81. when "000111" => state <= jmp_etykieta;
  82. WHEN OTHERS => state <= fetch;
  83. END CASE;
  84. when "101" => state <= r_adr32;
  85. when others => state <= fetch;
  86. end case;
  87.  
  88. WHEN wait_1 =>
  89. IF INT = '1' THEN
  90. state <= m9;
  91. ELSE state <= wait_1;
  92. END IF;
  93. WHEN call_1 => state <= call_2;
  94. WHEN call_2 => state <= call_3;
  95. WHEN call_3 => state <= call_4;
  96. WHEN call_4 =>
  97. IF INT = '1' THEN
  98. state <= m9;
  99. ELSE state <= fetch;
  100. END IF;
  101. when others => state <= fetch;
  102. END CASE;
  103. END IF;
  104. END PROCESS;
  105.  
  106. PROCESS (state) BEGIN
  107. CASE state IS
  108. WHEN fetch =>
  109. Sa <= "01"; Sbb <= "0000"; Sba <= "0000"; Sid <= "001"; Sbc <= "0000";
  110. MIO <= '1'; Smar <= '1'; Smbr <= '0'; WR <= '0'; RD <= '1'; Salu <="0000"; LDF <= '0'; INTA <= '0';
  111. WHEN dec =>
  112. Sa <= "00"; Sbb <= "0000"; Sba <= "0000"; Sid <= "000"; Sbc <= "0000";
  113. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '0'; RD <= '0'; Salu <="0000"; LDF <= '0'; INTA <= '0';
  114. WHEN wait_1 =>
  115. Sa <= "00"; Sbb <= "0000"; Sba <= "0000"; Sid <= "000"; Sbc <= "0000";
  116. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '0'; RD <= '0'; Salu <="0000"; LDF <= '0'; INTA <= '0';
  117. WHEN call_1 =>
  118. Sa <= "10"; Sbb <= "1010"; Sba <= "0000"; Sid <= "011"; Sbc <= "0000";
  119. MIO <= '1'; Smar <= '1'; Smbr <= '1'; WR <= '1'; RD <= '0'; Salu <="0000"; LDF <= '0'; INTA <= '0';
  120.  
  121. WHEN mov_arg1_arg2 =>
  122. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  123. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  124. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0000"; LDF <= '1'; INTA <= '0';
  125.  
  126. WHEN add_arg1_arg2 =>
  127. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  128. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  129. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0001"; LDF <= '1'; INTA <= '0';
  130.  
  131. WHEN sub_arg1_arg2 =>
  132. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  133. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  134. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0010"; LDF <= '1'; INTA <= '0';
  135.  
  136.  
  137.  
  138. WHEN gethx_arg1_arg2 =>
  139. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  140. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  141. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0011"; LDF <= '1'; INTA <= '0';
  142.  
  143. WHEN getlx_arg1_arg2 =>
  144. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  145. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  146. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0100"; LDF <= '1'; INTA <= '0';
  147.  
  148. WHEN shl_arg1_arg2 =>
  149. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  150. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  151. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0101"; LDF <= '1'; INTA <= '0';
  152.  
  153. WHEN shr_arg1_arg2 =>
  154. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  155. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  156. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0110"; LDF <= '1'; INTA <= '0';
  157.  
  158. WHEN jmp_etykieta =>
  159. Sa <= "01"; Sbb <=to_bitvector(std_logic_vector(IR(7 downto 4))); Sba <= "0001"; Sid <= "001";
  160. Sbc <= to_bitvector(std_logic_vector(IR(3 downto 0)));
  161. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '1'; RD <= '0'; Salu <="0111"; LDF <= '1'; INTA <= '0';
  162.  
  163.  
  164.  
  165.  
  166.  
  167. WHEN OTHERS =>
  168. Sa <= "00"; Sbb <= "0000"; Sba <= "0000"; Sid <= "000"; Sbc <= "0000";
  169. MIO <= '1'; Smar <= '0'; Smbr <= '0'; WR <= '0'; RD <= '0'; Salu <="0000"; LDF <= '0'; INTA <= '0';
  170. END CASE;
  171. END PROCESS;
  172. END rtl;
Add Comment
Please, Sign In to add comment