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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [mem_stage.vhd] - Diff between revs 104 and 117

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 104 Rev 117
Line 38... Line 38...
architecture mem_stage_rtl of mem_stage is
architecture mem_stage_rtl of mem_stage is
 
 
  signal mem_wb_register_int  : MEM_WB_REGISTER_T;
  signal mem_wb_register_int  : MEM_WB_REGISTER_T;
  signal mem_wb_register_next : MEM_WB_REGISTER_T;
  signal mem_wb_register_next : MEM_WB_REGISTER_T;
 
 
 
 
 
      component sc_uart is
 
      generic (ADDR_BITS : integer;
 
               CLK_FREQ  : integer;
 
               BAUD_RATE : integer;
 
               TXF_DEPTH : integer;
 
               TXF_THRES : integer;
 
               RXF_DEPTH : integer;
 
               RXF_THRES : integer);
 
      port (CLK     : in  std_logic;
 
            RESET   : in  std_logic;
 
            ADDRESS : in  std_logic_vector(addr_bits-1 downto 0);
 
            WR_DATA : in  std_logic_vector(15 downto 0);
 
            RD, WR  : in  std_logic;
 
            RD_DATA : out std_logic_vector(15 downto 0);
 
            RDY_CNT : out IEEE.NUMERIC_STD.unsigned(1 downto 0);
 
            TXD     : out std_logic;
 
            RXD     : in  std_logic;
 
            NCTS    : in  std_logic;
 
            NRTS    : out std_logic);
 
    end component;
 
 
begin  -- mem_stage_rtl
begin  -- mem_stage_rtl
 
  -- Uart modul einbinden
 
  UART : sc_uart generic map (
 
    ADDR_BITS => 2,
 
    CLK_FREQ  => CLK_FREQ,
 
    BAUD_RATE => 115200,
 
    TXF_DEPTH => 2,
 
    TXF_THRES => 1,
 
    RXF_DEPTH => 2,
 
    RXF_THRES => 1
 
    )
 
         port map(
 
      CLK     => clk,
 
      RESET   => reset,
 
      ADDRESS => address(1 downto 0),
 
      WR_DATA => wr_data,
 
      RD      => rd,
 
      WR      => wr,
 
      RD_DATA => rd_data,
 
      RDY_CNT => rdy_cnt,
 
      TXD     => txd,
 
      RXD     => rxd,
 
      NCTS    => '0',
 
      NRTS    => open
 
      );
 
 
  mem_wb_register.aluop1    <= mem_wb_register_int.aluop1;
  mem_wb_register.aluop1    <= mem_wb_register_int.aluop1;
  mem_wb_register.aluop2    <= mem_wb_register_int.aluop2;
  mem_wb_register.aluop2    <= mem_wb_register_int.aluop2;
  mem_wb_register.reg       <= mem_wb_register_int.reg;
  mem_wb_register.reg       <= mem_wb_register_int.reg;
  mem_wb_register.mem_reg   <= dmem_data_in;
  mem_wb_register.mem_reg   <= dmem_data_in;
Line 59... Line 105...
      mem_wb_register_int.aluop2    <= (others => '0');
      mem_wb_register_int.aluop2    <= (others => '0');
      mem_wb_register_int.reg       <= (others => '0');
      mem_wb_register_int.reg       <= (others => '0');
      mem_wb_register_int.dreg_addr <= (others => '0');
      mem_wb_register_int.dreg_addr <= (others => '0');
      mem_wb_register_int.lr        <= (others => '0');
      mem_wb_register_int.lr        <= (others => '0');
      mem_wb_register_int.sr        <= (others => '0');
      mem_wb_register_int.sr        <= (others => '0');
 
 
 
--              uart reset
 
                rd              <= '0';
 
                wr              <= '0';
 
      wr_data        <= (others => 'X');
 
                rd_data        <= (others => '0');
 
           address                      <= (others => 'X');
 
 
    elsif clk'event and clk = '1' then  -- rising clock edge
    elsif clk'event and clk = '1' then  -- rising clock edge
      mem_wb_register_int <= mem_wb_register_next;
      mem_wb_register_int <= mem_wb_register_next;
    end if;
    end if;
  end process;
  end process;
 
 
Line 82... Line 136...
      mem_wb_register_next.sr        <= (others => '-');
      mem_wb_register_next.sr        <= (others => '-');
    else
    else
      -- check if the instruction accesses the memory. if yes then
      -- check if the instruction accesses the memory. if yes then
      -- either load or store data from the memory.
      -- either load or store data from the memory.
      assert ex_mem_register.aluop1(ALUOP1_LD_MEM_BIT) = '0' or ex_mem_register.aluop1(ALUOP1_ST_MEM_BIT) = '0';
      assert ex_mem_register.aluop1(ALUOP1_LD_MEM_BIT) = '0' or ex_mem_register.aluop1(ALUOP1_ST_MEM_BIT) = '0';
 
--load from mem
      if ex_mem_register.aluop1(ALUOP1_LD_MEM_BIT) = '1' then
      if ex_mem_register.aluop1(ALUOP1_LD_MEM_BIT) = '1' then
        dmem_addr <= ex_mem_register.alu;
        if ex_mem_register.alu = CONST_ADDRESS then
 
                    --load from UART
 
                                address <= CONDT_ADDRESS;
 
                                rd ='1';
 
 
 
                                if rd_data = '0' then
 
                                  stall_out <= '1';
 
                                else
 
                                  stall_out <= '0';
 
                                  dmem_addr <= rd_data;
      end if;
      end if;
 
 
 
             else
 
                    dmem_addr <= ex_mem_register.alu;
 
                  end if;
 
                end if;
 
-- store in mem
      if ex_mem_register.aluop1(ALUOP1_ST_MEM_BIT) = '1' then
      if ex_mem_register.aluop1(ALUOP1_ST_MEM_BIT) = '1' then
 
        if ex_mem_register.alu = CONST_ADDRESS then
 
                  --write to Uart
 
                    if sc_uart.rf_full = '1' then
 
                           --stall
 
                                stall_out <= '1';
 
                         else
 
                                stall_out <= '0';
 
                           address       <= ex_mem_register.alu;
 
                                wr_data  <= ex_mem_register.reg;
 
                                wr               <= '1';
 
 
 
                         end if;
 
                  else
        dmem_addr      <= ex_mem_register.alu;
        dmem_addr      <= ex_mem_register.alu;
        dmem_data_out  <= ex_mem_register.reg;
        dmem_data_out  <= ex_mem_register.reg;
        dmem_wr_enable <= '1';
        dmem_wr_enable <= '1';
      end if;
      end if;
 
                end if;
 
 
      -- other values are pass through
      -- other values are pass through
      mem_wb_register_next.aluop1    <= ex_mem_register.aluop1;
      mem_wb_register_next.aluop1    <= ex_mem_register.aluop1;
      mem_wb_register_next.aluop2    <= ex_mem_register.aluop2;
      mem_wb_register_next.aluop2    <= ex_mem_register.aluop2;
      mem_wb_register_next.reg       <= ex_mem_register.alu;
      mem_wb_register_next.reg       <= ex_mem_register.alu;

powered by: WebSVN 2.1.0

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