OpenCores
URL https://opencores.org/ocsvn/rise/rise/trunk

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [mem_stage.vhd] - Blame information for rev 151

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jlechner
-- File: mem_stage.vhd
2
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
3
-- Created: 2006-11-29
4
-- Last updated: 2006-11-29
5
 
6
-- Description:
7
-- Memory Access stage
8
-------------------------------------------------------------------------------
9
 
10
library IEEE;
11
use IEEE.STD_LOGIC_1164.all;
12
use IEEE.STD_LOGIC_ARITH.all;
13
 
14
use WORK.RISE_PACK.all;
15 71 jlechner
use work.RISE_PACK_SPECIFIC.all;
16 2 jlechner
 
17
entity mem_stage is
18
 
19
  port (
20 61 cwalter
    clk   : in std_logic;
21
    reset : in std_logic;
22 2 jlechner
 
23 61 cwalter
    ex_mem_register : in  EX_MEM_REGISTER_T;
24
    mem_wb_register : out MEM_WB_REGISTER_T;
25 2 jlechner
 
26 61 cwalter
    dmem_addr      : out MEM_ADDR_T;
27
    dmem_data_in   : in  MEM_DATA_T;
28
    dmem_data_out  : out MEM_DATA_T;
29
    dmem_wr_enable : out std_logic;
30 2 jlechner
 
31 61 cwalter
    stall_out : out std_logic;
32
    clear_in  : in  std_logic;
33
    clear_out : out std_logic);
34 2 jlechner
 
35
 
36
end mem_stage;
37
 
38
architecture mem_stage_rtl of mem_stage is
39
 
40 61 cwalter
  signal mem_wb_register_int  : MEM_WB_REGISTER_T;
41
  signal mem_wb_register_next : MEM_WB_REGISTER_T;
42 123 trinklhar
 
43 2 jlechner
begin  -- mem_stage_rtl
44
 
45 61 cwalter
  mem_wb_register.aluop1    <= mem_wb_register_int.aluop1;
46
  mem_wb_register.aluop2    <= mem_wb_register_int.aluop2;
47
  mem_wb_register.reg       <= mem_wb_register_int.reg;
48
  mem_wb_register.mem_reg   <= dmem_data_in;
49
  mem_wb_register.dreg_addr <= mem_wb_register_int.dreg_addr;
50
  mem_wb_register.lr        <= mem_wb_register_int.lr;
51
  mem_wb_register.sr        <= mem_wb_register_int.sr;
52 38 jlechner
 
53 61 cwalter
  clear_out <= '0';  -- clear_out output is unused at the moment.
54
  stall_out <= '0';                     -- development (temporarily)
55 38 jlechner
  process (clk, reset)
56
  begin  -- process
57
    if reset = '0' then                 -- asynchronous reset (active low)
58 61 cwalter
      mem_wb_register_int.aluop1    <= (others => '0');
59
      mem_wb_register_int.aluop2    <= (others => '0');
60
      mem_wb_register_int.reg       <= (others => '0');
61
      mem_wb_register_int.dreg_addr <= (others => '0');
62
      mem_wb_register_int.lr        <= (others => '0');
63
      mem_wb_register_int.sr        <= (others => '0');
64 38 jlechner
    elsif clk'event and clk = '1' then  -- rising clock edge
65 61 cwalter
      mem_wb_register_int <= mem_wb_register_next;
66 38 jlechner
    end if;
67
  end process;
68 61 cwalter
 
69 104 cwalter
  process( reset, ex_mem_register, dmem_data_in )
70 61 cwalter
  begin
71 101 cwalter
    dmem_addr      <= (others => 'X');
72
    dmem_data_out  <= (others => 'X');
73
    dmem_wr_enable <= '0';
74
 
75 61 cwalter
    if reset = '0' then
76
      mem_wb_register_next.aluop1    <= (others => '0');
77
      mem_wb_register_next.aluop2    <= (others => '0');
78
      mem_wb_register_next.reg       <= (others => '-');
79
      mem_wb_register_next.mem_reg   <= (others => '-');
80
      mem_wb_register_next.dreg_addr <= (others => '-');
81
      mem_wb_register_next.lr        <= (others => '-');
82
      mem_wb_register_next.sr        <= (others => '-');
83
    else
84
      -- check if the instruction accesses the memory. if yes then
85
      -- either load or store data from the memory.
86
      assert ex_mem_register.aluop1(ALUOP1_LD_MEM_BIT) = '0' or ex_mem_register.aluop1(ALUOP1_ST_MEM_BIT) = '0';
87 123 trinklhar
 
88 61 cwalter
      if ex_mem_register.aluop1(ALUOP1_LD_MEM_BIT) = '1' then
89 123 trinklhar
        dmem_addr <= ex_mem_register.alu;
90
      end if;
91 61 cwalter
 
92
      if ex_mem_register.aluop1(ALUOP1_ST_MEM_BIT) = '1' then
93 123 trinklhar
        dmem_addr      <= ex_mem_register.alu;
94
        dmem_data_out  <= ex_mem_register.reg;
95
        dmem_wr_enable <= '1';
96
      end if;
97 61 cwalter
 
98
      -- other values are pass through
99
      mem_wb_register_next.aluop1    <= ex_mem_register.aluop1;
100
      mem_wb_register_next.aluop2    <= ex_mem_register.aluop2;
101 74 cwalter
      mem_wb_register_next.reg       <= ex_mem_register.alu;
102 61 cwalter
      mem_wb_register_next.dreg_addr <= ex_mem_register.dreg_addr;
103
      mem_wb_register_next.lr        <= ex_mem_register.lr;
104
      mem_wb_register_next.sr        <= ex_mem_register.sr;
105
    end if;
106
  end process;
107 2 jlechner
 
108
end mem_stage_rtl;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.