OpenCores
URL https://opencores.org/ocsvn/hpc-16/hpc-16/trunk

Subversion Repositories hpc-16

[/] [hpc-16/] [trunk/] [impl0/] [sim/] [testbench/] [ramNx16.vhd] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 umairsiddi
--------------------------------------------------------------
2
-- ramNx16.vhd
3
--------------------------------------------------------------
4
-- project: HPC-16 Microprocessor
5
--
6
-- usage: RAM with async read and sync write operation (not synthsizable, without timing params)
7
--
8
-- dependency: none 
9
--
10
-- Author: M. Umair Siddiqui (umairsiddiqui@opencores.org)
11
---------------------------------------------------------------
12
------------------------------------------------------------------------------------
13
--                                                                                --
14
--    Copyright (c) 2005, M. Umair Siddiqui all rights reserved                   --
15
--                                                                                --
16
--    This file is part of HPC-16.                                                --
17
--                                                                                --
18
--    HPC-16 is free software; you can redistribute it and/or modify              --
19
--    it under the terms of the GNU Lesser General Public License as published by --
20
--    the Free Software Foundation; either version 2.1 of the License, or         --
21
--    (at your option) any later version.                                         --
22
--                                                                                --
23
--    HPC-16 is distributed in the hope that it will be useful,                   --
24
--    but WITHOUT ANY WARRANTY; without even the implied warranty of              --
25
--    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               --
26
--    GNU Lesser General Public License for more details.                         --
27
--                                                                                --
28
--    You should have received a copy of the GNU Lesser General Public License    --
29
--    along with HPC-16; if not, write to the Free Software                       --
30
--    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   --
31
--                                                                                --
32
------------------------------------------------------------------------------------
33
 
34
library ieee;
35
use ieee.std_logic_1164.all;
36
use ieee.std_logic_arith.all;
37
use ieee.std_logic_unsigned.all;
38
-- synopsis synthesis_off
39
use std.textio.all;
40
use ieee.std_logic_textio.all;
41
-- synopsis synthesis_on
42
-------------------------------------
43
entity ramNx16 is
44
  generic
45
  (
46
    -- synopsis synthesis_off
47
    init_file_name : string := "init_ramNx16.txt";
48
    -- synopsis synthesis_on
49
    adr_width : integer := 4;
50
    dat_width : integer := 16
51
  );
52
  port
53
  (
54
    clk : in std_logic;
55
    adr : in std_logic_vector(adr_width - 1 downto 0);
56
    dat_i : in std_logic_vector(dat_width - 1 downto 0);
57
    --
58
    cs : in std_logic;
59
    we : in std_logic;
60
    ub : in std_logic;
61
    lb : in std_logic;
62
    oe : in std_logic;
63
    --
64
    dat_o : out std_logic_vector(dat_width - 1 downto 0)
65
  );
66
end ramNx16;
67
-----------------------------------------------------------------------
68
-----------------------------------------------------------------------
69
architecture async of ramNx16 is
70
  constant locs : integer := 2 ** adr_width;
71
  type rtype is array(0 to locs - 1) of std_logic_vector((dat_width/2) - 1 downto 0);
72
  shared variable ram_data_lower : rtype;
73
  shared variable ram_data_upper : rtype;
74
  --
75
  signal s_init : boolean := false;
76
  --
77
  signal write_lower : std_logic;
78
  signal write_upper : std_logic;
79
  signal out_lower : std_logic;
80
  signal out_upper : std_logic;
81
begin
82
  ----------------------------------------------------------------------------
83
  -- assertion  
84
  ----------------------------------------------------------------------------
85
  assert dat_width = 16
86
    report "module is designed for 16-bit data"
87
    severity error;
88
  ----------------------------------------------------------------------------
89
  -- init
90
  ----------------------------------------------------------------------------
91
  -- synopsis sythesis_off
92
  init: process
93
    file init_file : text;
94
    variable buf : line;
95
    variable address: integer;
96
    variable sep : character;
97
    variable data : std_logic_vector(dat_width - 1 downto 0);
98
  begin
99
    if ((not s_init) and (init_file_name /= "none")) then
100
      file_open(init_file, init_file_name, read_mode);
101
      while (not endfile(init_file)) loop
102
        readline(init_file, buf);
103
        read(buf, address);
104
        read(buf, sep);
105
        read(buf, data);
106
        ram_data_lower(address) := data(7 downto 0);
107
        ram_data_upper(address) := data(15 downto 8);
108
      end loop;
109
      file_close(init_file);
110
      s_init <= true;
111
    end if;
112
    wait;
113
  end process init;
114
  -- synopsis synthesis_on
115
  ----------------------------------------------------------------------------
116
  -- main
117
  ----------------------------------------------------------------------------
118
  write_low: write_lower <= cs and lb and we;
119
  write_up : write_upper <= cs and ub and we;
120
  ----------------------------------------------------------------------------
121
  upper: process(clk)
122
  begin
123
    -- synopsis synthesis_off
124
    if (s_init) then
125
    -- synopsis synthesis_on
126
      if rising_edge(clk) then
127
        if write_upper = '1' then
128
          ram_data_upper(conv_integer(adr)) := dat_i(15 downto 8);
129
        end if;
130
      end if;
131
    -- synopsis synthesis_off
132
    end if;
133
    -- synopsis synthesis_on
134
  end process upper;
135
  ----------------------------------------------------------------------------
136
  lower: process(clk)
137
  begin
138
    -- synopsis synthesis_off
139
    if (s_init) then
140
    -- synopsis synthesis_on
141
      if rising_edge(clk) then
142
          if write_lower = '1' then
143
            ram_data_lower(conv_integer(adr)) := dat_i(7 downto 0);
144
          end if;
145
      end if;
146
    -- synopsis synthesis_off
147
    end if;
148
    -- synopsis synthesis_on
149
  end process lower;
150
  -----------------------------------------------------------------------
151
  out_low : out_lower <= cs and lb and (not we) and oe;
152
  out_up  : out_upper <= cs and ub and (not we) and oe;
153
  ----------------------------------------------------------------------
154
  dat_low : dat_o(15 downto 8) <= ram_data_upper(conv_integer(adr)) when out_upper = '1' else
155
                                  (others => 'Z');
156
  dat_up  : dat_o(7 downto 0)  <= ram_data_lower(conv_integer(adr)) when out_lower = '1' else
157
                                  (others => 'Z');
158
  ----------------------------------------------------------------------                      
159
end async;

powered by: WebSVN 2.1.0

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