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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [gaisler/] [misc/] [ahbram.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------------------------------
2
--  This file is a part of the GRLIB VHDL IP LIBRARY
3
--  Copyright (C) 2003, Gaisler Research
4
--
5
--  This program is free software; you can redistribute it and/or modify
6
--  it under the terms of the GNU General Public License as published by
7
--  the Free Software Foundation; either version 2 of the License, or
8
--  (at your option) any later version.
9
--
10
--  This program is distributed in the hope that it will be useful,
11
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
--  GNU General Public License for more details.
14
--
15
--  You should have received a copy of the GNU General Public License
16
--  along with this program; if not, write to the Free Software
17
--  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
18
-----------------------------------------------------------------------------
19
-- Entity:      ahbram
20
-- File:        ahbram.vhd
21
-- Author:      Jiri Gaisler - Gaisler Reserch
22
-- Description: AHB ram. 0-waitstate read, 0/1-waitstate write.
23
------------------------------------------------------------------------------
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
library grlib;
28
use grlib.amba.all;
29
use grlib.stdlib.all;
30
use grlib.devices.all;
31
library techmap;
32
use techmap.gencomp.all;
33
 
34
entity ahbram is
35
  generic (
36
    hindex  : integer := 0;
37
    haddr   : integer := 0;
38
    hmask   : integer := 16#fff#;
39
    tech    : integer := DEFMEMTECH;
40
    kbytes  : integer := 1);
41
  port (
42
    rst     : in  std_ulogic;
43
    clk     : in  std_ulogic;
44
    ahbsi   : in  ahb_slv_in_type;
45
    ahbso   : out ahb_slv_out_type
46
  );
47
end;
48
 
49
architecture rtl of ahbram is
50
 
51
constant abits : integer := log2(kbytes) + 8;
52
 
53
constant hconfig : ahb_config_type := (
54
 
55
  4 => ahb_membar(haddr, '1', '1', hmask),
56
  others => zero32);
57
 
58
 
59
type reg_type is record
60
  hwrite : std_ulogic;
61
  hready : std_ulogic;
62
  hsel   : std_ulogic;
63
  addr   : std_logic_vector(abits+1 downto 0);
64
  size   : std_logic_vector(1 downto 0);
65
end record;
66
 
67
signal r, c : reg_type;
68
signal ramsel : std_ulogic;
69
signal write : std_logic_vector(3 downto 0);
70
signal ramaddr  : std_logic_vector(abits-1 downto 0);
71
signal ramdata  : std_logic_vector(31 downto 0);
72
begin
73
 
74
  comb : process (ahbsi, r, rst, ramdata)
75
  variable bs : std_logic_vector(3 downto 0);
76
  variable v : reg_type;
77
  variable haddr  : std_logic_vector(abits-1 downto 0);
78
  begin
79
    v := r; v.hready := '1'; bs := (others => '0');
80
    if (r.hwrite or not r.hready) = '1' then haddr := r.addr(abits+1 downto 2);
81
    else
82
      haddr := ahbsi.haddr(abits+1 downto 2); bs := (others => '0');
83
    end if;
84
 
85
    if ahbsi.hready = '1' then
86
      v.hsel := ahbsi.hsel(hindex) and ahbsi.htrans(1);
87
      v.hwrite := ahbsi.hwrite and v.hsel;
88
      v.addr := ahbsi.haddr(abits+1 downto 0);
89
      v.size := ahbsi.hsize(1 downto 0);
90
    end if;
91
 
92
    if r.hwrite = '1' then
93
      case r.size(1 downto 0) is
94
      when "00" => bs (conv_integer(r.addr(1 downto 0))) := '1';
95
      when "01" => bs := r.addr(1) & r.addr(1) & not (r.addr(1) & r.addr(1));
96
      when others => bs := (others => '1');
97
      end case;
98
      v.hready := not (v.hsel and not ahbsi.hwrite);
99
      v.hwrite := v.hwrite and v.hready;
100
    end if;
101
 
102
    if rst = '0' then v.hwrite := '0'; v.hready := '1'; end if;
103
    write <= bs; ramsel <= v.hsel or r.hwrite; ahbso.hready <= r.hready;
104
    ramaddr <= haddr; c <= v; ahbso.hrdata <= ramdata;
105
 
106
  end process;
107
 
108
  ahbso.hresp   <= "00";
109
  ahbso.hsplit  <= (others => '0');
110
  ahbso.hirq    <= (others => '0');
111
  ahbso.hcache  <= '1';
112
  ahbso.hconfig <= hconfig;
113
  ahbso.hindex  <= hindex;
114
 
115
  ra : for i in 0 to 3 generate
116
    aram :  syncram generic map (tech, abits, 8) port map (
117
        clk, ramaddr, ahbsi.hwdata(i*8+7 downto i*8),
118
        ramdata(i*8+7 downto i*8), ramsel, write(3-i));
119
  end generate;
120
 
121
  reg : process (clk)
122
  begin
123
    if rising_edge(clk ) then r <= c; end if;
124
  end process;
125
 
126
-- pragma translate_off
127
    bootmsg : report_version
128
    generic map ("ahbram" & tost(hindex) &
129
    ": AHB SRAM Module rev 1, " & tost(kbytes) & " kbytes");
130
-- pragma translate_on
131
end;

powered by: WebSVN 2.1.0

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