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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [wishbone/] [block_test_generate/] [block_generate_wb_config_slave.vhd] - Blame information for rev 29

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
----------------------------------------------------------------------------------
2
-- Company:         ;)
3
-- Engineer:        Kuzmi4
4
-- 
5
-- Create Date:     17:40:25 05/21/2010 
6
-- Design Name:     
7
-- Module Name:     block_generate_wb_config_slave - rtl 
8
-- Project Name:    DS_DMA
9
-- Target Devices:  any
10
-- Tool versions:   
11
-- Description:     
12
--                  
13
--                  For now we have such restrictions for WB component:
14
--                      1) no WB_RTY support
15
--                      2) WB_ERR arize only at event detection and fall after it goes.
16
--                      3) Operate with Single 64bit WB Transfers. NO WB BURSTs.
17
--                      4) (TBD)...
18
--                  
19
--                   WB_SLAVE MM (ONLY 256B range):
20
--                  1) CONSTANTs:
21
--                  ADDR=x00 - BLOCK_ID
22
--                  ADDR=x08 - BLOCK_VER
23
--                  ADDR=x10 - RSVD (CONSTANTs)
24
--                  ADDR=x18 - RSVD (CONSTANTs)
25
--                  ADDR=x20 - RSVD (CONSTANTs)
26
--                  ADDR=x28 - RSVD (CONSTANTs)
27
--                  ADDR=x30 - RSVD (CONSTANTs)
28
--                  ADDR=x38 - RSVD (CONSTANTs)
29
--                  2) COMMAND REGs:
30
--                  ADDR=x40 - TEST_GEN_CTRL
31
--                  ADDR=x48 - TEST_GEN_SIZE
32
--                  ADDR=x50 - TEST_GEN_CNT1
33
--                  ADDR=x58 - TEST_GEN_CNT2
34
--                  ADDR=x60 - RSVD (COMMAND REGs)
35
--                  ADDR=x68 - RSVD (COMMAND REGs)
36
--                  ADDR=x70 - RSVD (COMMAND REGs)
37
--                  ADDR=x78 - RSVD (COMMAND REGs)
38
--                  3) STS REGs, etc:
39 29 dsmv
--                  ADDR=x80 - TEST_GEN_STATUS
40
--                                      ADDR=x88 - TEST_GEN_BL_WR
41
--                                      ADDR=x90 - 0xAAAAAAAA
42
--                  ADDR=x98 - RSVD (STS REGs, etc)
43 2 dsmv
--                  ....
44
--                  ADDR=xFF - RSVD (STS REGs, etc)
45
--                  
46
--                  
47
--
48
-- Revision: 
49
-- Revision 0.01 - File Created,
50
--                  2do: for now ADD MemoryMap looks good, but maybe its quite diff from REAL SITUATION --> CHECK/FIX MM later!!!
51
-- Revision 0.02 - upd WB_ERR func.
52
-- Revision 0.03 - fix MM (8cell allign).
53
--
54
----------------------------------------------------------------------------------
55
library IEEE;
56
use IEEE.STD_LOGIC_1164.ALL;
57
 
58
package block_generate_wb_config_slave_pkg is
59
 
60
component block_generate_wb_config_slave is
61
generic
62
(
63
    BLOCK_ID   : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля
64
    BLOCK_VER  : in std_logic_vector( 15 downto 0 ):=x"0000"  -- версия модуля
65
);
66
port
67
(
68
    --
69
    -- SYS_CON
70
    i_clk : in  STD_LOGIC;
71
    i_rst : in  STD_LOGIC;
72
    --
73
    -- WB CFG SLAVE
74
    iv_wbs_cfg_addr     :   in  std_logic_vector(  7 downto 0 );
75
    iv_wbs_cfg_data     :   in  std_logic_vector( 63 downto 0 );
76
    iv_wbs_cfg_sel      :   in  std_logic_vector(  7 downto 0 );    -- wor now, we NC this wires
77
    i_wbs_cfg_we        :   in  std_logic;
78
    i_wbs_cfg_cyc       :   in  std_logic;
79
    i_wbs_cfg_stb       :   in  std_logic;
80
    iv_wbs_cfg_cti      :   in  std_logic_vector(  2 downto 0 );
81
    iv_wbs_cfg_bte      :   in  std_logic_vector(  1 downto 0 );
82
 
83
    ov_wbs_cfg_data     :   out std_logic_vector( 63 downto 0 );
84
    o_wbs_cfg_ack       :   out std_logic;
85
    o_wbs_cfg_err       :   out std_logic;
86
    o_wbs_cfg_rty       :   out std_logic;
87
    --
88
    -- CONTROL Outputs
89
    ov_test_gen_ctrl    :   out std_logic_vector( 15 downto 0 );
90
    ov_test_gen_size    :   out std_logic_vector( 15 downto 0 );
91
    ov_test_gen_cnt1    :   out std_logic_vector( 15 downto 0 );
92
    ov_test_gen_cnt2    :   out std_logic_vector( 15 downto 0 );
93
    --
94 29 dsmv
    -- STATUS Input                
95
        iv_test_gen_status      :       in  std_logic_vector( 31 downto 0 );
96 2 dsmv
    iv_test_gen_bl_wr   :   in  std_logic_vector( 31 downto 0 )
97
);
98
end component block_generate_wb_config_slave;
99
 
100
end package block_generate_wb_config_slave_pkg;
101
----------------------------------------------------------------------------------
102
library IEEE;
103
use IEEE.STD_LOGIC_1164.ALL;
104
use IEEE.STD_LOGIC_ARITH.ALL;
105
use IEEE.STD_LOGIC_UNSIGNED.ALL;
106
 
107
library work;
108
use work.ctrl_ram16_v1_pkg.all;
109
use work.host_pkg.all;
110
 
111
entity block_generate_wb_config_slave is
112
generic
113
(
114
    BLOCK_ID   : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля
115
    BLOCK_VER  : in std_logic_vector( 15 downto 0 ):=x"0000"  -- версия модуля
116
);
117
port
118
(
119
    --
120
    -- SYS_CON
121
    i_clk : in  STD_LOGIC;
122
    i_rst : in  STD_LOGIC;
123
    --
124
    -- WB CFG SLAVE
125
    iv_wbs_cfg_addr     :   in  std_logic_vector(  7 downto 0 );
126
    iv_wbs_cfg_data     :   in  std_logic_vector( 63 downto 0 );
127
    iv_wbs_cfg_sel      :   in  std_logic_vector(  7 downto 0 );    -- wor now, we NC this wires
128
    i_wbs_cfg_we        :   in  std_logic;
129
    i_wbs_cfg_cyc       :   in  std_logic;
130
    i_wbs_cfg_stb       :   in  std_logic;
131
    iv_wbs_cfg_cti      :   in  std_logic_vector(  2 downto 0 );
132
    iv_wbs_cfg_bte      :   in  std_logic_vector(  1 downto 0 );
133
 
134
    ov_wbs_cfg_data     :   out std_logic_vector( 63 downto 0 );
135
    o_wbs_cfg_ack       :   out std_logic;
136
    o_wbs_cfg_err       :   out std_logic;
137
    o_wbs_cfg_rty       :   out std_logic;
138
    --
139
    -- CONTROL Outputs
140
    ov_test_gen_ctrl    :   out std_logic_vector( 15 downto 0 );
141
    ov_test_gen_size    :   out std_logic_vector( 15 downto 0 );
142
    ov_test_gen_cnt1    :   out std_logic_vector( 15 downto 0 );
143
    ov_test_gen_cnt2    :   out std_logic_vector( 15 downto 0 );
144
    --
145 29 dsmv
    -- STATUS Input                                                                       
146
        iv_test_gen_status      :       in  std_logic_vector( 31 downto 0 );
147 2 dsmv
    iv_test_gen_bl_wr   :   in  std_logic_vector( 31 downto 0 )
148
);
149
end block_generate_wb_config_slave;
150
 
151
architecture rtl of block_generate_wb_config_slave is
152
----------------------------------------------------------------------------------
153
--
154
-- Define CONSTANTs
155
constant    ct_bl_rom   :   bh_rom:=(
156
                                        0=> BLOCK_ID,   -- 
157
                                        1=> BLOCK_VER,  -- 
158
                                        2=> x"5504",    -- 2=> Device_ID,
159
                                        3=> x"0210",    -- 3=> Revision,
160
                                        4=> x"0104",    -- 4=> PLD_VER,  
161
                                        5=> x"0000",
162
                                        6=> x"0000",
163
                                        7=> x"0000"
164
                                    );
165
--
166
-- Define BL_RAM stuff:
167
signal  sv_bl_ram_adr       :   std_logic_vector( 4 downto 0):= (others => '0');
168
signal  sv_bl_ram_data_in   :   std_logic_vector(15 downto 0):= (others => '0');
169
signal  sv_bl_ram_data_out  :   std_logic_vector(15 downto 0):= (others => '0');
170
signal  s_bl_ram_data_we    :   std_logic:= '0';
171
--
172
-- DEFINE WB_FSM (required for build correct WB_ACK) stuff:
173
signal  sv_wbs_cfg_ack_counter  :   std_logic:='0';
174
--
175
-- Define additional WB signals:
176
signal  s_wbs_active_wr     :   std_logic;
177
signal  s_wbs_active_rd     :   std_logic;
178
signal  s_wbs_active        :   std_logic;
179
signal  s_wbs_wr_ena        :   std_logic;
180
----------------------------------------------------------------------------------
181
begin
182
----------------------------------------------------------------------------------
183
--
184
-- WB ACTIVE/ENA flag (for RD/WR and for any WB activity)
185
--
186
s_wbs_active_wr <= '1' when (
187
                                i_wbs_cfg_cyc='1' and i_wbs_cfg_stb='1' and i_wbs_cfg_we='1' and    -- all strobes OK
188
                                (iv_wbs_cfg_cti="000") and (iv_wbs_cfg_bte="00")                    -- type of transfer OK
189
                            ) else '0';
190
 
191
s_wbs_active_rd <= '1' when (
192
                                i_wbs_cfg_cyc='1' and i_wbs_cfg_stb='1' and i_wbs_cfg_we='0' and
193
                                (iv_wbs_cfg_cti="000") and (iv_wbs_cfg_bte="00")
194
                            ) else '0';
195
 
196
s_wbs_active    <= '1' when (
197
                                i_wbs_cfg_cyc='1' and i_wbs_cfg_stb='1'                      and
198
                                (iv_wbs_cfg_cti="000") and (iv_wbs_cfg_bte="00")
199
                            ) else '0';
200
 
201
s_wbs_wr_ena    <= '1' when (
202
                                s_wbs_active_wr='1'             and     -- have ACTIVE WR flag
203
                                (sv_wbs_cfg_ack_counter='1')            -- present WB_ACK source
204
                            ) else '0';
205
----------------------------------------------------------------------------------
206
--
207
-- WB Write process
208
--
209
WB_WRITE    :   process (i_clk, i_rst)
210
    begin
211
        if (i_rst='1') then             -- RST
212
            ov_test_gen_ctrl <= (others => '0');
213
            ov_test_gen_size <= (others => '0');
214
            ov_test_gen_cnt1 <= (others => '0');
215
            ov_test_gen_cnt2 <= (others => '0');
216
        elsif (rising_edge(i_clk)) then -- WRK
217
            if (s_wbs_wr_ena='1') then
218
                case(iv_wbs_cfg_addr(7 downto 0)) is
219
                    when x"40"  => ov_test_gen_ctrl <= iv_wbs_cfg_data( 15 downto 0);
220
                    when x"48"  => ov_test_gen_size <= iv_wbs_cfg_data( 15 downto 0);
221
                    when x"50"  => ov_test_gen_cnt1 <= iv_wbs_cfg_data( 15 downto 0);
222
                    when x"58"  => ov_test_gen_cnt2 <= iv_wbs_cfg_data( 15 downto 0);
223
                    when others => null;
224
                end case;
225
            end if;
226
        end if;
227
end process WB_WRITE;
228
----------------------------------------------------------------------------------
229
--
230
-- WB Read process
231
--
232 29 dsmv
--WB_READ     :   process (i_clk, i_rst)
233
--    begin
234
--        if (i_rst='1') then             -- RST
235
--            ov_wbs_cfg_data <= (others => '0');
236
--        elsif (rising_edge(i_clk)) then -- WRK
237
--            if (s_wbs_active_rd='1') then
238
--                case(iv_wbs_cfg_addr(7 downto 0)) is
239
--                    -- STS MM region
240
--                    when x"80"  => ov_wbs_cfg_data(31 downto 0) <= iv_test_gen_status;
241
--                    when x"88"  => ov_wbs_cfg_data(31 downto 0) <= iv_test_gen_bl_wr;
242
--                                      when x"90" | x"98" | x"A0" | x"A" | x"86" | x"87" | x"88"
243
--                                      when x"89" | x"8A" | x"8B" | x"8C" | x"8D" | x"8E" | x"8F"
244
--                    -- BL_RAM MM region
245
--                    when others => ov_wbs_cfg_data(15 downto 0) <= sv_bl_ram_data_out;
246
--                end case;
247
--            end if;
248
--        end if;
249
--end process WB_READ;
250
 
251
WB_READ: process( iv_test_gen_status, iv_test_gen_bl_wr, iv_wbs_cfg_addr  ) begin
252
        if(  iv_wbs_cfg_addr(7)='0' ) then
253
                ov_wbs_cfg_data <= x"000000000000" & sv_bl_ram_data_out;
254
        else
255
                case( iv_wbs_cfg_addr( 6 downto 3 ) ) is
256
                        when "0000" => ov_wbs_cfg_data <= x"00000000" & iv_test_gen_status;
257
                        when "0001" => ov_wbs_cfg_data <= x"00000000" & iv_test_gen_bl_wr;
258
                        when "0010" => ov_wbs_cfg_data <= x"00000000" & x"AAAAAAAA";
259
                        when others => ov_wbs_cfg_data <= (others=>'0');
260
                end case;
261
        end if;
262
end process;
263 2 dsmv
----------------------------------------------------------------------------------
264
--
265
-- WB ACK process
266
--
267
WB_ACK_CNT  :   process (i_clk, i_rst)
268
    begin
269
        if (i_rst='1') then             -- RST
270
            sv_wbs_cfg_ack_counter <= '0';
271
        elsif (rising_edge(i_clk)) then -- WRK:
272
            if (s_wbs_active='1') then  -- WB Transfer in progress
273
                --sv_wbs_cfg_ack_counter <= sv_wbs_cfg_ack_counter + '1';
274
                if (sv_wbs_cfg_ack_counter='0') then
275
                    sv_wbs_cfg_ack_counter <= '1';
276
                else
277
                    sv_wbs_cfg_ack_counter <= '0';
278
                end if;
279
            else                        -- no WB Transfer
280
                sv_wbs_cfg_ack_counter <= '0';
281
            end if;
282
        end if;
283
end process WB_ACK_CNT;
284
-- Define WB_ACK
285
o_wbs_cfg_ack <= '1' when   (
286
                                sv_wbs_cfg_ack_counter='1' and
287
                                i_wbs_cfg_cyc='1' and i_wbs_cfg_stb='1' -- add controls for avoid problems in anarranged transfers
288
                            ) else '0';
289
----------------------------------------------------------------------------------
290
--
291
-- Instaniate BL_RAM (contain CONSTANTs and RD values for COMMAND registers)
292
--
293
BL_RAM  :   ctrl_ram16_v1
294
generic map
295
(
296
    rom         => ct_bl_rom            -- значения констант
297
)
298
port map
299
(
300
    clk         => i_clk,               -- Тактовая частота
301
 
302
    adr         => sv_bl_ram_adr,       -- адрес 
303
    data_in     => sv_bl_ram_data_in,   -- вход данных
304
    data_out    => sv_bl_ram_data_out,  -- выход данных
305
 
306
    data_we     => s_bl_ram_data_we     -- 1 - запись данных
307
);
308
-- Define BL_RAM ADDR
309
sv_bl_ram_adr       <= iv_wbs_cfg_addr( 7 downto 3);    -- 8B granularity Transfers (cut [2:0] addr bits)
310
-- DEFINE BL_RAM DATA_IN
311
sv_bl_ram_data_in   <= iv_wbs_cfg_data(15 downto 0);    -- Cut only LS 16bit
312
-- DEFINE BL_RAM DATA_WRITE
313
s_bl_ram_data_we    <= s_wbs_wr_ena;                    -- WB_WE signal is OK
314
----------------------------------------------------------------------------------
315
--
316
-- MODULE OUTPUTs routing:
317
--
318
-- WB_ERR deal
319
o_wbs_cfg_err   <= '1' when (
320
                                i_wbs_cfg_cyc='1' and i_wbs_cfg_stb='1' and             -- all strobes OK
321
                                ( (iv_wbs_cfg_cti/="000") or (iv_wbs_cfg_bte/="00") )   -- BUT type of transfer is NOT OK
322
                            ) else '0';
323
-- WB_RTY deal
324
o_wbs_cfg_rty   <= '0'; -- nothing to report for now
325
----------------------------------------------------------------------------------
326
end rtl;
327
 

powered by: WebSVN 2.1.0

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