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

Subversion Repositories log_anal

[/] [log_anal/] [trunk/] [syn/] [Xilinx_Virtex/] [la_bram.vhd] - Blame information for rev 6

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

Line No. Rev Author Line
1 2 jamro
---- logic analyser internal BlockRAM  description
2
-- Only XST supports RAM inference
3
-- Infers Dual Port Block Ram 
4
 
5
-- remove this entity if you use a synthesis tool that cannot automaticaly detect dual port RAM
6
-- or if you use seperate clocks (generic: two_clocks>0 - Xilinx XST cannot automatically detect two clocks macro
7
-- then use a memory macro and remove this entity
8
 
9
library IEEE;
10
use IEEE.std_logic_1164.all;
11
use IEEE.std_logic_unsigned.all;
12
 
13
-- XST translate_off
14
library Virtex;
15
-- XST translate_on 
16
 
17
 
18
entity la_bram is
19
  generic (data_width: integer:= 8; -- width of the data
20
    adr_width: integer:= 9; -- width of the address 
21
        two_clocks: integer:= 0); -- =0 only one clock is used, =1 two seprrate clocks are used
22
  port (clka, wea: in std_logic;
23
    dia: in std_logic_vector(data_width-1 downto 0);
24
        addra: in std_logic_vector(adr_width-1 downto 0);
25
        -- dual port interface (Wishbone interface)
26
        clkb: in std_logic;
27
        dob: out std_logic_vector(data_width-1 downto 0);
28
        addrb: in std_logic_vector(adr_width-1 downto 0));
29
end la_bram;
30
 
31
architecture la_bram_arch of la_bram is
32
-- Xilinx Virtex BRAM declaration for dual port memory with two different clocks
33
  component ramb4_S16_S16
34
          port (wea, ena, rsta, clka: in std_logic;
35
          addra: in std_logic_vector(7 downto 0);
36
          dia: in std_logic_vector(15 downto 0);
37
          doa: out std_logic_vector(15 downto 0);
38
          web, enb, rstb, clkb: in std_logic;
39
          addrb: in std_logic_vector(7 downto 0);
40
          dib: in std_logic_vector(15 downto 0);
41
          dob: out std_logic_vector(15 downto 0));
42
    end component;
43
  component ramb4_S8_S8
44
          port (wea, ena, rsta, clka: in std_logic;
45
          addra: in std_logic_vector(8 downto 0);
46
          dia: in std_logic_vector(7 downto 0);
47
          doa: out std_logic_vector(7 downto 0);
48
          web, enb, rstb, clkb: in std_logic;
49
          addrb: in std_logic_vector(8 downto 0);
50
          dib: in std_logic_vector(7 downto 0);
51
          dob: out std_logic_vector(7 downto 0));
52
    end component;
53
  component ramb4_S4_S4
54
          port (wea, ena, rsta, clka: in std_logic;
55
          addra: in std_logic_vector(9 downto 0);
56
          dia: in std_logic_vector(3 downto 0);
57
          doa: out std_logic_vector(3 downto 0);
58
          web, enb, rstb, clkb: in std_logic;
59
          addrb: in std_logic_vector(9 downto 0);
60
          dib: in std_logic_vector(3 downto 0);
61
          dob: out std_logic_vector(3 downto 0));
62
    end component;
63
  component ramb4_S2_S2
64
          port (wea, ena, rsta, clka: in std_logic;
65
          addra: in std_logic_vector(10 downto 0);
66
          dia: in std_logic_vector(1 downto 0);
67
          doa: out std_logic_vector(1 downto 0);
68
          web, enb, rstb, clkb: in std_logic;
69
          addrb: in std_logic_vector(10 downto 0);
70
          dib: in std_logic_vector(1 downto 0);
71
          dob: out std_logic_vector(1 downto 0));
72
    end component;
73
  component ramb4_S1_S1
74
          port (wea, ena, rsta, clka: in std_logic;
75
          addra: in std_logic_vector(11 downto 0);
76
          dia: in std_logic_vector(0 downto 0);
77
          doa: out std_logic_vector(0 downto 0);
78
          web, enb, rstb, clkb: in std_logic;
79
          addrb: in std_logic_vector(11 downto 0);
80
          dib: in std_logic_vector(0 downto 0);
81
          dob: out std_logic_vector(0 downto 0));
82
  end component;
83
 
84
 
85
  type ram_type is array ((2**adr_width)-1 downto 0) of std_logic_vector (data_width-1 downto 0);
86
  signal RAM : ram_type;
87
  signal read_adr: std_logic_vector(adr_width-1 downto 0); -- mem address
88
  signal zero: std_logic_vector(data_width-1 downto 0);
89
begin
90
----------------------------------------------
91
-- single clock section
92
g_clk0: if two_clocks=0 generate
93
 process (clkb)
94
  begin
95
        if (clkb'event and clkb = '1') then
96
                if (wea = '1') then
97
                        RAM(conv_integer(addra)) <= dia;
98
                end if;
99
                read_adr<= addrb;
100
        end if;
101
 end process;
102
  dob <= RAM( conv_integer(read_adr) );
103
end generate;
104
 
105
---------------------------------------------
106
-- double clock section
107
 zero<= (others=> '0');
108
 
109
g16: if two_clocks>0 and data_width=16 generate
110
          ram16: ramb4_S16_S16
111
            port map (wea=>wea, ena=>'1', rsta=>'0', clka=>clka,
112
                        addra=> addra, dia=>dia, doa=> open,
113
                web=>'0', enb=>'1', rstb=>'0', clkb=>clkb,
114
                addrb=> addrb, dib=> zero, dob=> dob);
115
  end generate;
116
g8: if two_clocks>0 and data_width=8 generate
117
          ram8: ramb4_S8_S8
118
            port map (wea=>wea, ena=>'1', rsta=>'0', clka=>clka,
119
                        addra=> addra, dia=>dia, doa=> open,
120
                web=>'0', enb=>'1', rstb=>'0', clkb=>clkb,
121
                addrb=> addrb, dib=> zero, dob=> dob);
122
  end generate;
123
g4: if two_clocks>0 and data_width=4 generate
124
          ram4: ramb4_S4_S4
125
            port map (wea=>wea, ena=>'1', rsta=>'0', clka=>clka,
126
                        addra=> addra, dia=>dia, doa=> open,
127
                web=>'0', enb=>'1', rstb=>'0', clkb=>clkb,
128
                addrb=> addrb, dib=> zero, dob=> dob);
129
  end generate;
130
g2: if two_clocks>0 and data_width=2 generate
131
          ram8: ramb4_S2_S2
132
            port map (wea=>wea, ena=>'1', rsta=>'0', clka=>clka,
133
                        addra=> addra, dia=>dia, doa=> open,
134
                web=>'0', enb=>'1', rstb=>'0', clkb=>clkb,
135
                addrb=> addrb, dib=> zero, dob=> dob);
136
  end generate;
137
g1: if two_clocks>0 and data_width=1 generate
138
          ram8: ramb4_S1_S1
139
            port map (wea=>wea, ena=>'1', rsta=>'0', clka=>clka,
140
                        addra=> addra, dia=>dia, doa=> open,
141
                web=>'0', enb=>'1', rstb=>'0', clkb=>clkb,
142
                addrb=> addrb, dib=> zero, dob=> dob);
143
  end generate;
144
 
145
 
146
end la_bram_arch;

powered by: WebSVN 2.1.0

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