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

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [rtl/] [core/] [neorv32_wishbone.vhd] - Diff between revs 35 and 36

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

Rev 35 Rev 36
Line 62... Line 62...
  port (
  port (
    -- global control --
    -- global control --
    clk_i    : in  std_ulogic; -- global clock line
    clk_i    : in  std_ulogic; -- global clock line
    rstn_i   : in  std_ulogic; -- global reset line, low-active
    rstn_i   : in  std_ulogic; -- global reset line, low-active
    -- host access --
    -- host access --
 
    src_i    : in  std_ulogic; -- access type (0: data, 1:instruction)
    addr_i   : in  std_ulogic_vector(31 downto 0); -- address
    addr_i   : in  std_ulogic_vector(31 downto 0); -- address
    rden_i   : in  std_ulogic; -- read enable
    rden_i   : in  std_ulogic; -- read enable
    wren_i   : in  std_ulogic; -- write enable
    wren_i   : in  std_ulogic; -- write enable
    ben_i    : in  std_ulogic_vector(03 downto 0); -- byte write enable
    ben_i    : in  std_ulogic_vector(03 downto 0); -- byte write enable
    data_i   : in  std_ulogic_vector(31 downto 0); -- data in
    data_i   : in  std_ulogic_vector(31 downto 0); -- data in
    data_o   : out std_ulogic_vector(31 downto 0); -- data out
    data_o   : out std_ulogic_vector(31 downto 0); -- data out
    cancel_i : in  std_ulogic; -- cancel current bus transaction
    cancel_i : in  std_ulogic; -- cancel current bus transaction
    ack_o    : out std_ulogic; -- transfer acknowledge
    ack_o    : out std_ulogic; -- transfer acknowledge
    err_o    : out std_ulogic; -- transfer error
    err_o    : out std_ulogic; -- transfer error
 
    priv_i   : in  std_ulogic_vector(1 downto 0); -- current CPU privilege level
    -- wishbone interface --
    -- wishbone interface --
 
    wb_tag_o : out std_ulogic_vector(2 downto 0); -- tag
    wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
    wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
    wb_dat_i : in  std_ulogic_vector(31 downto 0); -- read data
    wb_dat_i : in  std_ulogic_vector(31 downto 0); -- read data
    wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
    wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
    wb_we_o  : out std_ulogic; -- read/write
    wb_we_o  : out std_ulogic; -- read/write
    wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
    wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
Line 110... Line 113...
    rdat       : std_ulogic_vector(31 downto 0);
    rdat       : std_ulogic_vector(31 downto 0);
    sel        : std_ulogic_vector(3 downto 0);
    sel        : std_ulogic_vector(3 downto 0);
    ack        : std_ulogic;
    ack        : std_ulogic;
    err        : std_ulogic;
    err        : std_ulogic;
    timeout    : std_ulogic_vector(index_size_f(wb_timeout_c)-1 downto 0);
    timeout    : std_ulogic_vector(index_size_f(wb_timeout_c)-1 downto 0);
 
    src        : std_ulogic;
 
    priv       : std_ulogic_vector(1 downto 0);
  end record;
  end record;
  signal ctrl : ctrl_t;
  signal ctrl : ctrl_t;
 
  signal stb_int : std_ulogic;
  signal stb_int, cyc_int : std_ulogic;
  signal cyc_int : std_ulogic;
 
 
begin
begin
 
 
  -- Sanity Checks --------------------------------------------------------------------------
  -- Sanity Checks --------------------------------------------------------------------------
  -- -------------------------------------------------------------------------------------------
  -- -------------------------------------------------------------------------------------------
Line 155... Line 160...
      ctrl.rdat       <= (others => '0');
      ctrl.rdat       <= (others => '0');
      ctrl.sel        <= (others => '0');
      ctrl.sel        <= (others => '0');
      ctrl.timeout    <= (others => '0');
      ctrl.timeout    <= (others => '0');
      ctrl.ack        <= '0';
      ctrl.ack        <= '0';
      ctrl.err        <= '0';
      ctrl.err        <= '0';
 
      ctrl.src        <= '0';
 
      ctrl.priv       <= "00";
    elsif rising_edge(clk_i) then
    elsif rising_edge(clk_i) then
      -- defaults --
      -- defaults --
      ctrl.state_prev <= ctrl.state;
      ctrl.state_prev <= ctrl.state;
      ctrl.rdat       <= (others => '0');
      ctrl.rdat       <= (others => '0');
      ctrl.ack        <= '0';
      ctrl.ack        <= '0';
Line 175... Line 182...
          -- buffer all outgoing signals --
          -- buffer all outgoing signals --
          ctrl.we   <= wren_i;
          ctrl.we   <= wren_i;
          ctrl.adr  <= addr_i;
          ctrl.adr  <= addr_i;
          ctrl.wdat <= data_i;
          ctrl.wdat <= data_i;
          ctrl.sel  <= ben_i;
          ctrl.sel  <= ben_i;
 
          ctrl.src  <= src_i;
 
          ctrl.priv <= priv_i;
          -- valid read/write access --
          -- valid read/write access --
          if ((wb_access and (wren_i or ctrl.wr_req or rden_i or ctrl.rd_req)) = '1') then
          if ((wb_access and (wren_i or ctrl.wr_req or rden_i or ctrl.rd_req)) = '1') then
            ctrl.state <= BUSY;
            ctrl.state <= BUSY;
          end if;
          end if;
 
 
Line 212... Line 221...
 
 
      end case;
      end case;
    end if;
    end if;
  end process bus_arbiter;
  end process bus_arbiter;
 
 
 
 
  -- host access --
  -- host access --
  data_o   <= ctrl.rdat;
  data_o   <= ctrl.rdat;
  ack_o    <= ctrl.ack;
  ack_o    <= ctrl.ack;
  err_o    <= ctrl.err;
  err_o    <= ctrl.err;
 
 
  -- wishbone interface --
  -- wishbone interface --
 
  wb_tag_o(0) <= '1' when (ctrl.priv = priv_mode_m_c) else '0'; -- privileged access when in machine mode
 
  wb_tag_o(1) <= '0'; -- 0=secure, 1=non-secure
 
  wb_tag_o(2) <= ctrl.src; -- 0=data access, 1=instruction access
 
 
  wb_adr_o <= ctrl.adr;
  wb_adr_o <= ctrl.adr;
  wb_dat_o <= ctrl.wdat;
  wb_dat_o <= ctrl.wdat;
  wb_we_o  <= ctrl.we;
  wb_we_o  <= ctrl.we;
  wb_sel_o <= ctrl.sel;
  wb_sel_o <= ctrl.sel;
  wb_stb_o <= stb_int when (WB_PIPELINED_MODE = true) else cyc_int;
  wb_stb_o <= stb_int when (WB_PIPELINED_MODE = true) else cyc_int;

powered by: WebSVN 2.1.0

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