You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			VHDL
		
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			VHDL
		
	
| library ieee;
 | |
| use ieee.std_logic_1164.all;
 | |
| use ieee.numeric_std.all;
 | |
| 
 | |
| library work;
 | |
| use work.common.all;
 | |
| use work.helpers.all;
 | |
| 
 | |
| -- 2 cycle LSU
 | |
| -- We calculate the address in the first cycle
 | |
| 
 | |
| entity loadstore1 is
 | |
|     port (
 | |
|         clk   : in std_ulogic;
 | |
| 
 | |
|         l_in  : in Decode2ToLoadstore1Type;
 | |
| 
 | |
|         l_out : out Loadstore1ToLoadstore2Type
 | |
|         );
 | |
| end loadstore1;
 | |
| 
 | |
| architecture behave of loadstore1 is
 | |
|     signal r, rin : Loadstore1ToLoadstore2Type;
 | |
|     signal lsu_sum : std_ulogic_vector(63 downto 0);
 | |
| begin
 | |
|     -- Calculate the address in the first cycle
 | |
|     lsu_sum <= std_ulogic_vector(unsigned(l_in.addr1) + unsigned(l_in.addr2)) when l_in.valid = '1' else (others => '0');
 | |
| 
 | |
|     loadstore1_0: process(clk)
 | |
|     begin
 | |
|         if rising_edge(clk) then
 | |
|             r <= rin;
 | |
|         end if;
 | |
|     end process;
 | |
| 
 | |
|     loadstore1_1: process(all)
 | |
|         variable v : Loadstore1ToLoadstore2Type;
 | |
|     begin
 | |
|         v := r;
 | |
| 
 | |
|         v.valid := l_in.valid;
 | |
|         v.load := l_in.load;
 | |
|         v.data := l_in.data;
 | |
|         v.write_reg := l_in.write_reg;
 | |
|         v.length := l_in.length;
 | |
|         v.byte_reverse := l_in.byte_reverse;
 | |
|         v.sign_extend := l_in.sign_extend;
 | |
|         v.update := l_in.update;
 | |
|         v.update_reg := l_in.update_reg;
 | |
| 
 | |
|         -- byte reverse stores in the first cycle
 | |
|         if v.load = '0' and l_in.byte_reverse = '1' then
 | |
|             v.data := byte_reverse(l_in.data, to_integer(unsigned(l_in.length)));
 | |
|         end if;
 | |
| 
 | |
|         v.addr := lsu_sum;
 | |
| 
 | |
|         -- Update registers
 | |
|         rin <= v;
 | |
| 
 | |
|         -- Update outputs
 | |
|         l_out <= r;
 | |
|     end process;
 | |
| end;
 |