regfile.vhd

来自「modelsim+dc开发的4级流水线结构的MIPS CPU」· VHDL 代码 · 共 351 行

VHD
351
字号
-- regfile.vhdl---- Register file containing R0 to R31---- 1.2 [dsulli] Updated for new reg component with CE, simplified logic-- 1.3 [dsulli] changed ce to rwe (register write enable)-- 1.4 [dsulli] added R0 and R1 output portslibrary ieee;use ieee.std_logic_1164.all;use work.mips_pack.all;entity regfile is	port (reg_r1: in std_ulogic_vector(4 downto 0);	      reg_r2: in std_ulogic_vector(4 downto 0);	      reg_w: in std_ulogic_vector(4 downto 0);	      data_in: in std_ulogic_vector(31 downto 0);	      clk: in std_ulogic;	      rst: in std_ulogic;	      we: in std_ulogic;	      data_out1: out std_ulogic_vector(31 downto 0);	      data_out2: out std_ulogic_vector(31 downto 0)	      );end entity regfile;architecture a1 of regfile is	signal Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7,	   Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15,	   Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23,	   Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31: std_ulogic_vector(31 downto 0);	signal rwe: std_ulogic_vector(31 downto 0);begin 	-- There has got to be a better way to do this	Reg0: component reg  generic map (H_L => '0',N => 32) 	port map (D => data_in, Q => Q0, rst => rst, 	                              clk => clk, we => '0');          	Reg1: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q1, rst => rst, 	                              clk => clk, we => rwe(1));	Reg2: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q2, rst => rst, 	                              clk => clk, we => rwe(2));	Reg3: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q3, rst => rst, 	                              clk => clk, we => rwe(3));	Reg4: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q4, rst => rst, 	                              clk => clk, we => rwe(4));	Reg5: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q5, rst => rst, 	                              clk => clk, we => rwe(5));	Reg6: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q6, rst => rst, 	                              clk => clk, we => rwe(6));	Reg7: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q7, rst => rst, 	                              clk => clk, we => rwe(7));	Reg8: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q8, rst => rst, 	                              clk => clk, we => rwe(8));	Reg9: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q9, rst => rst, 	                              clk => clk, we => rwe(9));	Reg10: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q10, rst => rst, 	                              clk => clk, we => rwe(10));	Reg11: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q11, rst => rst, 	                              clk => clk, we => rwe(11));	Reg12: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q12, rst => rst, 	                              clk => clk, we => rwe(12));	Reg13: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q13, rst => rst, 	                              clk => clk, we => rwe(13));	Reg14: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q14, rst => rst, 	                              clk => clk, we => rwe(14));	Reg15: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q15, rst => rst, 	                              clk => clk, we => rwe(15));	Reg16: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q16, rst => rst, 	                              clk => clk, we => rwe(16));	Reg17: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q17, rst => rst, 	                              clk => clk, we => rwe(17));	Reg18: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q18, rst => rst, 	                              clk => clk, we => rwe(18));	Reg19: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q19, rst => rst, 	                              clk => clk, we => rwe(19));	Reg20: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q20, rst => rst, 	                              clk => clk, we => rwe(20));	Reg21: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q21, rst => rst, 	                              clk => clk, we => rwe(21));	Reg22: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q22, rst => rst, 	                              clk => clk, we => rwe(22));	Reg23: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q23, rst => rst, 	                              clk => clk, we => rwe(23));	Reg24: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q24, rst => rst, 	                              clk => clk, we => rwe(24));	Reg25: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q25, rst => rst, 	                              clk => clk, we => rwe(25));	Reg26: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q26, rst => rst, 	                              clk => clk, we => rwe(26));	Reg27: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q27, rst => rst, 	                              clk => clk, we => rwe(27));	Reg28: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q28, rst => rst, 	                              clk => clk, we => rwe(28));	Reg29: component reg generic map (H_L => '0',N => 32,RST_DATA => X"8001FFF0")	port map (D => data_in, Q => Q29, rst => rst, 	                              clk => clk, we => rwe(29));	Reg30: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q30, rst => rst, 	                              clk => clk, we => rwe(30));	Reg31: component reg generic map (H_L => '0',N => 32)	port map (D => data_in, Q => Q31, rst => rst, 	                              clk => clk, we => rwe(31));                      	REG_READ: process (reg_r1, reg_r2, Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7,Q8, Q9, 	Q10, Q11, Q12, Q13, Q14, Q15,Q16, Q17, Q18, Q19, Q20, Q21, Q22, 	Q23,Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31) is	begin		case reg_r1 is			when "00000" =>				data_out1 <= Q0;			when "00001" =>				data_out1 <= Q1;			when "00010" =>				data_out1 <= Q2;			when "00011" =>				data_out1 <= Q3;			when "00100" =>				data_out1 <= Q4;			when "00101" =>				data_out1 <= Q5;			when "00110" =>				data_out1 <= Q6;			when "00111" =>				data_out1 <= Q7;			when "01000" =>				data_out1 <= Q8;			when "01001" =>				data_out1 <= Q9;			when "01010" =>				data_out1 <= Q10;			when "01011" =>				data_out1 <= Q11;			when "01100" =>				data_out1 <= Q12;			when "01101" =>				data_out1 <= Q13;			when "01110" =>				data_out1 <= Q14;			when "01111" =>				data_out1 <= Q15;			when "10000" =>				data_out1 <= Q16;			when "10001" =>				data_out1 <= Q17;			when "10010" =>				data_out1 <= Q18;			when "10011" =>				data_out1 <= Q19;			when "10100" =>				data_out1 <= Q20;			when "10101" =>				data_out1 <= Q21;			when "10110" =>				data_out1 <= Q22;			when "10111" =>				data_out1 <= Q23;			when "11000" =>				data_out1 <= Q24;			when "11001" =>				data_out1 <= Q25;			when "11010" =>				data_out1 <= Q26;			when "11011" =>				data_out1 <= Q27;			when "11100" =>				data_out1 <= Q28;			when "11101" =>				data_out1 <= Q29;			when "11110" =>				data_out1 <= Q30;			when "11111" =>				data_out1 <= Q31;			when others => null;		end case;		case reg_r2 is			when "00000" =>				data_out2 <= Q0;			when "00001" =>				data_out2 <= Q1;			when "00010" =>				data_out2 <= Q2;			when "00011" =>				data_out2 <= Q3;			when "00100" =>				data_out2 <= Q4;			when "00101" =>				data_out2 <= Q5;			when "00110" =>				data_out2 <= Q6;			when "00111" =>				data_out2 <= Q7;			when "01000" =>				data_out2 <= Q8;			when "01001" =>				data_out2 <= Q9;			when "01010" =>				data_out2 <= Q10;			when "01011" =>				data_out2 <= Q11;			when "01100" =>				data_out2 <= Q12;			when "01101" =>				data_out2 <= Q13;			when "01110" =>				data_out2 <= Q14;			when "01111" =>				data_out2 <= Q15;			when "10000" =>				data_out2 <= Q16;			when "10001" =>				data_out2 <= Q17;			when "10010" =>				data_out2 <= Q18;			when "10011" =>				data_out2 <= Q19;			when "10100" =>				data_out2 <= Q20;			when "10101" =>				data_out2 <= Q21;			when "10110" =>				data_out2 <= Q22;			when "10111" =>				data_out2 <= Q23;			when "11000" =>				data_out2 <= Q24;			when "11001" =>				data_out2 <= Q25;			when "11010" =>				data_out2 <= Q26;			when "11011" =>				data_out2 <= Q27;			when "11100" =>				data_out2 <= Q28;			when "11101" =>				data_out2 <= Q29;			when "11110" =>				data_out2 <= Q30;			when "11111" =>				data_out2 <= Q31;			when others => null;		end case;	end process REG_READ;		REG_WRITE: process (reg_w, we) is	begin		-- Default values for rwe		rwe <= (others => '0');				if we = '1' then			case reg_w is				when "00000" =>					rwe(0) <= '1';				when "00001" =>					rwe(1) <= '1';				when "00010" =>					rwe(2) <= '1';				when "00011" =>					rwe(3) <= '1';				when "00100" =>					rwe(4) <= '1';				when "00101" =>					rwe(5) <= '1';				when "00110" =>					rwe(6) <= '1';				when "00111" =>					rwe(7) <= '1';				when "01000" =>					rwe(8) <= '1';				when "01001" =>					rwe(9) <= '1';				when "01010" =>					rwe(10) <= '1';				when "01011" =>					rwe(11) <= '1';				when "01100" =>					rwe(12) <= '1';				when "01101" =>					rwe(13) <= '1';				when "01110" =>					rwe(14) <= '1';				when "01111" =>					rwe(15) <= '1';				when "10000" =>					rwe(16) <= '1';				when "10001" =>					rwe(17) <= '1';				when "10010" =>					rwe(18) <= '1';				when "10011" =>					rwe(19) <= '1';				when "10100" =>					rwe(20) <= '1';				when "10101" =>					rwe(21) <= '1';				when "10110" =>					rwe(22) <= '1';				when "10111" =>					rwe(23) <= '1';					when "11000" =>					rwe(24) <= '1';				when "11001" =>					rwe(25) <= '1';				when "11010" =>					rwe(26) <= '1';				when "11011" =>					rwe(27) <= '1';				when "11100" =>					rwe(28) <= '1';				when "11101" =>					rwe(29) <= '1';				when "11110" =>					rwe(30) <= '1';				when "11111" =>					rwe(31) <= '1';				when others => null;			end case;		end if;	end process REG_WRITE;end architecture a1;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?