Advertisement
Guest User

Untitled

a guest
Dec 11th, 2020
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.84 KB | None | 0 0
  1. library ieee;
  2. library altera_mf;
  3. use ieee.std_logic_1164.all;
  4. use ieee.std_logic_unsigned.all;
  5. use altera_mf.altera_mf_components.all;
  6. entity Pipeline is
  7. port(
  8. clock : in std_logic;
  9. reset : in std_logic;
  10. IO_DATA : out std_logic_vector(31 downto 0);
  11. IO_WRITE : out std_logic;
  12. dbg_fbufopcode : out std_logic_vector(31 downto 0);
  13. dbg_dbufopcode : out std_logic_vector(6 downto 0);
  14. dbg_ebufopcode : out std_logic_vector(6 downto 0);
  15. dbg_mbufopcode : out std_logic_vector(6 downto 0)
  16. );
  17. end Pipeline;
  18.  
  19. architecture a of Pipeline is
  20.  
  21. begin
  22. IO_DATA <= exresult;
  23.  
  24. dbg_fbufopcode <= fbufinstruction;
  25. dbg_dbufopcode <= dbufopcode;
  26. dbg_ebufopcode <= ebufopcode;
  27. dbg_mbufopcode <= mbufopcode;
  28.  
  29. fetch : entity work.InstructionFetch
  30. PORT MAP (
  31. clock,
  32. reset,
  33. exresult,
  34. branchmux,
  35. fetchPC,
  36. fetchinstruction
  37. );
  38.  
  39. fetchbuffer : entity work.FBUF
  40. PORT MAP (
  41. clock,
  42. reset,
  43. fetchPC,
  44. fetchinstruction,
  45. fbufPC,
  46. fbufinstruction
  47. );
  48.  
  49. decode : entity work.InstructionDecode
  50. PORT MAP (
  51. fbufinstruction,
  52. decodeopcode,
  53. decoderd,
  54. decoders1,
  55. decoders2,
  56. decodeimm,
  57. decodefunct3,
  58. decodefunct7
  59. );
  60.  
  61. dbuf : entity work.DBUF
  62. PORT MAP (
  63. clock,
  64. reset,
  65. fbufPC,
  66. decodeopcode,
  67. decoderd,
  68. decodereadrs1,
  69. decodereadrs2,
  70. decodeimm,
  71. decodefunct3,
  72. decodefunct7,
  73. dbufPC,
  74. dbufopcode,
  75. dbufrd,
  76. dbufreadrs1,
  77. dbufreadrs2,
  78. dbufimm,
  79. dbuffunct3,
  80. dbuffunct7
  81. );
  82.  
  83. ex : entity work.Execute
  84. PORT MAP (
  85. dbufPC,
  86. dbufopcode,
  87. dbufrd,
  88. dbufreadrs1,
  89. dbufreadrs2,
  90. dbufimm,
  91. dbuffunct3,
  92. dbuffunct7,
  93. branchmux,
  94. exresult,
  95. IO_WRITE
  96. );
  97.  
  98. ebuf : entity work.EBUF
  99. PORT MAP (
  100. clock,
  101. reset,
  102. dbufopcode,
  103. dbufrd,
  104. dbufreadrs1,
  105. dbufreadrs2,
  106. dbufimm,
  107. dbuffunct3,
  108. dbuffunct7,
  109. exresult,
  110. ebufopcode,
  111. ebufrd,
  112. ebufreadrs1,
  113. ebufreadrs2,
  114. ebufimm,
  115. ebufresult,
  116. ebuffunct3,
  117. ebuffunct7
  118. );
  119.  
  120. mem : entity work.Memory
  121. PORT MAP (
  122. clock,
  123. reset,
  124. ebufopcode,
  125. ebuffunct3,
  126. ebufreadrs2,
  127. ebufresult,
  128. memresult
  129. );
  130.  
  131. mbuf : entity work.MBUF
  132. PORT MAP (
  133. clock,
  134. reset,
  135. ebufopcode,
  136. ebufrd,
  137. memresult,
  138. mbufopcode,
  139. mbufrd,
  140. mbufresult
  141. );
  142.  
  143. wb : entity work.Writeback
  144. PORT MAP (
  145. mbufopcode,
  146. mbufrd,
  147. mbufresult,
  148. wren,
  149. wrdata,
  150. wraddress
  151. );
  152.  
  153. regfile : entity work.DPRF
  154. PORT MAP (
  155. clock,
  156. reset,
  157. wren,
  158. decoders1,
  159. decoders2,
  160. wraddress,
  161. wrdata,
  162. decodereadrs1,
  163. decodereadrs2
  164. );
  165.  
  166. end a;
  167. -------------------------------------------------------------------------------------
  168. library ieee;
  169. library altera_mf;
  170. use ieee.std_logic_1164.all;
  171. use ieee.std_logic_unsigned.all;
  172. use altera_mf.altera_mf_components.all;
  173. entity InstructionFetch is
  174. port(
  175. clock : in std_logic;
  176. reset : in std_logic;
  177. branch : in std_logic_vector(31 downto 0);
  178. branch_mux : in std_logic;
  179. PC : out std_logic_vector(31 downto 0);
  180. instruction : out std_logic_vector(31 downto 0)
  181. );
  182. end InstructionFetch;
  183.  
  184. architecture a of InstructionFetch is
  185.  
  186. signal program_counter : std_logic_vector(31 downto 0);
  187. signal data : std_logic_vector(31 downto 0);
  188. signal wren : std_logic;
  189. begin
  190.  
  191. altsyncram_component : altsyncram
  192. GENERIC MAP (
  193. clock_enable_input_a => "BYPASS",
  194. clock_enable_output_a => "BYPASS",
  195. init_file => "program.mif",
  196. intended_device_family => "MAX 10",
  197. lpm_hint => "ENABLE_RUNTIME_MOD=NO",
  198. lpm_type => "altsyncram",
  199. numwords_a => 1024,
  200. operation_mode => "SINGLE_PORT",
  201. outdata_aclr_a => "CLEAR0",
  202. outdata_reg_a => "UNREGISTERED",
  203. power_up_uninitialized => "FALSE",
  204. read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ",
  205. widthad_a => 10,
  206. width_a => 32,
  207. width_byteena_a => 1
  208. )
  209. PORT MAP (
  210. aclr0 => reset,
  211. address_a => program_counter(9 downto 0),
  212. clock0 => clock,
  213. data_a => data,
  214. wren_a => wren,
  215. q_a => instruction
  216. );
  217. end a;
  218. -------------------------------------------------------------------------------------
  219. library ieee;
  220. use ieee.std_logic_1164.all;
  221. use ieee.std_logic_unsigned.all;
  222. entity FBUF is
  223. port(
  224. clock : in std_logic;
  225. reset : in std_logic;
  226. instructionin : in std_logic_vector(31 downto 0);
  227. instructionout : out std_logic_vector(31 downto 0)
  228. );
  229. end FBUF;
  230.  
  231. architecture a of FBUF is
  232.  
  233. signal instruction : std_logic_vector(31 downto 0);
  234. begin
  235.  
  236.  
  237. instructionout <= instruction;
  238.  
  239. process (clock, reset)
  240. begin
  241. if (rising_edge(clock)) then
  242. if (reset = '1') then
  243. instruction <= (others => '0');
  244. else
  245. instruction <= std_logic_vector(instructionin);
  246. end if;
  247. end if;
  248. end process;
  249. end a;
  250. -------------------------------------------------------------------------------------
  251. library ieee;
  252. use ieee.std_logic_1164.all;
  253. use ieee.std_logic_unsigned.all;
  254. entity InstructionDecode is
  255. port(
  256. instruction : in std_logic_vector(31 downto 0);
  257. opcode : out std_logic_vector(6 downto 0);
  258. );
  259. end InstructionDecode;
  260.  
  261. architecture a of InstructionDecode is
  262.  
  263. begin
  264.  
  265. opcode <= instruction(6 downto 0);
  266.  
  267. end a;
  268. library ieee;
  269. use ieee.std_logic_1164.all;
  270. use ieee.std_logic_unsigned.all;
  271. entity DBUF is
  272. port(
  273. clock : in std_logic;
  274. reset : in std_logic;
  275. opcodein : in std_logic_vector(6 downto 0);
  276. opcodeout : out std_logic_vector(6 downto 0);
  277. );
  278. end DBUF;
  279.  
  280. architecture a of DBUF is
  281.  
  282. signal opcode : std_logic_vector(6 downto 0);
  283.  
  284. begin
  285.  
  286. opcodeout <= opcode;
  287.  
  288. process (clock, reset)
  289. begin
  290.  
  291.  
  292. if (rising_edge(clock)) then
  293. if (reset = '1') then
  294. opcode <= (others => '0');
  295. else
  296. opcode <= opcodein;
  297. end if;
  298. end if;
  299. end process;
  300.  
  301. end a;
  302. library ieee;
  303. use ieee.std_logic_1164.all;
  304. use ieee.std_logic_unsigned.all;
  305. use ieee.numeric_std.all;
  306. entity Execute is
  307. port(
  308. PC : in std_logic_vector(31 downto 0);
  309. opcode : in std_logic_vector(6 downto 0);
  310. rd : in std_logic_vector(4 downto 0);
  311. readrs1,
  312. readrs2 : in std_logic_vector(31 downto 0);
  313.  
  314. imm : in std_logic_vector(31 downto 0);
  315. funct3 : in std_logic_vector(2 downto 0);
  316. funct7 : in std_logic_vector(6 downto 0);
  317. branchmux : out std_logic;
  318. result : out std_logic_vector(31 downto 0);
  319. IO_WRITE : out std_logic
  320. );
  321. end Execute;
  322.  
  323. architecture a of Execute is
  324. signal exresulti : std_logic_vector(31 downto 0);
  325. signal exresultr : std_logic_vector(31 downto 0);
  326. signal subimm : std_logic_vector(31 downto 0);
  327. signal comparisonimm : std_logic;
  328. signal subreg : std_logic_vector(31 downto 0);
  329. signal comparisonreg : std_logic;
  330. begin
  331. branchmux <= '1' when opcode = "1101111" or opcode = "1100111" or opcode = "1100011" else '0';
  332. IO_WRITE <= '1' when opcode = "0000001" else '0';
  333. with opcode select
  334. result <= imm when "0110111",
  335. imm + PC when "0010111",
  336. imm + PC when "1101111",
  337. readrs1 + imm when "1100111",
  338. readrs2 - readrs1 when "1100011",
  339. readrs1 + imm when "0000011",
  340. readrs1 + imm when "0100011",
  341.  
  342. exresulti when "0010011",
  343. exresultr when "0110011",
  344. readrs1 when "0000001",
  345. (others => '0') when others;
  346.  
  347. end a;
  348. library ieee;
  349. use ieee.std_logic_1164.all;
  350. use ieee.std_logic_unsigned.all;
  351. entity EBUF is
  352. port(
  353. clock : in std_logic;
  354. reset : in std_logic;
  355. opcodein : in std_logic_vector(6 downto 0);
  356. rdin : in std_logic_vector(4 downto 0);
  357. readrs1in : in std_logic_vector(31 downto 0);
  358. readrs2in : in std_logic_vector(31 downto 0);
  359. immin : in std_logic_vector(31 downto 0);
  360.  
  361. funct3in : in std_logic_vector(2 downto 0);
  362. funct7in : in std_logic_vector(6 downto 0);
  363. exresultin : in std_logic_vector(31 downto 0);
  364. opcodeout : out std_logic_vector(6 downto 0);
  365. rdout : out std_logic_vector(4 downto 0);
  366. readrs1out : out std_logic_vector(31 downto 0);
  367. readrs2out : out std_logic_vector(31 downto 0);
  368. immout : out std_logic_vector(31 downto 0);
  369. exresultout : out std_logic_vector(31 downto 0);
  370. funct3out : out std_logic_vector(2 downto 0);
  371. funct7out : out std_logic_vector(6 downto 0)
  372. );
  373. end EBUF;
  374.  
  375. architecture a of EBUF is
  376.  
  377. signal PC : std_logic_vector(31 downto 0);
  378. signal opcode : std_logic_vector(6 downto 0) := "0000000";
  379. signal rd : std_logic_vector(4 downto 0);
  380. signal readrs1 : std_logic_vector(31 downto 0);
  381. signal readrs2 : std_logic_vector(31 downto 0);
  382. signal imm : std_logic_vector(31 downto 0);
  383. signal exresult : std_logic_vector(31 downto 0);
  384. signal funct3 : std_logic_vector(2 downto 0);
  385. signal funct7 : std_logic_vector(6 downto 0);
  386.  
  387. begin
  388.  
  389. opcodeout <= opcode;
  390.  
  391. process (clock, reset)
  392. begin
  393.  
  394.  
  395. if (rising_edge(clock)) then
  396. if (reset = '1') then
  397. opcode <= (others => '0');
  398. else
  399. opcode <= opcodein;
  400. end if;
  401. end if;
  402. end process;
  403.  
  404. end a;
  405. library ieee;
  406. library altera_mf;
  407. use ieee.std_logic_1164.all;
  408. use ieee.std_logic_unsigned.all;
  409. use altera_mf.altera_mf_components.all;
  410. entity Memory is
  411. port(
  412. clock : in std_logic;
  413. reset : in std_logic;
  414. opcode : in std_logic_vector(6 downto 0);
  415. funct3 : in std_logic_vector(2 downto 0);
  416. readrs2 : in std_logic_vector(31 downto 0);
  417. ex_result : in std_logic_vector(31 downto 0);
  418. mem_result : out std_logic_vector(31 downto 0)
  419. );
  420. end Memory;
  421.  
  422. architecture a of Memory is
  423.  
  424. signal read_data : std_logic_vector(31 downto 0);
  425. signal mem_out : std_logic_vector(31 downto 0);
  426. signal byteena : std_logic_vector(3 downto 0);
  427. signal wren : std_logic;
  428. begin
  429.  
  430.  
  431. altsyncram_component : altsyncram
  432. GENERIC MAP (
  433. byte_size => 8,
  434. clock_enable_input_a => "BYPASS",
  435. clock_enable_output_a => "BYPASS",
  436. init_file => "memory.mif",
  437. intended_device_family => "MAX 10",
  438. lpm_hint => "ENABLE_RUNTIME_MOD=NO",
  439. lpm_type => "altsyncram",
  440. numwords_a => 1024,
  441. operation_mode => "SINGLE_PORT",
  442. outdata_aclr_a => "CLEAR0",
  443. outdata_reg_a => "UNREGISTERED",
  444. power_up_uninitialized => "FALSE",
  445. read_during_write_mode_port_a => "OLD_DATA",
  446. widthad_a => 10,
  447. width_a => 32,
  448. width_byteena_a => 4
  449. )
  450. PORT MAP (
  451. aclr0 => reset,
  452. address_a => ex_result(9 downto 0),
  453. byteena_a => byteena,
  454. clock0 => clock,
  455. data_a => readrs2,
  456. wren_a => wren,
  457. q_a => read_data
  458. );
  459. wren <= '1' when opcode = "0100011" else '0';
  460.  
  461. mem_result <= mem_out when opcode = "0000011" else
  462. ex_result;
  463. end a;
  464. library ieee;
  465. use ieee.std_logic_1164.all;
  466. use ieee.std_logic_unsigned.all;
  467. entity MBUF is
  468. port(
  469. clock : in std_logic;
  470. reset : in std_logic;
  471. opcodein : in std_logic_vector(6 downto 0);
  472. rdin : in std_logic_vector(4 downto 0);
  473. memresultin : in std_logic_vector(31 downto 0);
  474. opcodeout : out std_logic_vector(6 downto 0);
  475. rdout : out std_logic_vector(4 downto 0);
  476. memresultout : out std_logic_vector(31 downto 0)
  477. );
  478. end MBUF;
  479.  
  480. architecture a of MBUF is
  481.  
  482. signal opcode : std_logic_vector(6 downto 0);
  483. signal rd : std_logic_vector(4 downto 0);
  484. signal memresult : std_logic_vector(31 downto 0);
  485.  
  486. begin
  487.  
  488. opcodeout <= opcode;
  489.  
  490. process (clock, reset)
  491. begin
  492. if (rising_edge(clock)) then
  493. if (reset = '1') then
  494. opcode <= (others => '0');
  495. else
  496. opcode <= opcodein;
  497. end if;
  498. end if;
  499. end process;
  500.  
  501. end a;
  502. library ieee;
  503. use ieee.std_logic_1164.all;
  504. use ieee.std_logic_unsigned.all;
  505. entity Writeback is
  506. port(
  507. opcode : in std_logic_vector(6 downto 0);
  508. wren : out std_logic;
  509. wrdata : out std_logic_vector(31 downto 0);
  510. wraddress : out std_logic_vector(4 downto 0)
  511. );
  512. end Writeback;
  513.  
  514. architecture a of Writeback is
  515.  
  516. begin
  517.  
  518. wrdata <= mem_result;
  519. wraddress <= rd;
  520. wren <= '1' when opcode = "0110111" or
  521. opcode = "0010111" or
  522. opcode = "1101111" or
  523. opcode = "1100111" or
  524. opcode = "0000011" or
  525. opcode = "0010011" or
  526. opcode = "0110011" else
  527. '0';
  528.  
  529.  
  530. end a;
  531.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement