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

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [digital_core/] [src/] [digital_core.sv] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 20 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Digital core                                                ////
4
////                                                              ////
5
////  This file is part of the YIFive cores project               ////
6
////  http://www.opencores.org/cores/yifive/                      ////
7
////                                                              ////
8
////  Description                                                 ////
9
////      This is digital core and integrate all the main block   ////
10
////      here.  Following block are integrated here              ////
11
////      1. Risc V Core                                          ////
12
////      2. SPI Master                                           ////
13
////      3. Wishbone Cross Bar                                   ////
14
////                                                              ////
15
////  To Do:                                                      ////
16
////    nothing                                                   ////
17
////                                                              ////
18
////  Author(s):                                                  ////
19
////      - Dinesh Annayya, dinesha@opencores.org                 ////
20
////                                                              ////
21
////  Revision :                                                  ////
22
////    0.1 - 16th Feb 2021, Dinesh A                             ////
23
////          Initial integration with Risc-V core +              ////
24
////          Wishbone Cross Bar + SPI  Master                    ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27
////                                                              ////
28
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
29
////                                                              ////
30
//// This source file may be used and distributed without         ////
31
//// restriction provided that this copyright statement is not    ////
32
//// removed from the file and that any derivative work contains  ////
33
//// the original copyright notice and the associated disclaimer. ////
34
////                                                              ////
35
//// This source file is free software; you can redistribute it   ////
36
//// and/or modify it under the terms of the GNU Lesser General   ////
37
//// Public License as published by the Free Software Foundation; ////
38
//// either version 2.1 of the License, or (at your option) any   ////
39
//// later version.                                               ////
40
////                                                              ////
41
//// This source is distributed in the hope that it will be       ////
42
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
43
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
44
//// PURPOSE.  See the GNU Lesser General Public License for more ////
45
//// details.                                                     ////
46
////                                                              ////
47
//// You should have received a copy of the GNU Lesser General    ////
48
//// Public License along with this source; if not, download it   ////
49
//// from http://www.opencores.org/lgpl.shtml                     ////
50
////                                                              ////
51
//////////////////////////////////////////////////////////////////////
52
 
53
`include "scr1_arch_description.svh"
54
`ifdef SCR1_IPIC_EN
55
`include "scr1_ipic.svh"
56
`endif // SCR1_IPIC_EN
57
 
58
`include "sdrc_define.v"
59
module digital_core
60
#(
61
        parameter      SDR_DW   = 8,  // SDR Data Width
62
        parameter      SDR_BW   = 1,  // SDR Byte Width
63
        parameter      WB_WIDTH = 32  // WB ADDRESS/DARA WIDTH
64
 ) (
65 21 dinesha
`ifdef USE_POWER_PINS
66
    inout vdda1,        // User area 1 3.3V supply
67
    inout vdda2,        // User area 2 3.3V supply
68
    inout vssa1,        // User area 1 analog ground
69
    inout vssa2,        // User area 2 analog ground
70
    inout vccd1,        // User area 1 1.8V supply
71
    inout vccd2,        // User area 2 1.8v supply
72
    inout vssd1,        // User area 1 digital ground
73
    inout vssd2,        // User area 2 digital ground
74
`endif
75
    input   logic                       clk             ,  // System clock
76
    input   logic                       rtc_clk         ,  // Real-time clock
77
    input   logic                       rst_n           ,  // Regular Reset signal
78 20 dinesha
 
79 21 dinesha
    input   logic                       wbd_ext_cyc_i   ,  // strobe/request
80
    input   logic                       wbd_ext_stb_i   ,  // strobe/request
81
    input   logic [WB_WIDTH-1:0]        wbd_ext_adr_i   ,  // address
82
    input   logic                       wbd_ext_we_i    ,  // write
83
    input   logic [WB_WIDTH-1:0]        wbd_ext_dat_i   ,  // data output
84
    input   logic [3:0]                 wbd_ext_sel_i   ,  // byte enable
85
    output  logic [WB_WIDTH-1:0]        wbd_ext_dat_o   ,  // data input
86
    output  logic                       wbd_ext_ack_o   ,  // acknowlegement
87
    output  logic                       wbd_ext_err_o   ,  // error
88 20 dinesha
 
89 21 dinesha
 
90
    // Logic Analyzer Signals
91
    input  logic [127:0]                la_data_in      ,
92
    output logic [127:0]                la_data_out     ,
93
    input  logic [127:0]                la_oenb         ,
94
 
95 20 dinesha
 
96 21 dinesha
    // IOs
97
    input  logic  [37:0]                io_in           ,
98
    output logic  [37:0]                io_out          ,
99
    output logic  [37:0]                io_oeb          ,
100 20 dinesha
 
101 21 dinesha
    output logic  [2:0]                 irq
102 20 dinesha
 
103
);
104
 
105
//---------------------------------------------------
106
// Local Parameter Declaration
107
// --------------------------------------------------
108
 
109
 
110
//---------------------------------------------------------------------
111
// Wishbone Risc V Instruction Memory Interface
112
//---------------------------------------------------------------------
113
logic                           wbd_riscv_imem_stb_i; // strobe/request
114
logic   [WB_WIDTH-1:0]          wbd_riscv_imem_adr_i; // address
115
logic                           wbd_riscv_imem_we_i;  // write
116
logic   [WB_WIDTH-1:0]          wbd_riscv_imem_dat_i; // data output
117
logic   [3:0]                   wbd_riscv_imem_sel_i; // byte enable
118
logic   [WB_WIDTH-1:0]          wbd_riscv_imem_dat_o; // data input
119
logic                           wbd_riscv_imem_ack_o; // acknowlegement
120
logic                           wbd_riscv_imem_err_o;  // error
121
 
122
//---------------------------------------------------------------------
123
// RISC V Wishbone Data Memory Interface
124
//---------------------------------------------------------------------
125
logic                           wbd_riscv_dmem_stb_i; // strobe/request
126
logic   [WB_WIDTH-1:0]          wbd_riscv_dmem_adr_i; // address
127
logic                           wbd_riscv_dmem_we_i;  // write
128
logic   [WB_WIDTH-1:0]          wbd_riscv_dmem_dat_i; // data output
129
logic   [3:0]                   wbd_riscv_dmem_sel_i; // byte enable
130
logic   [WB_WIDTH-1:0]          wbd_riscv_dmem_dat_o; // data input
131
logic                           wbd_riscv_dmem_ack_o; // acknowlegement
132
logic                           wbd_riscv_dmem_err_o; // error
133
 
134
//---------------------------------------------------------------------
135
//    SPI Master Wishbone Interface
136
//---------------------------------------------------------------------
137
logic                           wbd_spim_stb_o; // strobe/request
138
logic   [WB_WIDTH-1:0]          wbd_spim_adr_o; // address
139
logic                           wbd_spim_we_o;  // write
140
logic   [WB_WIDTH-1:0]          wbd_spim_dat_o; // data output
141
logic   [3:0]                   wbd_spim_sel_o; // byte enable
142
logic                           wbd_spim_cyc_o ;
143
logic   [WB_WIDTH-1:0]          wbd_spim_dat_i; // data input
144
logic                           wbd_spim_ack_i; // acknowlegement
145
logic                           wbd_spim_err_i;  // error
146
 
147
//---------------------------------------------------------------------
148
//    SPI Master Wishbone Interface
149
//---------------------------------------------------------------------
150
logic                           wbd_sdram_stb_o ;
151 21 dinesha
logic [WB_WIDTH-1:0]            wbd_sdram_adr_o ;
152 20 dinesha
logic                           wbd_sdram_we_o  ; // 1 - Write, 0 - Read
153
logic [WB_WIDTH-1:0]            wbd_sdram_dat_o ;
154
logic [WB_WIDTH/8-1:0]          wbd_sdram_sel_o ; // Byte enable
155
logic                           wbd_sdram_cyc_o ;
156
logic  [2:0]                    wbd_sdram_cti_o ;
157
logic  [WB_WIDTH-1:0]           wbd_sdram_dat_i ;
158
logic                           wbd_sdram_ack_i ;
159
 
160
//---------------------------------------------------------------------
161
//    Global Register Wishbone Interface
162
//---------------------------------------------------------------------
163
logic                           wbd_glbl_stb_o; // strobe/request
164 21 dinesha
logic   [WB_WIDTH-1:0]          wbd_glbl_adr_o; // address
165 20 dinesha
logic                           wbd_glbl_we_o;  // write
166
logic   [WB_WIDTH-1:0]          wbd_glbl_dat_o; // data output
167
logic   [3:0]                   wbd_glbl_sel_o; // byte enable
168
logic                           wbd_glbl_cyc_o ;
169
logic   [WB_WIDTH-1:0]          wbd_glbl_dat_i; // data input
170
logic                           wbd_glbl_ack_i; // acknowlegement
171
logic                           wbd_glbl_err_i;  // error
172 21 dinesha
 
173
 
174
//----------------------------------------------------
175
//  CPU Configuration
176
//----------------------------------------------------
177
logic                              cpu_rst_n     ;
178
logic                              spi_rst_n     ;
179
logic                              sdram_rst_n   ;
180
 
181
logic [31:0]                       fuse_mhartid  ;
182
logic [15:0]                       irq_lines     ;
183
logic                              soft_irq      ;
184
 
185 20 dinesha
//------------------------------------------------
186
// Configuration Parameter
187
//------------------------------------------------
188
logic [1:0]                        cfg_sdr_width       ; // 2'b00 - 32 Bit SDR, 2'b01 - 16 Bit SDR, 2'b1x - 8 Bit
189
logic [1:0]                        cfg_colbits         ; // 2'b00 - 8 Bit column address,
190
logic                              sdr_init_done       ; // Indicate SDRAM Initialisation Done
191
logic [3:0]                        cfg_sdr_tras_d      ; // Active to precharge delay
192
logic [3:0]                        cfg_sdr_trp_d       ; // Precharge to active delay
193
logic [3:0]                        cfg_sdr_trcd_d      ; // Active to R/W delay
194
logic                              cfg_sdr_en          ; // Enable SDRAM controller
195
logic [1:0]                        cfg_req_depth       ; // Maximum Request accepted by SDRAM controller
196
logic [12:0]                       cfg_sdr_mode_reg    ;
197
logic [2:0]                        cfg_sdr_cas         ; // SDRAM CAS Latency
198
logic [3:0]                        cfg_sdr_trcar_d     ; // Auto-refresh period
199
logic [3:0]                        cfg_sdr_twr_d       ; // Write recovery delay
200
logic [`SDR_RFSH_TIMER_W-1 : 0]    cfg_sdr_rfsh        ;
201
logic [`SDR_RFSH_ROW_CNT_W -1 : 0] cfg_sdr_rfmax       ;
202
 
203 21 dinesha
//----------------------------------------------------------------------
204
// Interface to SDRAMs
205
//--------------------------------------------------------------------------
206
logic                              sdr_cke             ;  // SDRAM CKE
207
logic                              sdr_cs_n            ;  // SDRAM Chip Select
208
logic                              sdr_ras_n           ;  // SDRAM ras
209
logic                              sdr_cas_n           ;  // SDRAM cas
210
logic                              sdr_we_n            ;  // SDRAM write enable
211
logic [SDR_BW-1:0]                 sdr_dqm             ;  // SDRAM Data Mask
212
logic [1:0]                        sdr_ba              ;  // SDRAM Bank Enable
213
logic [12:0]                       sdr_addr            ;  // SDRAM Address
214
logic [SDR_DW-1:0]                 pad_sdr_din         ;  // SDRA Data Input
215
logic [SDR_DW-1:0]                 sdr_dout            ;  // SDRA Data output
216
logic [SDR_BW-1:0]                 sdr_den_n           ;  // SDRAM Data Output enable
217
logic                              sdram_clk           ;  // Sdram clock loop back from pad
218
logic                              pad_sdram_clk       ;  // Sdram clock loop back from pad
219
 
220
 
221
assign pad_sdr_din[7:0]      =      io_in[7:0]         ;
222
assign io_out     [7:0]      =      sdr_dout[7:0]      ;
223
assign io_out     [20:8]     =      sdr_addr[12:0]     ;
224
assign io_out     [22:21]    =      sdr_ba[1:0]        ;
225
assign io_out     [23]       =      sdr_dqm[0]         ;
226
assign io_out     [24]       =      sdr_we_n           ;
227
assign io_out     [25]       =      sdr_cas_n          ;
228
assign io_out     [26]       =      sdr_ras_n          ;
229
assign io_out     [27]       =      sdr_cs_n           ;
230
assign io_out     [28]       =      sdr_cke            ;
231
assign io_out     [29]       =      sdram_clk          ;
232
assign pad_sdram_clk         =      io_in[29]          ;
233
 
234
assign io_oeb     [7:0]      =      sdr_den_n         ;
235
assign io_oeb     [20:8]     =      {(13) {1'b0}}      ;
236
assign io_oeb     [22:21]    =      {(2) {1'b0}}       ;
237
assign io_oeb     [23]       =      1'b0               ;
238
assign io_oeb     [24]       =      1'b0               ;
239
assign io_oeb     [25]       =      1'b0               ;
240
assign io_oeb     [26]       =      1'b0               ;
241
assign io_oeb     [27]       =      1'b0               ;
242
assign io_oeb     [28]       =      1'b0               ;
243
assign io_oeb     [29]       =      1'b0               ;
244
 
245
 
246
 
247 20 dinesha
//-----------------------------------------------------------
248
//  SPI I/F
249
//  ////////////////////////////////////////////////////
250
logic                          spim_sdo0               ; // SPI Master Data Out[0]
251
logic                          spim_sdo1               ; // SPI Master Data Out[1]
252
logic                          spim_sdo2               ; // SPI Master Data Out[2]
253
logic                          spim_sdo3               ; // SPI Master Data Out[3]
254
logic                          spim_sdi0               ; // SPI Master Data In[0]
255
logic                          spim_sdi1               ; // SPI Master Data In[1]
256
logic                          spim_sdi2               ; // SPI Master Data In[2]
257
logic                          spim_sdi3               ; // SPI Master Data In[3]
258 21 dinesha
logic                          spim_clk                ;
259
logic                          spim_csn                ;
260
logic                          spi_en_tx               ;
261 20 dinesha
 
262 21 dinesha
assign  spim_sdi0  =  io_in[32];
263
assign  spim_sdi1  =  io_in[33];
264
assign  spim_sdi2  =  io_in[34];
265
assign  spim_sdi3  =  io_in[35];
266
 
267
assign  io_out[30] =  spim_clk;
268
assign  io_out[31] =  spim_csn;
269
assign  io_out[32] =  spim_sdo0;
270
assign  io_out[33] =  spim_sdo1;
271
assign  io_out[34] =  spim_sdo2;
272
assign  io_out[35] =  spim_sdo3;
273 20 dinesha
 
274 21 dinesha
assign  io_oeb[30] =  1'b0;         // spi_clk
275
assign  io_oeb[31] =  1'b0;         // spi_csn
276
assign  io_oeb[32] =  !spi_en_tx;   // spi_dio0
277
assign  io_oeb[33] =  !spi_en_tx;   // spi_dio1
278
assign  io_oeb[34] =  !spi_en_tx;   // spi_dio2
279
assign  io_oeb[35] =  !spi_en_tx;   // spi_dio3
280
 
281
 
282
// for uart
283
assign  io_oeb[36] =  1'b1; // Unused
284
assign  io_oeb[37] =  1'b1; // Unused
285
 
286
 
287
 
288 20 dinesha
//------------------------------------------------------------------------------
289
// RISC V Core instance
290
//------------------------------------------------------------------------------
291
scr1_top_wb u_riscv_top (
292
    // Reset
293 21 dinesha
    .pwrup_rst_n            (rst_n                     ),
294 20 dinesha
    .rst_n                  (rst_n                     ),
295
    .cpu_rst_n              (cpu_rst_n                 ),
296
`ifdef SCR1_DBG_EN
297
    .sys_rst_n_o            (sys_rst_n_o               ),
298
    .sys_rdc_qlfy_o         (sys_rdc_qlfy_o            ),
299
`endif // SCR1_DBG_EN
300
 
301
    // Clock
302
    .clk                    (clk                       ),
303
    .rtc_clk                (rtc_clk                   ),
304
 
305
    // Fuses
306
    .fuse_mhartid           (fuse_mhartid              ),
307
`ifdef SCR1_DBG_EN
308
    .fuse_idcode            (`SCR1_TAP_IDCODE          ),
309
`endif // SCR1_DBG_EN
310
 
311
    // IRQ
312
`ifdef SCR1_IPIC_EN
313 21 dinesha
    .irq_lines              (irq_lines                 ),
314 20 dinesha
`else // SCR1_IPIC_EN
315 21 dinesha
    .ext_irq                (ext_irq                   ), // TODO - Interrupts
316 20 dinesha
`endif // SCR1_IPIC_EN
317 21 dinesha
    .soft_irq               (soft_irq                  ), // TODO - Interrupts
318 20 dinesha
 
319
    // DFT
320
    .test_mode              (1'b0                      ),
321
    .test_rst_n             (1'b1                      ),
322
 
323
`ifdef SCR1_DBG_EN
324
    // JTAG
325
    .trst_n                 (trst_n                    ),
326
    .tck                    (tck                       ),
327
    .tms                    (tms                       ),
328
    .tdi                    (tdi                       ),
329
    .tdo                    (tdo                       ),
330
    .tdo_en                 (tdo_en                    ),
331
`endif // SCR1_DBG_EN
332
 
333
    // Instruction memory interface
334
    .wbd_imem_stb_o         (wbd_riscv_imem_stb_i      ),
335
    .wbd_imem_adr_o         (wbd_riscv_imem_adr_i      ),
336
    .wbd_imem_we_o          (wbd_riscv_imem_we_i       ),
337
    .wbd_imem_dat_o         (wbd_riscv_imem_dat_i      ),
338
    .wbd_imem_sel_o         (wbd_riscv_imem_sel_i      ),
339
    .wbd_imem_dat_i         (wbd_riscv_imem_dat_o      ),
340
    .wbd_imem_ack_i         (wbd_riscv_imem_ack_o      ),
341
    .wbd_imem_err_i         (wbd_riscv_imem_err_o      ),
342
 
343
    // Data memory interface
344
    .wbd_dmem_stb_o         (wbd_riscv_dmem_stb_i      ),
345
    .wbd_dmem_adr_o         (wbd_riscv_dmem_adr_i      ),
346
    .wbd_dmem_we_o          (wbd_riscv_dmem_we_i       ),
347
    .wbd_dmem_dat_o         (wbd_riscv_dmem_dat_i      ),
348
    .wbd_dmem_sel_o         (wbd_riscv_dmem_sel_i      ),
349
    .wbd_dmem_dat_i         (wbd_riscv_dmem_dat_o      ),
350
    .wbd_dmem_ack_i         (wbd_riscv_dmem_ack_o      ),
351
    .wbd_dmem_err_i         (wbd_riscv_dmem_err_o      )
352
);
353
 
354
/*********************************************************
355
* SPI Master
356
* This is an implementation of an SPI master that is controlled via an AXI bus.
357
* It has FIFOs for transmitting and receiving data.
358
* It supports both the normal SPI mode and QPI mode with 4 data lines.
359
* *******************************************************/
360
 
361
spim_top
362
#(
363
`ifndef SYNTHESIS
364
    .WB_WIDTH  (WB_WIDTH)
365
`endif
366
) u_spi_master
367
(
368
    .mclk                   (clk                       ),
369 21 dinesha
    .rst_n                  (spi_rst_n                 ),
370 20 dinesha
 
371
    .wbd_stb_i              (wbd_spim_stb_o            ),
372
    .wbd_adr_i              (wbd_spim_adr_o            ),
373
    .wbd_we_i               (wbd_spim_we_o             ),
374
    .wbd_dat_i              (wbd_spim_dat_o            ),
375
    .wbd_sel_i              (wbd_spim_sel_o            ),
376
    .wbd_dat_o              (wbd_spim_dat_i            ),
377
    .wbd_ack_o              (wbd_spim_ack_i            ),
378
    .wbd_err_o              (wbd_spim_err_i            ),
379
 
380
    .events_o               (                          ), // TODO - Need to connect to intr ?
381
 
382
    .spi_clk                (spim_clk                  ),
383 21 dinesha
    .spi_csn0               (spim_csn                  ),
384
    .spi_csn1               (                          ),
385
    .spi_csn2               (                          ),
386
    .spi_csn3               (                          ),
387
    .spi_mode               (                          ),
388 20 dinesha
    .spi_sdo0               (spim_sdo0                 ),
389
    .spi_sdo1               (spim_sdo1                 ),
390
    .spi_sdo2               (spim_sdo2                 ),
391
    .spi_sdo3               (spim_sdo3                 ),
392
    .spi_sdi0               (spim_sdi0                 ),
393
    .spi_sdi1               (spim_sdi1                 ),
394
    .spi_sdi2               (spim_sdi2                 ),
395
    .spi_sdi3               (spim_sdi3                 ),
396
    .spi_en_tx              (spi_en_tx                 )
397
);
398
 
399
 
400
sdrc_top  #(.APP_AW(WB_WIDTH),
401
            .APP_DW(WB_WIDTH),
402
            .APP_BW(4),
403
            .SDR_DW(8),
404
            .SDR_BW(1))
405
     u_sdram_ctrl (
406
    .cfg_sdr_width          (cfg_sdr_width             ),
407
    .cfg_colbits            (cfg_colbits               ),
408
 
409
    // WB bus
410 21 dinesha
    .wb_rst_i               (!rst_n                    ),
411 20 dinesha
    .wb_clk_i               (clk                       ),
412
 
413
    .wb_stb_i               (wbd_sdram_stb_o            ),
414 21 dinesha
    .wb_addr_i              (wbd_sdram_adr_o            ),
415 20 dinesha
    .wb_we_i                (wbd_sdram_we_o             ),
416
    .wb_dat_i               (wbd_sdram_dat_o            ),
417
    .wb_sel_i               (wbd_sdram_sel_o            ),
418
    .wb_cyc_i               (wbd_sdram_cyc_o            ),
419
    .wb_cti_i               (wbd_sdram_cti_o            ),
420
    .wb_ack_o               (wbd_sdram_ack_i            ),
421
    .wb_dat_o               (wbd_sdram_dat_i            ),
422
 
423
 
424
    /* Interface to SDRAMs */
425
    .sdram_clk              (sdram_clk                 ),
426 21 dinesha
    .sdram_resetn           (sdram_rst_n               ),
427 20 dinesha
    .sdr_cs_n               (sdr_cs_n                  ),
428
    .sdr_cke                (sdr_cke                   ),
429
    .sdr_ras_n              (sdr_ras_n                 ),
430
    .sdr_cas_n              (sdr_cas_n                 ),
431
    .sdr_we_n               (sdr_we_n                  ),
432
    .sdr_dqm                (sdr_dqm                   ),
433
    .sdr_ba                 (sdr_ba                    ),
434
    .sdr_addr               (sdr_addr                  ),
435
    .pad_sdr_din            (pad_sdr_din               ),
436
    .sdr_dout               (sdr_dout                  ),
437
    .sdr_den_n              (sdr_den_n                 ),
438 21 dinesha
    .sdram_pad_clk          (pad_sdram_clk             ),
439 20 dinesha
 
440
    /* Parameters */
441
    .sdr_init_done          (sdr_init_done             ),
442
    .cfg_req_depth          (cfg_req_depth             ), //how many req. buffer should hold
443
    .cfg_sdr_en             (cfg_sdr_en                ),
444
    .cfg_sdr_mode_reg       (cfg_sdr_mode_reg          ),
445
    .cfg_sdr_tras_d         (cfg_sdr_tras_d            ),
446
    .cfg_sdr_trp_d          (cfg_sdr_trp_d             ),
447
    .cfg_sdr_trcd_d         (cfg_sdr_trcd_d            ),
448
    .cfg_sdr_cas            (cfg_sdr_cas               ),
449
    .cfg_sdr_trcar_d        (cfg_sdr_trcar_d           ),
450
    .cfg_sdr_twr_d          (cfg_sdr_twr_d             ),
451
    .cfg_sdr_rfsh           (cfg_sdr_rfsh              ),
452
    .cfg_sdr_rfmax          (cfg_sdr_rfmax             )
453
   );
454
 
455
 
456
//------------------------------
457
// RISC Data Memory Map
458
// 0x0000_0000 to 0x0FFF_FFFF  - SPI FLASH MEMORY
459
// 0x1000_0000 to 0x1000_00FF  - SPI REGISTER
460
// 0x2000_0000 to 0x2FFF_FFFF  - SDRAM
461
// 0x3000_0000 to 0x3000_00FF  - GLOBAL REGISTER
462
//-----------------------------
463
//
464 21 dinesha
wire [3:0] wbd_riscv_imem_tar_id     = (wbd_riscv_imem_adr_i[31:16] == 16'h0000 ) ? 4'b0000 :
465
                                       (wbd_riscv_imem_adr_i[31:16] == 16'h0041 ) ? 4'b0000 :
466
                                       (wbd_riscv_imem_adr_i[31:16] == 16'h0048 ) ? 4'b0001 :// Todo: Temp fix for SDRAM
467
                                       (wbd_riscv_imem_adr_i[31:16] == 16'h3000 ) ? 4'b0010 : 4'b0000;
468 20 dinesha
 
469 21 dinesha
wire [3:0] wbd_riscv_dmem_tar_id     = (wbd_riscv_dmem_adr_i[31:16] == 16'h0000 ) ? 4'b0000 :
470
                                       (wbd_riscv_dmem_adr_i[31:16] == 16'h0041 ) ? 4'b0000 :
471
                                       (wbd_riscv_dmem_adr_i[31:16] == 16'h0048 ) ? 4'b0001 : // todo: Temp fix for SDRAM
472
                                       (wbd_riscv_dmem_adr_i[31:16] == 16'h3000 ) ? 4'b0010 : 4'b0000;
473 20 dinesha
 
474
 
475 21 dinesha
//-------------------------------------------------------------------
476
// EXTERNAL MEMORY MAP
477
// 0x3000_0000 to 0x3000_00FF -  GLOBAL REGISTER
478
// 0x4000_0000 to 0x4FFF_FFFF -  SPI FLASH MEMORY
479
// 0x5000_0000 to 0x5000_00FF -  SPI REGISTER
480
// 0x6000_0000 to 0x6FFF_FFFF -  SDRAM
481
//
482
wire [3:0] wbd_ext_tar_id            = (wbd_ext_adr_i[31:28] == 4'b0100 ) ? 4'b0000 :
483
                                       (wbd_ext_adr_i[31:28] == 4'b0101 ) ? 4'b0000 :
484
                                       (wbd_ext_adr_i[31:28] == 4'b0110 ) ? 4'b0001 :
485
                                       (wbd_ext_adr_i[31:28] == 4'b0011 ) ? 4'b0010 : 4'b0000;
486
wb_interconnect  u_intercon (
487
         .clk_i         (clk),
488
         .rst_n         (rst_n),
489
 
490
         // Master 0 Interface
491
         .m0_wbd_dat_i  (wbd_riscv_imem_dat_i  ),
492
         .m0_wbd_adr_i  (wbd_riscv_imem_adr_i  ),
493
         .m0_wbd_sel_i  (wbd_riscv_imem_sel_i  ),
494
         .m0_wbd_we_i   (wbd_riscv_imem_we_i   ),
495
         .m0_wbd_cyc_i  (wbd_riscv_imem_stb_i  ),
496
         .m0_wbd_stb_i  (wbd_riscv_imem_stb_i  ),
497
         .m0_wbd_tid_i  (wbd_riscv_imem_tar_id ), // target id
498
         .m0_wbd_dat_o  (wbd_riscv_imem_dat_o  ),
499
         .m0_wbd_ack_o  (wbd_riscv_imem_ack_o  ),
500
         .m0_wbd_err_o  (wbd_riscv_imem_err_o  ),
501
 
502
         // Master 1 Interface
503
         .m1_wbd_dat_i  (wbd_riscv_dmem_dat_i  ),
504
         .m1_wbd_adr_i  (wbd_riscv_dmem_adr_i  ),
505
         .m1_wbd_sel_i  (wbd_riscv_dmem_sel_i  ),
506
         .m1_wbd_we_i   (wbd_riscv_dmem_we_i   ),
507
         .m1_wbd_cyc_i  (wbd_riscv_dmem_stb_i  ),
508
         .m1_wbd_stb_i  (wbd_riscv_dmem_stb_i  ),
509
         .m1_wbd_tid_i  (wbd_riscv_dmem_tar_id ), // target id
510
         .m1_wbd_dat_o  (wbd_riscv_dmem_dat_o  ),
511
         .m1_wbd_ack_o  (wbd_riscv_dmem_ack_o  ),
512
         .m1_wbd_err_o  (wbd_riscv_dmem_err_o  ),
513
 
514
         // Master 2 Interface
515
         .m2_wbd_dat_i  (wbd_ext_dat_i  ),
516
         .m2_wbd_adr_i  (wbd_ext_adr_i  ),
517
         .m2_wbd_sel_i  (wbd_ext_sel_i  ),
518
         .m2_wbd_we_i   (wbd_ext_we_i   ),
519
         .m2_wbd_cyc_i  (wbd_ext_cyc_i  ),
520
         .m2_wbd_stb_i  (wbd_ext_stb_i  ),
521
         .m2_wbd_tid_i  (wbd_ext_tar_id ), // target id
522
         .m2_wbd_dat_o  (wbd_ext_dat_o  ),
523
         .m2_wbd_ack_o  (wbd_ext_ack_o  ),
524
         .m2_wbd_err_o  (wbd_ext_err_o  ),
525
 
526
 
527
         // Slave 0 Interface
528
         .s0_wbd_err_i  (1'b0           ),
529
         .s0_wbd_dat_i  (wbd_spim_dat_i ),
530
         .s0_wbd_ack_i  (wbd_spim_ack_i ),
531
         .s0_wbd_dat_o  (wbd_spim_dat_o ),
532
         .s0_wbd_adr_o  (wbd_spim_adr_o ),
533
         .s0_wbd_sel_o  (wbd_spim_sel_o ),
534
         .s0_wbd_we_o   (wbd_spim_we_o  ),
535
         .s0_wbd_cyc_o  (wbd_spim_cyc_o ),
536
         .s0_wbd_stb_o  (wbd_spim_stb_o ),
537
 
538
         // Slave 1 Interface
539
         .s1_wbd_err_i  (1'b0           ),
540
         .s1_wbd_dat_i  (wbd_sdram_dat_i ),
541
         .s1_wbd_ack_i  (wbd_sdram_ack_i ),
542
         .s1_wbd_dat_o  (wbd_sdram_dat_o ),
543
         .s1_wbd_adr_o  (wbd_sdram_adr_o ),
544
         .s1_wbd_sel_o  (wbd_sdram_sel_o ),
545
         .s1_wbd_we_o   (wbd_sdram_we_o  ),
546
         .s1_wbd_cyc_o  (wbd_sdram_cyc_o ),
547
         .s1_wbd_stb_o  (wbd_sdram_stb_o ),
548
 
549
         // Slave 2 Interface
550
         .s2_wbd_err_i  (1'b0           ),
551
         .s2_wbd_dat_i  (wbd_glbl_dat_i ),
552
         .s2_wbd_ack_i  (wbd_glbl_ack_i ),
553
         .s2_wbd_dat_o  (wbd_glbl_dat_o ),
554
         .s2_wbd_adr_o  (wbd_glbl_adr_o ),
555
         .s2_wbd_sel_o  (wbd_glbl_sel_o ),
556
         .s2_wbd_we_o   (wbd_glbl_we_o  ),
557
         .s2_wbd_cyc_o  (wbd_glbl_cyc_o ),
558
         .s2_wbd_stb_o  (wbd_glbl_stb_o )
559
        );
560 20 dinesha
 
561 21 dinesha
glbl_cfg   u_glbl_cfg (
562 20 dinesha
 
563 21 dinesha
       .mclk                   (clk                       ),
564
       .reset_n                (rst_n                     ),
565
       .device_idcode          (                          ),
566 20 dinesha
 
567 21 dinesha
        // Reg Bus Interface Signal
568
       .reg_cs                 (wbd_glbl_stb_o            ),
569
       .reg_wr                 (wbd_glbl_we_o             ),
570
       .reg_addr               (wbd_glbl_adr_o[5:2]       ),
571
       .reg_wdata              (wbd_glbl_dat_o            ),
572
       .reg_be                 (wbd_glbl_sel_o            ),
573 20 dinesha
 
574 21 dinesha
       // Outputs
575
       .reg_rdata              (wbd_glbl_dat_i            ),
576
       .reg_ack                (wbd_glbl_ack_i            ),
577 20 dinesha
 
578 21 dinesha
       // SDRAM Clock
579
 
580
       .sdram_clk              (sdram_clk                 ),
581
 
582
       // reset
583
       .cpu_rst_n              (cpu_rst_n                 ),
584
       .spi_rst_n              (spi_rst_n                 ),
585
       .sdram_rst_n            (sdram_rst_n               ),
586
 
587
       // Risc configuration
588
       .fuse_mhartid           (fuse_mhartid              ),
589
       .irq_lines              (irq_lines                 ),
590
       .soft_irq               (soft_irq                  ),
591
 
592
       // SDRAM Config
593
       .cfg_sdr_width          (cfg_sdr_width             ),
594
       .cfg_colbits            (cfg_colbits               ),
595
 
596
        /* Parameters */
597
       .sdr_init_done          (sdr_init_done             ),
598
       .cfg_req_depth          (cfg_req_depth             ), //how many req. buffer should hold
599
       .cfg_sdr_en             (cfg_sdr_en                ),
600
       .cfg_sdr_mode_reg       (cfg_sdr_mode_reg          ),
601
       .cfg_sdr_tras_d         (cfg_sdr_tras_d            ),
602
       .cfg_sdr_trp_d          (cfg_sdr_trp_d             ),
603
       .cfg_sdr_trcd_d         (cfg_sdr_trcd_d            ),
604
       .cfg_sdr_cas            (cfg_sdr_cas               ),
605
       .cfg_sdr_trcar_d        (cfg_sdr_trcar_d           ),
606
       .cfg_sdr_twr_d          (cfg_sdr_twr_d             ),
607
       .cfg_sdr_rfsh           (cfg_sdr_rfsh              ),
608
       .cfg_sdr_rfmax          (cfg_sdr_rfmax             )
609
 
610
 
611
        );
612
 
613
 
614
 
615 20 dinesha
endmodule : digital_core

powered by: WebSVN 2.1.0

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