Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. use work.core_pack.all;
  6.  
  7. entity regfile is
  8.  
  9. port (
  10. clk, reset : in std_logic;
  11. stall : in std_logic;
  12. rdaddr1, rdaddr2 : in std_logic_vector(REG_BITS-1 downto 0);
  13. rddata1, rddata2 : out std_logic_vector(DATA_WIDTH-1 downto 0);
  14. wraddr : in std_logic_vector(REG_BITS-1 downto 0);
  15. wrdata : in std_logic_vector(DATA_WIDTH-1 downto 0);
  16. regwrite : in std_logic);
  17.  
  18. end regfile;
  19.  
  20. architecture rtl of regfile is
  21. subtype REG_ENTRY_TYPE is std_logic_vector (DATA_WIDTH - 1 downto 0);
  22. type REG_TYPE is array (0 to (REG_COUNT) - 1) of REG_ENTRY_TYPE;
  23. signal reg : REG_TYPE := (others => x"00000000");
  24. signal rdaddr1_sig, rdaddr2_sig : std_logic_vector(REG_BITS-1 downto 0);
  25.  
  26. begin -- rtl
  27.  
  28. process(rdaddr1_sig, rdaddr2_sig, wraddr,regwrite,wrdata,reg)
  29. begin
  30. if stall = '0' then
  31. if rdaddr1_sig = wraddr and regwrite = '1' then
  32. rddata1 <= wrdata;
  33. rddata2 <= reg(to_integer(unsigned(rdaddr2_sig)));
  34. elsif rdaddr2_sig = wraddr and regwrite = '1' then
  35. rddata1 <= reg(to_integer(unsigned(rdaddr1_sig)));
  36. rddata2 <= wrdata;
  37. elsif rdaddr1_sig = wraddr and rdaddr2_sig = wraddr and regwrite = '1' then
  38. rddata1 <= wrdata;
  39. rddata2 <= wrdata;
  40. else
  41. rddata1 <= reg(to_integer(unsigned(rdaddr1_sig)));
  42. rddata2 <= reg(to_integer(unsigned(rdaddr2_sig)));
  43. end if;
  44.  
  45. if rdaddr1 = "00000" then
  46. rddata1 <= (others => '0');
  47. end if;
  48. if rdaddr2 = "00000" then
  49. rddata2 <= (others => '0');
  50. end if;
  51. end if;
  52.  
  53. end process;
  54.  
  55. process(clk, reset)
  56. begin
  57. if reset = '0' then
  58. reg <= (others => x"00000000");
  59. --rddata1 <= (others => '0');
  60. --rddata2 <= (others => '0');
  61. elsif rising_edge(clk) then
  62. rdaddr1_sig <= rdaddr1;
  63. rdaddr2_sig <=rdaddr2;
  64. if regwrite = '1' then
  65. if wraddr /= "00000" and stall /= '1' then
  66. reg(to_integer(unsigned(wraddr))) <= wrdata;
  67. end if;
  68. end if;
  69. end if;
  70.  
  71. end process;
  72. end rtl;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement