Advertisement
Pinkel

Untitled

Apr 8th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.69 KB | None | 0 0
  1. LIBRARY IEEE;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity Rejestr is
  6. Port(clk: in std_logic;
  7. reset: in std_logic;
  8. DI: in signed (15 downto 0);
  9. BA: in signed (15 downto 0);
  10. Sbb: in signed (3 downto 0);
  11. Sbc: in signed (3 downto 0);
  12. Sba: in signed (3 downto 0);
  13. Sid: in signed (2 downto 0);
  14. Sa: in signed (2 downto 0);
  15. BB: out signed (15 downto 0);
  16. BC: out signed (15 downto 0);
  17. ADR: out signed (31 downto 0);
  18. IRout: out signed (15 downto 0)
  19. );
  20.  
  21. end entity;
  22.  
  23.  
  24. architecture behv of Rejestr is
  25. component ALU is
  26. port( A1 : in std_logic_vector (15 downto 0);
  27. B1 : in std_logic_vector (15 downto 0);
  28. Salu: in std_logic_vector (3 downto 0);
  29. Y : out std_logic_vector (15 downto 0);
  30. P : out std_logic;
  31. C1 : out std_logic;
  32. Z : out std_logic;
  33. S : out std_logic;
  34.  
  35. BBA : out std_logic_vector (15 downto 0);
  36. SSS : out std_logic_vector (15 downto 0)
  37. );
  38. end component;
  39. signal TMPBA: std_logic_vector (15 downto 0);
  40. signal TMPBB: std_logic_vector (15 downto 0);
  41. signal TMPBC: std_logic_vector (15 downto 0);
  42.  
  43. BEGIN
  44. TMPBB <= BB;
  45. TMPBC <= BC;
  46.  
  47.  
  48.  
  49. begin
  50. process (A1, B1, Salu)
  51. variable temp, AA, BB, CC : std_logic_vector (16 downto 0);
  52. variable CF, ZF, SF, PF, NF: out std_logic;
  53.  
  54. begin
  55. A1 := TMPBB;
  56. B1 := TMPBC;
  57. AA(16) := A1(15);
  58. AA(15 downto 0) := A1;
  59. BB(16) := B1(15);
  60. BB(15 downto 0) := B1;
  61. CC(0) := CF;
  62. CC(16 downto 1) := "000000000000000";
  63.  
  64. case Salu is
  65. when "0000" => temp := AA;
  66. when "0001" => temp := BB;
  67. when "0010" => temp := AA + BB;
  68. when "0011" => temp := AA - BB;
  69. when "0100" => temp := AA xnor BB;
  70. when "0101" => temp := AA + 1;
  71. when "0110" => temp := BB + 1;
  72. when "0111" => temp := not AA;
  73. when "1000" => temp := not BB;
  74. when "1001" => temp := AA and BB;
  75. when "1010" => temp := AA or BB;
  76. when "1011" => temp := AA xor BB;
  77. when "1100" => temp := AA + BB + CC;
  78. when "1101" => temp := AA - BB - CC;
  79. when "1110" => temp(16) := AA(16);
  80. temp(15 downto 0) := AA(15 downto 0);
  81. when "1111" => temp(0) := '0' ;
  82. temp(16 downto 1) := AA(16 downto 1);
  83. when others => temp:= null;
  84. end case;
  85.  
  86. test_par(temp(15 downto 0), PF, NF);
  87.  
  88. if(temp = "0000000000000000") then
  89. ZF := '1';
  90. else
  91. ZF := '0';
  92. end if;
  93.  
  94. if(temp(15) = '1') then
  95. SF := '1';
  96. else
  97. SF := '0';
  98. end if;
  99.  
  100. CF := temp(16) xor temp(15);
  101.  
  102. Y <= temp(15 downto 0);
  103. Z <= ZF;
  104. S <= SF;
  105. C1 <= CF;
  106. P <= PF;
  107. tmpToHex <= tmp;
  108.  
  109.  
  110. begin
  111. mapp = port map (TMPBA <= Y);
  112. end process;
  113.  
  114.  
  115. BA := TMPBA;
  116.  
  117.  
  118. begin
  119. process(clk,Sbb,Sbc, Sba, Sa,DI)
  120. variable AP: signed (31 downto 0);
  121. variable IR, TMP, A, B, C, D, E, F: signed (15 downto 0);
  122. variable PC, SP, AD, ATMP: signed (31 downto 0);
  123. begin
  124. if(clk = '1') then
  125. if(reset = '1') then
  126. IR := "0000000000000001";
  127. TMP := "0000000000000010";
  128. A := "0000000000000011";
  129. B := "0000000000000100";
  130. C := "0000000000000101";
  131. D := "0000000000000110";
  132. E := "0000000000000111";
  133. F := "0000000000001000";
  134. AD := "00000000000000000000000000001001";
  135. PC := "00000000000000000000000000001010";
  136. SP := "00000000000000000000000000001011" ;
  137. ATMP := "00000000000000000000000000001100" ;
  138. end if;
  139.  
  140. case Sid is
  141. when "001" => PC := PC+1;
  142. when "010" => SP := SP+1;
  143. when "011" => SP := SP-1;
  144. when "100" => AD := AD+1;
  145. when "101" => AD := AD-1;
  146. when others => NULL;
  147. end case;
  148. end if;
  149. case Sba is
  150. when "0000" => IR := BA;
  151. when "0001" => TMP := BA;
  152. when "0010" => A := BA;
  153. when "0011" => B := BA;
  154. when "0100" => C := BA;
  155. when "0101" => D := BA;
  156. when "0110" => E := BA;
  157. when "0111" => F := BA;
  158. when "1000" => AD(15 downto 0) := BA;
  159. when "1001" => AD(31 downto 16) := BA;
  160. when "1010" => PC(15 downto 0) := BA;
  161. when "1011" => PC(31 downto 16) := BA;
  162. when "1100" => SP(15 downto 0) := BA;
  163. when "1101" => SP(31 downto 16) := BA;
  164. when "1110" => ATMP(15 downto 0) := BA;
  165. when "1111" => ATMP(31 downto 16) := BA;
  166. end case;
  167.  
  168. case Sbb is
  169. when "0000" => BB <= DI;
  170. when "0001" => BB <= TMP;
  171. when "0010" => BB <= A;
  172. when "0011" => BB <= B;
  173. when "0100" => BB <= C;
  174. when "0101" => BB <= D;
  175. when "0110" => BB <= E;
  176. when "0111" => BB <= F;
  177. when "1000" => BB <= AD(15 downto 0);
  178. when "1001" => BB <= AD(31 downto 16);
  179. when "1010" => BB <= PC(15 downto 0);
  180. when "1011" => BB <= PC(31 downto 16);
  181. when "1100" => BB <= SP(15 downto 0);
  182. when "1101" => BB <= SP(31 downto 16);
  183. when "1110" => BB <= ATMP(15 downto 0);
  184. when "1111" => BB <= ATMP(31 downto 16);
  185. when others => NULL;
  186. end case;
  187.  
  188. case Sbc is
  189. when "0000" => BC <= DI;
  190. when "0001" => BC <= TMP;
  191. when "0010" => BC <= A;
  192. when "0011" => BC <= B;
  193. when "0100" => BC <= C;
  194. when "0101" => BC <= D;
  195. when "0110" => BC <= E;
  196. when "0111" => BC <= F;
  197. when "1000" => BC <= AD(15 downto 0);
  198. when "1001" => BC <= AD(31 downto 16);
  199. when "1010" => BC <= PC(15 downto 0);
  200. when "1011" => BC <= PC(31 downto 16);
  201. when "1100" => BC <= SP(15 downto 0);
  202. when "1101" => BC <= SP(31 downto 16);
  203. when "1110" => BC <= ATMP(15 downto 0);
  204. when "1111" => BC <= ATMP(31 downto 16);
  205. when others => NULL;
  206. end case;
  207.  
  208. case Sa is
  209. when "000" => ADR<= AD;
  210. when "001" => ADR<= PC;
  211. when "010" => ADR<= SP;
  212. when "011" => ADR<= ATMP;
  213. when others => NULL;
  214. end case;
  215. IR := PC (15 downto 0);
  216. IRout <= IR;
  217. end process;
  218. end behv;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement