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

Subversion Repositories eus100lx

[/] [eus100lx/] [trunk/] [fpga/] [distram_be/] [distram_be.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 freza
-- Copyright (C) 2004 DSP&FPGA
2
-- Author: SaVa <s.valach@dspfpga.com>
3
--
4
-- This program is free software; you can redistribute it and/or
5
-- modify it under the terms of the OpenIPCore Hardware General Public
6
-- License as published by the OpenIPCore Organization; either version
7
-- 0.20-15092000 of the License, or (at your option) any later version.
8
--
9
-- This program is distributed in the hope that it will be useful, but
10
-- WITHOUT ANY WARRANTY; without even the implied warranty of
11
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
-- OpenIPCore Hardware General Public License for more details.
13
--
14
-- You should have received a copy of the OpenIPCore Hardware Public
15
-- License along with this program; if not, download it from
16
-- OpenCores.org (http://www.opencores.org/OIPC/OHGPL.shtml).
17
 
18
 
19
library IEEE;
20
use IEEE.STD_LOGIC_1164.ALL;
21
use IEEE.STD_LOGIC_ARITH.ALL;
22
use IEEE.STD_LOGIC_UNSIGNED.ALL;
23
 
24
-- synthesis translate_off 
25
library unisim;
26
use unisim.vcomponents.all;
27
-- synthesis translate_on 
28
 
29
Entity eus_100lx is
30
Generic(
31
      E_DATA_WIDTH   : integer :=   32);
32
Port(
33
      SDRCLKF        : in     std_logic;                       -- Etrax clocks (50MHz)
34
      RESET          : in     std_logic;                       -- Global reset
35
-- ETRAX Bus
36
      DREQ0          : out    std_logic;                       -- DMA Request (Active high)
37
      DACK0          : in     std_logic;                       -- DMA ACK (Active high)
38
      IRQ            : out    std_logic;                       -- Active low
39
--- Bus signals
40
      D              : inout  std_logic_vector(E_DATA_WIDTH - 1 downto 0);
41
      A              : in     std_logic_vector(22 downto 2);
42
      CSR0           : in     std_logic;                       -- FPGA Programming
43
      CSR1           : in     std_logic;                       -- LCD Data channel
44
      CSP0           : in     std_logic;                       -- Internal Registers, control and status
45
      CSP4           : in     std_logic;                       -- Reserved
46
      RD             : in     std_logic;                       -- Etrax reads
47
      WR             : in     std_logic_vector(3 downto 0);    -- Etrax writes
48
-- USERIOs
49
      LEDX           : out    std_logic_vector(1 downto 0);    -- Leds
50
      X              : inout  std_logic_vector(87 downto 0);   -- Generic IOs
51
      ISAEN          : out    std_logic;                       -- 
52
-- LCD Outputs   / Generic In/Out 
53
      Y              : out      std_logic_vector(28 downto 0);
54
-- Dedicated SDRAM
55
      SD             : inout  std_logic_vector(15 downto 0);   -- Data Bus
56
      SA             : out    std_logic_vector(0 to 14);       -- Address and BA signals
57
      SRAS           : out    std_logic;                       -- SDRAM ras
58
      SCAS           : out    std_logic;                       -- SDRAM cas
59
      SCS            : out    std_logic;
60
      SCLK           : out    std_logic;
61
      SCKE           : out    std_logic;
62
      SDQMH          : out    std_logic;
63
      SDQML          : out    std_logic;
64
      SWE            : out    std_logic);
65
 
66
end eus_100lx;
67
 
68
architecture behav of eus_100lx is
69
 
70
-- Components Declarations
71
 
72
-- Clocks distribution
73
 
74
Component CLK_GEN
75
Generic (
76
      ACTIVE_RST     : std_logic := '1';
77
      CLK_M_RATIO    : integer := 2;
78
      CLK_D_RATIO    : integer := 2;
79
      CLK_DIV_RATIO  : real := 10.0;         -- LCD divider
80
      POWER_UP_T     : integer := 20         -- Clk numbers - should be 200ms, for sim is shorter 
81
      );
82
Port (
83
-- Clocks & Resets
84
      CLK_IN      : in     std_logic;
85
      CLK_FB      : in     std_logic;
86
      RESET_IN    : in     std_logic;
87
      RESET_OUT   : out    std_logic;
88
      CLK         : out    std_logic;        -- System Clock
89
      SD_CLK_I    : out    std_logic;        -- Internal SDRAM Clock
90
      SD_CLK      : out    std_logic;        -- SDRAM Clock     
91
      LCD_CLK_I   : out    std_logic;        -- Internal Clock for LCD controller, usually CLK divided by 16 - see M/D ratio 
92
      POWER_UP    : out    std_logic         -- SDRAM Initial time after stable CLK
93
);
94
End Component;
95
 
96
component RAM64X1S
97
-- User can add initialization values
98
  port (
99
        D    : in std_logic;
100
        WE   : in std_logic;
101
        WCLK : in std_logic;
102
        A0   : in std_logic;
103
        A1   : in std_logic;
104
        A2   : in std_logic;
105
        A3   : in std_logic;
106
        A4   : in std_logic;
107
        A5   : in std_logic;
108
        O    : out std_logic
109
   );
110
end component;
111
 
112
constant dist_ram_wd : integer := E_DATA_WIDTH;
113
constant num_be      : integer := 4;         -- Number of BE
114
 
115
-- LOW/HIGH definition
116
signal low           : std_logic := '0';
117
signal high          : std_logic := '1';
118
 
119
-- SDRCLKF_internal
120
signal sdrclkf_i     : std_logic;
121
signal lcd_clk_i     : std_logic;
122
signal rst           : std_logic;
123
signal dreq0_i       : std_logic;
124
 
125
-- Sampled signals by SDRCLKF
126
signal d_in          : std_logic_vector(E_DATA_WIDTH - 1 downto 0);
127
signal a_i           : std_logic_vector(22 downto 2);
128
signal csr0_i        : std_logic := '0';
129
signal csr1_i        : std_logic := '0';
130
signal csp0_i        : std_logic := '0';
131
signal csp4_i        : std_logic := '0';
132
signal rd_i          : std_logic := '0';
133
signal wr_i          : std_logic_vector(3 downto 0) := "0000";
134
signal dack0_i       : std_logic := '0';
135
 
136
-- Access control - active high
137
signal sel_wr_0      : std_logic;
138
signal sel_wr_1      : std_logic;
139
signal sel_wr_2      : std_logic;
140
 
141
signal csp0_rd       : std_logic;
142
signal sel_rd_0      : std_logic;
143
signal sel_rd_1      : std_logic;
144
signal sel_rd_2      : std_logic;
145
 
146
-- Control Section
147
signal reg_0         : std_logic_vector(31 downto 0) := x"11111111";                -- Defaul values
148
signal reg_1         : std_logic_vector(31 downto 0) := x"22222222";
149
signal reg_2         : std_logic_vector(31 downto 0) := x"33333333";
150
 
151
signal sys_cnt         : std_logic_vector(31 downto 0) := (Others => '0');
152
 
153
signal d_out         : std_logic_vector(31 downto 0);
154
signal dist_d_out    : std_logic_vector(31 downto 0);
155
 
156
signal led_blink_cnt   : std_logic_vector(22 downto 0);
157
 
158
signal dist_ram_we   : std_logic_vector(num_be - 1 downto 0);
159
 
160
BEGIN
161
 
162
-- XX_OFUB workaround ISE7.1
163
DREQ0    <= 'Z';
164
IRQ      <= 'Z';
165
X        <= (Others => 'Z');
166
Y        <= (Others => 'Z');
167
SD       <= (Others => 'Z');
168
SA       <= (Others => 'Z');
169
SRAS     <= 'Z';
170
SCAS     <= 'Z';
171
SCS      <= 'Z';
172
SCLK     <= 'Z';
173
SCKE     <= 'Z';
174
SDQMH    <= 'Z';
175
SDQML    <= 'Z';
176
SWE      <= 'Z';
177
 
178
-- Windows size for write are 64kB
179
sel_wr_0 <= '1' When (csp0_i = '0') And (a_i(22 downto 16) = "0000000") Else '0';      -- Base Address = CSP0 + 0x00000   
180
sel_wr_1 <= '1' When (csp0_i = '0') And (a_i(22 downto 16) = "0000001") Else '0';      -- Base Address = CSP0 + 0x10000
181
sel_wr_2 <= '1' When (csp0_i = '0') And (a_i(22 downto 16) = "0000010") Else '0';      -- Base Address = CSP0 + 0x20000
182
 
183
-- Selectors without resample - used for dir control read/write
184
csp0_rd <= '1' When (CSP0 = '0') And (RD = '0') Else '0';                              -- Read selector for CSP0
185
--Windows size for read are 64kB
186
sel_rd_0 <= '1' When (csp0_rd = '1') And (A(22 downto 16) = "0000000") Else '0';       -- Base Address = CSP0 + 0x00000
187
sel_rd_1 <= '1' When (csp0_rd = '1') And (A(22 downto 16) = "0000001") Else '0';       -- Base Address = CSP0 + 0x10000
188
sel_rd_2 <= '1' When (csp0_rd = '1') And (A(22 downto 16) = "0000010") Else '0';       -- Base Address = CSP0 + 0x20000
189
 
190
-- Components mapping    
191
CLK_GENERATION : CLK_GEN
192
Port map(
193
         CLK_IN      => SDRCLKF,             -- Etrax's Clock (50MHz)
194
         CLK_FB      => low,                 -- SDRAM Feadback
195
         RESET_IN    => low,                 -- Global reset
196
         RESET_OUT   => rst,
197
         CLK         => sdrclkf_i,           -- Internal system Clock
198
         SD_CLK_I    => open,                -- Internal SDRAM Clock
199
         SD_CLK      => open,                -- SDRAM Clock     
200
         LCD_CLK_I   => lcd_clk_i,           -- Internal Clock for LCD controller, usually CLK divided by 8 see divide ratio 
201
         POWER_UP    => open                 -- SDRAM Initial time after stable CLK
202
);
203
 
204
 
205
-- write enables
206
dist_ram_we(num_be - 1 downto 0) <= Not WR(num_be - 1 downto 0) When (CSP0 = '0') And (A(22 downto 16) = "0000010") Else (Others => '0');       -- Base Address = CSP0 + 0x20000
207
 
208
MY_RAM: for i in 0 to dist_ram_wd - 1 generate
209
   MY_RAM_EL: RAM64X1S
210
     port map (
211
      D      => D(i),            -- insert input signal 
212
      WE     => dist_ram_we(i/8),-- insert Write Enable signal
213
      WCLK   => sdrclkf_i,       -- insert Write Clock signal
214
      A0     => A(2),            -- insert Address 0 signal
215
      A1     => A(3),            -- insert Address 1 signal
216
      A2     => A(4),            -- insert Address 2 signal
217
      A3     => A(5),            -- insert Address 3 signal
218
      A4     => A(7),            -- insert Address 4 signal
219
      A5     => A(8),            -- insert Address 5 signal
220
      O      => dist_d_out(i)    -- insert output signal
221
      );
222
end generate; -- MY_RAM
223
 
224
RESAMPLE_IN : PROCESS(sdrclkf_i, D, A, CSR0, CSR1, CSP0, CSP4, RD, WR, DACK0)
225
BEGIN
226
   If sdrclkf_i'event And sdrclkf_i = '1' Then
227
      d_in <= D;
228
      a_i <= A;
229
      csr0_i <= CSR0;
230
      csr1_i <= CSR1;
231
      csp0_i <= CSP0;
232
      csp4_i <= CSP4;
233
      rd_i <= RD;
234
      wr_i <= WR;
235
      dack0_i <= DACK0;
236
   End If;
237
END PROCESS;
238
 
239
PROCESS(sdrclkf_i)
240
BEGIN
241
   If sdrclkf_i'event And sdrclkf_i = '1' Then
242
      If (sel_wr_0 = '1') And (wr_i(3) = '0') Then
243
         Case a_i(15 downto 2) is
244
            When "00000000000000" =>
245
               reg_0 <= d_in;
246
            When "00000000000001" =>
247
               reg_1 <= d_in;
248
            When "00000000000010" =>
249
               reg_2 <= d_in;
250
            When Others => NULL;
251
         End Case;
252
      End If;
253
   End If;
254
END PROCESS;
255
 
256
d_out <= reg_0 When A(15 downto 2) = "00000000000000" Else
257
         reg_1 When A(15 downto 2) = "00000000000001" Else
258
         reg_2;
259
 
260
D <= d_out When sel_rd_0 = '1' Else
261
     sys_cnt When sel_rd_1 = '1' Else
262
     dist_d_out When sel_rd_2 = '1' Else
263
     (Others => 'Z');
264
 
265
 
266
ISAEN <= '1'; -- Enable "ISA ios"
267
 
268
LED_BLINK: PROCESS(sdrclkf_i, led_blink_cnt)
269
BEGIN
270
   If sdrclkf_i'event And sdrclkf_i = '1' Then
271
      led_blink_cnt <= led_blink_cnt + 1;
272
   End If;
273
END PROCESS;
274
 
275
PROCESS(sdrclkf_i)
276
BEGIN
277
   If sdrclkf_i'event And sdrclkf_i = '1' Then
278
      sys_cnt <= sys_cnt + 1;
279
   End If;
280
END PROCESS;
281
 
282
LEDX <= Not (led_blink_cnt(led_blink_cnt'high) & reg_0(0));
283
 
284
end behav;

powered by: WebSVN 2.1.0

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