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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [fpga/] [xilinx_avnet_lx9microbard/] [rtl/] [verilog/] [openMSP430_fpga.v] - Blame information for rev 212

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 157 olivier.gi
//----------------------------------------------------------------------------
2
// Copyright (C) 2011 Authors
3
//
4
// This source file may be used and distributed without restriction provided
5
// that this copyright statement is not removed from the file and that any
6
// derivative work contains the original copyright notice and the associated
7
// disclaimer.
8
//
9
// This source file is free software; you can redistribute it and/or modify
10
// it under the terms of the GNU Lesser General Public License as published
11
// by the Free Software Foundation; either version 2.1 of the License, or
12
// (at your option) any later version.
13
//
14
// This source is distributed in the hope that it will be useful, but WITHOUT
15
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17
// License for more details.
18
//
19
// You should have received a copy of the GNU Lesser General Public License
20
// along with this source; if not, write to the Free Software Foundation,
21
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22
//
23
//----------------------------------------------------------------------------
24 212 olivier.gi
//
25 157 olivier.gi
// *File Name: openMSP430_fpga.v
26 212 olivier.gi
//
27 157 olivier.gi
// *Module Description:
28
//                      openMSP430 FPGA Top-level for the Avnet LX9 Microboard
29
//
30
// *Author(s):
31
//              - Ricardo Ribalda,    ricardo.ribalda@gmail.com
32
//              - Olivier Girard,    olgirard@gmail.com
33
//
34
//----------------------------------------------------------------------------
35
`include "openmsp430/openMSP430_defines.v"
36
 
37
module openMSP430_fpga (
38
 
39
     //----------------------------------------------
40
     // User Reset Push Button
41
     //----------------------------------------------
42
     USER_RESET,
43
 
44
     //----------------------------------------------
45
     // Micron N25Q128 SPI Flash
46
     //   This is a Multi-I/O Flash.  Several pins
47
     //  have dual purposes depending on the mode.
48
     //----------------------------------------------
49
     SPI_SCK,
50
     SPI_CS_n,
51
     SPI_MOSI_MISO0,
52
     SPI_MISO_MISO1,
53
     SPI_Wn_MISO2,
54
     SPI_HOLDn_MISO3,
55
 
56
     //----------------------------------------------
57
     // TI CDCE913 Triple-Output PLL Clock Chip
58
     //   Y1: 40 MHz, USER_CLOCK can be used as
59
     //              external configuration clock
60
     //   Y2: 66.667 MHz
61 212 olivier.gi
     //   Y3: 100 MHz
62 157 olivier.gi
     //----------------------------------------------
63
     USER_CLOCK,
64
     CLOCK_Y2,
65
     CLOCK_Y3,
66
 
67
     //----------------------------------------------
68
     // The following oscillator is not populated
69
     // in production but the footprint is compatible
70 212 olivier.gi
     // with the Maxim DS1088LU
71 157 olivier.gi
     //----------------------------------------------
72
     BACKUP_CLK,
73
 
74
     //----------------------------------------------
75
     // User DIP Switch x4
76
     //----------------------------------------------
77
     GPIO_DIP1,
78
     GPIO_DIP2,
79
     GPIO_DIP3,
80
     GPIO_DIP4,
81
 
82
     //----------------------------------------------
83 212 olivier.gi
     // User LEDs
84 157 olivier.gi
     //----------------------------------------------
85
     GPIO_LED1,
86
     GPIO_LED2,
87
     GPIO_LED3,
88
     GPIO_LED4,
89
 
90
     //----------------------------------------------
91
     // Silicon Labs CP2102 USB-to-UART Bridge Chip
92
     //----------------------------------------------
93
     USB_RS232_RXD,
94
     USB_RS232_TXD,
95
 
96
     //----------------------------------------------
97
     // Texas Instruments CDCE913 programming port
98
     //----------------------------------------------
99
     SCL,
100
     SDA,
101
 
102
     //----------------------------------------------
103 212 olivier.gi
     // Micron MT46H32M16LFBF-5 LPDDR
104 157 olivier.gi
     //----------------------------------------------
105
 
106
     // Addresses
107
     LPDDR_A0,
108
     LPDDR_A1,
109
     LPDDR_A2,
110
     LPDDR_A3,
111
     LPDDR_A4,
112
     LPDDR_A5,
113
     LPDDR_A6,
114
     LPDDR_A7,
115
     LPDDR_A8,
116
     LPDDR_A9,
117
     LPDDR_A10,
118
     LPDDR_A11,
119
     LPDDR_A12,
120
     LPDDR_BA0,
121
     LPDDR_BA1,
122
 
123 212 olivier.gi
     // Data
124 157 olivier.gi
     LPDDR_DQ0,
125
     LPDDR_DQ1,
126
     LPDDR_DQ2,
127
     LPDDR_DQ3,
128
     LPDDR_DQ4,
129
     LPDDR_DQ5,
130
     LPDDR_DQ6,
131
     LPDDR_DQ7,
132
     LPDDR_DQ8,
133
     LPDDR_DQ9,
134
     LPDDR_DQ10,
135
     LPDDR_DQ11,
136
     LPDDR_DQ12,
137
     LPDDR_DQ13,
138
     LPDDR_DQ14,
139
     LPDDR_DQ15,
140
     LPDDR_LDM,
141
     LPDDR_UDM,
142
     LPDDR_LDQS,
143
     LPDDR_UDQS,
144
 
145
     // Clock
146
     LPDDR_CK_N,
147
     LPDDR_CK_P,
148
     LPDDR_CKE,
149
 
150
     // Control
151
     LPDDR_CAS_n,
152
     LPDDR_RAS_n,
153
     LPDDR_WE_n,
154
     LPDDR_RZQ,
155
 
156
     //----------------------------------------------
157 212 olivier.gi
     // National Semiconductor DP83848J 10/100 Ethernet PHY
158 157 olivier.gi
     //   Pull-ups on RXD are necessary to set the PHY AD to 11110b.
159 212 olivier.gi
     //   Must keep the PHY from defaulting to PHY AD = 00000b
160
     //   because this is Isolate Mode
161 157 olivier.gi
     //----------------------------------------------
162
     ETH_COL,
163
     ETH_CRS,
164
     ETH_MDC,
165
     ETH_MDIO,
166
     ETH_RESET_n,
167
     ETH_RX_CLK,
168
     ETH_RX_D0,
169
     ETH_RX_D1,
170
     ETH_RX_D2,
171
     ETH_RX_D3,
172
     ETH_RX_DV,
173
     ETH_RX_ER,
174
     ETH_TX_CLK,
175
     ETH_TX_D0,
176
     ETH_TX_D1,
177
     ETH_TX_D2,
178
     ETH_TX_D3,
179
     ETH_TX_EN,
180
 
181
     //----------------------------------------------
182
     // Peripheral Modules (PMODs) and GPIO
183
     //     https://www.digilentinc.com/PMODs
184
     //----------------------------------------------
185
 
186
     // Connector J5
187
     PMOD1_P1,
188
     PMOD1_P2,
189
     PMOD1_P3,
190
     PMOD1_P4,
191
     PMOD1_P7,
192
     PMOD1_P8,
193
     PMOD1_P9,
194
     PMOD1_P10,
195
 
196
     // Connector J4
197
     PMOD2_P1,
198
     PMOD2_P2,
199
     PMOD2_P3,
200
     PMOD2_P4,
201
     PMOD2_P7,
202
     PMOD2_P8,
203
     PMOD2_P9,
204
     PMOD2_P10
205
);
206
 
207
//----------------------------------------------
208
// User Reset Push Button
209
//----------------------------------------------
210
input    USER_RESET;
211
 
212
//----------------------------------------------
213
// Micron N25Q128 SPI Flash
214
//   This is a Multi-I/O Flash.  Several pins
215
//  have dual purposes depending on the mode.
216
//----------------------------------------------
217
output   SPI_SCK;
218
output   SPI_CS_n;
219
inout    SPI_MOSI_MISO0;
220
inout    SPI_MISO_MISO1;
221
output   SPI_Wn_MISO2;
222
output   SPI_HOLDn_MISO3;
223
 
224
//----------------------------------------------
225
// TI CDCE913 Triple-Output PLL Clock Chip
226
//   Y1: 40 MHz; USER_CLOCK can be used as
227
//              external configuration clock
228
//   Y2: 66.667 MHz
229 212 olivier.gi
//   Y3: 100 MHz
230 157 olivier.gi
//----------------------------------------------
231
input    USER_CLOCK;
232
input    CLOCK_Y2;
233
input    CLOCK_Y3;
234
 
235
//----------------------------------------------
236
// The following oscillator is not populated
237
// in production but the footprint is compatible
238 212 olivier.gi
// with the Maxim DS1088LU
239 157 olivier.gi
//----------------------------------------------
240
input    BACKUP_CLK;
241
 
242
//----------------------------------------------
243
// User DIP Switch x4
244
//----------------------------------------------
245
input    GPIO_DIP1;
246
input    GPIO_DIP2;
247
input    GPIO_DIP3;
248
input    GPIO_DIP4;
249
 
250
//----------------------------------------------
251 212 olivier.gi
// User LEDs
252 157 olivier.gi
//----------------------------------------------
253
output   GPIO_LED1;
254
output   GPIO_LED2;
255
output   GPIO_LED3;
256
output   GPIO_LED4;
257
 
258
//----------------------------------------------
259
// Silicon Labs CP2102 USB-to-UART Bridge Chip
260
//----------------------------------------------
261
input    USB_RS232_RXD;
262
output   USB_RS232_TXD;
263
 
264
//----------------------------------------------
265
// Texas Instruments CDCE913 programming port
266
//----------------------------------------------
267
output   SCL;
268
inout    SDA;
269
 
270
//----------------------------------------------
271 212 olivier.gi
// Micron MT46H32M16LFBF-5 LPDDR
272 157 olivier.gi
//----------------------------------------------
273
 
274
// Addresses
275
output   LPDDR_A0;
276
output   LPDDR_A1;
277
output   LPDDR_A2;
278
output   LPDDR_A3;
279
output   LPDDR_A4;
280
output   LPDDR_A5;
281
output   LPDDR_A6;
282
output   LPDDR_A7;
283
output   LPDDR_A8;
284
output   LPDDR_A9;
285
output   LPDDR_A10;
286
output   LPDDR_A11;
287
output   LPDDR_A12;
288
output   LPDDR_BA0;
289
output   LPDDR_BA1;
290
 
291 212 olivier.gi
// Data
292 157 olivier.gi
inout    LPDDR_DQ0;
293
inout    LPDDR_DQ1;
294
inout    LPDDR_DQ2;
295
inout    LPDDR_DQ3;
296
inout    LPDDR_DQ4;
297
inout    LPDDR_DQ5;
298
inout    LPDDR_DQ6;
299
inout    LPDDR_DQ7;
300
inout    LPDDR_DQ8;
301
inout    LPDDR_DQ9;
302
inout    LPDDR_DQ10;
303
inout    LPDDR_DQ11;
304
inout    LPDDR_DQ12;
305
inout    LPDDR_DQ13;
306
inout    LPDDR_DQ14;
307
inout    LPDDR_DQ15;
308
output   LPDDR_LDM;
309
output   LPDDR_UDM;
310
inout    LPDDR_LDQS;
311
inout    LPDDR_UDQS;
312
 
313
// Clock
314
output   LPDDR_CK_N;
315
output   LPDDR_CK_P;
316
output   LPDDR_CKE;
317
 
318
// Control
319
output   LPDDR_CAS_n;
320
output   LPDDR_RAS_n;
321
output   LPDDR_WE_n;
322
inout    LPDDR_RZQ;
323
 
324
//----------------------------------------------
325 212 olivier.gi
// National Semiconductor DP83848J 10/100 Ethernet PHY
326 157 olivier.gi
//   Pull-ups on RXD are necessary to set the PHY AD to 11110b.
327 212 olivier.gi
//   Must keep the PHY from defaulting to PHY AD = 00000b
328
//   because this is Isolate Mode
329 157 olivier.gi
//----------------------------------------------
330
input    ETH_COL;
331
input    ETH_CRS;
332
output   ETH_MDC;
333
inout    ETH_MDIO;
334
output   ETH_RESET_n;
335
input    ETH_RX_CLK;
336
input    ETH_RX_D0;
337
input    ETH_RX_D1;
338
input    ETH_RX_D2;
339
input    ETH_RX_D3;
340
input    ETH_RX_DV;
341
input    ETH_RX_ER;
342
input    ETH_TX_CLK;
343
output   ETH_TX_D0;
344
output   ETH_TX_D1;
345
output   ETH_TX_D2;
346
output   ETH_TX_D3;
347
output   ETH_TX_EN;
348
 
349
//----------------------------------------------
350
// Peripheral Modules (PMODs) and GPIO
351
//     https://www.digilentinc.com/PMODs
352
//----------------------------------------------
353
 
354
// Connector J5
355
inout    PMOD1_P1;
356
inout    PMOD1_P2;
357
inout    PMOD1_P3;
358
input    PMOD1_P4;
359
inout    PMOD1_P7;
360
inout    PMOD1_P8;
361
inout    PMOD1_P9;
362
inout    PMOD1_P10;
363
 
364
// Connector J4
365
inout    PMOD2_P1;
366
inout    PMOD2_P2;
367
inout    PMOD2_P3;
368
inout    PMOD2_P4;
369
inout    PMOD2_P7;
370
inout    PMOD2_P8;
371
inout    PMOD2_P9;
372
inout    PMOD2_P10;
373
 
374
 
375
//=============================================================================
376
// 1)  INTERNAL WIRES/REGISTERS/PARAMETERS DECLARATION
377
//=============================================================================
378
 
379
// Clock generation
380
wire               clk_40mhz;
381
wire               dcm_locked;
382
wire               dcm_clkfx;
383
wire               dcm_clk0;
384
wire               dcm_clkfb;
385
wire               dco_clk;
386
 
387
// Reset generation
388
wire               reset_pin;
389
wire               reset_pin_n;
390
wire               reset_n;
391
 
392
// Debug interface
393 167 olivier.gi
wire               omsp_dbg_i2c_scl;
394
wire               omsp_dbg_i2c_sda_in;
395
wire               omsp_dbg_i2c_sda_out;
396 157 olivier.gi
wire               omsp0_dbg_i2c_sda_out;
397 167 olivier.gi
wire               omsp1_dbg_i2c_sda_out;
398 157 olivier.gi
wire        [23:0] chipscope_trigger;
399
 
400
// Data memory
401
wire [`DMEM_MSB:0] omsp0_dmem_addr;
402
wire               omsp0_dmem_cen;
403 167 olivier.gi
wire               omsp0_dmem_cen_sp;
404
wire               omsp0_dmem_cen_dp;
405 157 olivier.gi
wire        [15:0] omsp0_dmem_din;
406
wire         [1:0] omsp0_dmem_wen;
407
wire        [15:0] omsp0_dmem_dout;
408 167 olivier.gi
wire        [15:0] omsp0_dmem_dout_sp;
409
wire        [15:0] omsp0_dmem_dout_dp;
410
reg                omsp0_dmem_dout_sel;
411 157 olivier.gi
 
412 167 olivier.gi
wire [`DMEM_MSB:0] omsp1_dmem_addr;
413
wire               omsp1_dmem_cen;
414
wire               omsp1_dmem_cen_sp;
415
wire               omsp1_dmem_cen_dp;
416
wire        [15:0] omsp1_dmem_din;
417
wire         [1:0] omsp1_dmem_wen;
418
wire        [15:0] omsp1_dmem_dout;
419
wire        [15:0] omsp1_dmem_dout_sp;
420
wire        [15:0] omsp1_dmem_dout_dp;
421
reg                omsp1_dmem_dout_sel;
422
 
423 157 olivier.gi
// Program memory
424
wire [`PMEM_MSB:0] omsp0_pmem_addr;
425
wire               omsp0_pmem_cen;
426
wire        [15:0] omsp0_pmem_din;
427
wire         [1:0] omsp0_pmem_wen;
428
wire        [15:0] omsp0_pmem_dout;
429
 
430 167 olivier.gi
wire [`PMEM_MSB:0] omsp1_pmem_addr;
431
wire               omsp1_pmem_cen;
432
wire        [15:0] omsp1_pmem_din;
433
wire         [1:0] omsp1_pmem_wen;
434
wire        [15:0] omsp1_pmem_dout;
435
 
436 157 olivier.gi
// UART
437
wire               omsp0_uart_rxd;
438
wire               omsp0_uart_txd;
439
 
440
// LEDs & Switches
441 167 olivier.gi
wire         [3:0] omsp_switch;
442
wire         [1:0] omsp0_led;
443
wire         [1:0] omsp1_led;
444 157 olivier.gi
 
445
 
446
//=============================================================================
447
// 2)  RESET GENERATION & FPGA STARTUP
448
//=============================================================================
449
 
450
// Reset input buffer
451
IBUF   ibuf_reset_n   (.O(reset_pin), .I(USER_RESET));
452
assign reset_pin_n = ~reset_pin;
453
 
454
// Release the reset only, if the DCM is locked
455
assign  reset_n = reset_pin_n & dcm_locked;
456
 
457
// Top level reset generation
458
wire dco_rst;
459
omsp_sync_reset sync_reset_dco (.rst_s (dco_rst), .clk(dco_clk), .rst_a(!reset_n));
460
 
461
 
462
//=============================================================================
463
// 3)  CLOCK GENERATION
464
//=============================================================================
465
 
466
// Input buffers
467
//------------------------
468
IBUFG ibuf_clk_main   (.O(clk_40mhz),    .I(USER_CLOCK));
469
IBUFG ibuf_clk_y2     (.O(),             .I(CLOCK_Y2));
470
IBUFG ibuf_clk_y3     (.O(),             .I(CLOCK_Y3));
471
IBUFG ibuf_clk_bkup   (.O(),             .I(BACKUP_CLK));
472
 
473
 
474
// Digital Clock Manager
475
//------------------------
476
DCM_SP #(.CLKFX_MULTIPLY(7),
477
         .CLKFX_DIVIDE(10),
478
         .CLKIN_PERIOD(25.000)) dcm_inst (
479
 
480
// OUTPUTs
481 212 olivier.gi
    .CLKDV        (),
482 157 olivier.gi
    .CLKFX        (dcm_clkfx),
483 212 olivier.gi
    .CLKFX180     (),
484 157 olivier.gi
    .LOCKED       (dcm_locked),
485 212 olivier.gi
    .PSDONE       (),
486 157 olivier.gi
 
487 212 olivier.gi
    .STATUS       (),
488
 
489
    .CLK0         (dcm_clk0),
490
    .CLK180       (),
491
    .CLK270       (),
492
    .CLK2X        (),
493
    .CLK2X180     (),
494
    .CLK90        (),
495
 
496 157 olivier.gi
// INPUTs
497
    .CLKFB        (dcm_clkfb),
498
    .CLKIN        (clk_40mhz),
499 212 olivier.gi
    .DSSEN        (1'b0),
500
 
501
    .PSCLK        (1'b0),
502 157 olivier.gi
    .PSEN         (1'b0),
503 212 olivier.gi
    .PSINCDEC     (1'b0),
504 157 olivier.gi
    .RST          (reset_pin)
505
);
506
 
507
BUFG CLK0_BUFG_INST (
508
    .I(dcm_clk0),
509
    .O(dcm_clkfb)
510
);
511
 
512
//synthesis translate_off
513
defparam dcm_inst.CLKFX_MULTIPLY  = 7;
514
defparam dcm_inst.CLKFX_DIVIDE    = 10;
515
defparam dcm_inst.CLKIN_PERIOD    = 25.000;
516
//synthesis translate_on
517
 
518
// Clock buffers
519
//------------------------
520
BUFG  buf_sys_clock  (.O(dco_clk), .I(dcm_clkfx));
521
 
522
 
523
//=============================================================================
524
// 4)  OPENMSP430 SYSTEM 0
525
//=============================================================================
526
 
527
omsp_system_0 omsp_system_0_inst (
528
 
529
// Clock & Reset
530
    .dco_clk           (dco_clk),                     // Fast oscillator (fast clock)
531
    .reset_n           (reset_n),                     // Reset Pin (low active, asynchronous and non-glitchy)
532
 
533
// Serial Debug Interface (I2C)
534 167 olivier.gi
    .dbg_i2c_addr      (7'd50),                       // Debug interface: I2C Address
535
    .dbg_i2c_broadcast (7'd49),                       // Debug interface: I2C Broadcast Address (for multicore systems)
536
    .dbg_i2c_scl       (omsp_dbg_i2c_scl),            // Debug interface: I2C SCL
537
    .dbg_i2c_sda_in    (omsp_dbg_i2c_sda_in),         // Debug interface: I2C SDA IN
538 157 olivier.gi
    .dbg_i2c_sda_out   (omsp0_dbg_i2c_sda_out),       // Debug interface: I2C SDA OUT
539
 
540
// Data Memory
541
    .dmem_addr         (omsp0_dmem_addr),             // Data Memory address
542
    .dmem_cen          (omsp0_dmem_cen),              // Data Memory chip enable (low active)
543
    .dmem_din          (omsp0_dmem_din),              // Data Memory data input
544
    .dmem_wen          (omsp0_dmem_wen),              // Data Memory write enable (low active)
545
    .dmem_dout         (omsp0_dmem_dout),             // Data Memory data output
546
 
547
// Program Memory
548
    .pmem_addr         (omsp0_pmem_addr),             // Program Memory address
549
    .pmem_cen          (omsp0_pmem_cen),              // Program Memory chip enable (low active)
550
    .pmem_din          (omsp0_pmem_din),              // Program Memory data input (optional)
551
    .pmem_wen          (omsp0_pmem_wen),              // Program Memory write enable (low active) (optional)
552
    .pmem_dout         (omsp0_pmem_dout),             // Program Memory data output
553
 
554
// UART
555
    .uart_rxd          (omsp0_uart_rxd),              // UART Data Receive (RXD)
556
    .uart_txd          (omsp0_uart_txd),              // UART Data Transmit (TXD)
557
 
558
// Switches & LEDs
559 167 olivier.gi
    .switch            (omsp_switch),                 // Input switches
560 157 olivier.gi
    .led               (omsp0_led)                    // LEDs
561
);
562
 
563
 
564
//=============================================================================
565 167 olivier.gi
// 5)  OPENMSP430 SYSTEM 1
566
//=============================================================================
567
 
568
omsp_system_1 omsp_system_1_inst (
569
 
570
// Clock & Reset
571
    .dco_clk           (dco_clk),                     // Fast oscillator (fast clock)
572
    .reset_n           (reset_n),                     // Reset Pin (low active, asynchronous and non-glitchy)
573
 
574
// Serial Debug Interface (I2C)
575
    .dbg_i2c_addr      (7'd51),                       // Debug interface: I2C Address
576
    .dbg_i2c_broadcast (7'd49),                       // Debug interface: I2C Broadcast Address (for multicore systems)
577
    .dbg_i2c_scl       (omsp_dbg_i2c_scl),            // Debug interface: I2C SCL
578
    .dbg_i2c_sda_in    (omsp_dbg_i2c_sda_in),         // Debug interface: I2C SDA IN
579
    .dbg_i2c_sda_out   (omsp1_dbg_i2c_sda_out),       // Debug interface: I2C SDA OUT
580
 
581
// Data Memory
582
    .dmem_addr         (omsp1_dmem_addr),             // Data Memory address
583
    .dmem_cen          (omsp1_dmem_cen),              // Data Memory chip enable (low active)
584
    .dmem_din          (omsp1_dmem_din),              // Data Memory data input
585
    .dmem_wen          (omsp1_dmem_wen),              // Data Memory write enable (low active)
586
    .dmem_dout         (omsp1_dmem_dout),             // Data Memory data output
587
 
588
// Program Memory
589
    .pmem_addr         (omsp1_pmem_addr),             // Program Memory address
590
    .pmem_cen          (omsp1_pmem_cen),              // Program Memory chip enable (low active)
591
    .pmem_din          (omsp1_pmem_din),              // Program Memory data input (optional)
592
    .pmem_wen          (omsp1_pmem_wen),              // Program Memory write enable (low active) (optional)
593
    .pmem_dout         (omsp1_pmem_dout),             // Program Memory data output
594
 
595
// Switches & LEDs
596
    .switch            (omsp_switch),                 // Input switches
597
    .led               (omsp1_led)                    // LEDs
598
);
599
 
600
 
601
//=============================================================================
602 157 olivier.gi
// 6)  PROGRAM AND DATA MEMORIES
603
//=============================================================================
604
 
605 167 olivier.gi
// Memory muxing (CPU 0)
606
assign omsp0_dmem_cen_sp =  omsp0_dmem_addr[`DMEM_MSB] | omsp0_dmem_cen;
607
assign omsp0_dmem_cen_dp = ~omsp0_dmem_addr[`DMEM_MSB] | omsp0_dmem_cen;
608
assign omsp0_dmem_dout   =  omsp0_dmem_dout_sel ? omsp0_dmem_dout_sp : omsp0_dmem_dout_dp;
609
 
610
always @ (posedge dco_clk or posedge dco_rst)
611
  if (dco_rst)                  omsp0_dmem_dout_sel <=  1'b1;
612
  else if (~omsp0_dmem_cen_sp)  omsp0_dmem_dout_sel <=  1'b1;
613
  else if (~omsp0_dmem_cen_dp)  omsp0_dmem_dout_sel <=  1'b0;
614
 
615
// Memory muxing (CPU 1)
616
assign omsp1_dmem_cen_sp =  omsp1_dmem_addr[`DMEM_MSB] | omsp1_dmem_cen;
617
assign omsp1_dmem_cen_dp = ~omsp1_dmem_addr[`DMEM_MSB] | omsp1_dmem_cen;
618
assign omsp1_dmem_dout   =  omsp1_dmem_dout_sel ? omsp1_dmem_dout_sp : omsp1_dmem_dout_dp;
619
 
620
always @ (posedge dco_clk or posedge dco_rst)
621
  if (dco_rst)                  omsp1_dmem_dout_sel <=  1'b1;
622
  else if (~omsp1_dmem_cen_sp)  omsp1_dmem_dout_sel <=  1'b1;
623
  else if (~omsp1_dmem_cen_dp)  omsp1_dmem_dout_sel <=  1'b0;
624
 
625
// Data Memory (CPU 0)
626
ram_16x1k_sp ram_16x1k_sp_dmem_omsp0 (
627 157 olivier.gi
    .clka           ( dco_clk),
628 167 olivier.gi
    .ena            (~omsp0_dmem_cen_sp),
629 157 olivier.gi
    .wea            (~omsp0_dmem_wen),
630 167 olivier.gi
    .addra          ( omsp0_dmem_addr[`DMEM_MSB-1:0]),
631 157 olivier.gi
    .dina           ( omsp0_dmem_din),
632 167 olivier.gi
    .douta          ( omsp0_dmem_dout_sp)
633 157 olivier.gi
);
634
 
635 167 olivier.gi
// Data Memory (CPU 1)
636
ram_16x1k_sp ram_16x1k_sp_dmem_omsp1 (
637
    .clka           ( dco_clk),
638
    .ena            (~omsp1_dmem_cen_sp),
639
    .wea            (~omsp1_dmem_wen),
640
    .addra          ( omsp1_dmem_addr[`DMEM_MSB-1:0]),
641
    .dina           ( omsp1_dmem_din),
642
    .douta          ( omsp1_dmem_dout_sp)
643
);
644 157 olivier.gi
 
645 167 olivier.gi
// Shared Data Memory
646
ram_16x1k_dp ram_16x1k_dp_dmem_shared (
647 157 olivier.gi
    .clka           ( dco_clk),
648 167 olivier.gi
    .ena            (~omsp0_dmem_cen_dp),
649
    .wea            (~omsp0_dmem_wen),
650
    .addra          ( omsp0_dmem_addr[`DMEM_MSB-1:0]),
651
    .dina           ( omsp0_dmem_din),
652
    .douta          ( omsp0_dmem_dout_dp),
653
    .clkb           ( dco_clk),
654
    .enb            (~omsp1_dmem_cen_dp),
655
    .web            (~omsp1_dmem_wen),
656
    .addrb          ( omsp1_dmem_addr[`DMEM_MSB-1:0]),
657
    .dinb           ( omsp1_dmem_din),
658
    .doutb          ( omsp1_dmem_dout_dp)
659
);
660
 
661
// Shared Program Memory
662
ram_16x8k_dp ram_16x8k_dp_pmem_shared (
663
    .clka           ( dco_clk),
664 157 olivier.gi
    .ena            (~omsp0_pmem_cen),
665
    .wea            (~omsp0_pmem_wen),
666
    .addra          ( omsp0_pmem_addr),
667
    .dina           ( omsp0_pmem_din),
668 167 olivier.gi
    .douta          ( omsp0_pmem_dout),
669
    .clkb           ( dco_clk),
670
    .enb            (~omsp1_pmem_cen),
671
    .web            (~omsp1_pmem_wen),
672
    .addrb          ( omsp1_pmem_addr),
673
    .dinb           ( omsp1_pmem_din),
674
    .doutb          ( omsp1_pmem_dout)
675 157 olivier.gi
);
676
 
677
 
678
//=============================================================================
679
// 7)  I/O CELLS
680
//=============================================================================
681
 
682
//----------------------------------------------
683
// Micron N25Q128 SPI Flash
684
//   This is a Multi-I/O Flash.  Several pins
685
//  have dual purposes depending on the mode.
686
//----------------------------------------------
687
OBUF  SPI_CLK_PIN        (.I(1'b0),                  .O(SPI_SCK));
688
OBUF  SPI_CSN_PIN        (.I(1'b1),                  .O(SPI_CS_n));
689
IOBUF SPI_MOSI_MISO0_PIN (.T(1'b0), .I(1'b0), .O(),  .IO(SPI_MOSI_MISO0));
690
IOBUF SPI_MISO_MISO1_PIN (.T(1'b0), .I(1'b0), .O(),  .IO(SPI_MISO_MISO1));
691
OBUF  SPI_WN_PIN         (.I(1'b1),                  .O(SPI_Wn_MISO2));
692
OBUF  SPI_HOLD_PIN       (.I(1'b1),                  .O(SPI_HOLDn_MISO3));
693
 
694
//----------------------------------------------
695
// User DIP Switch x4
696
//----------------------------------------------
697 167 olivier.gi
IBUF  SW3_PIN            (.O(omsp_switch[3]),        .I(GPIO_DIP4));
698
IBUF  SW2_PIN            (.O(omsp_switch[2]),        .I(GPIO_DIP3));
699
IBUF  SW1_PIN            (.O(omsp_switch[1]),        .I(GPIO_DIP2));
700
IBUF  SW0_PIN            (.O(omsp_switch[0]),        .I(GPIO_DIP1));
701 157 olivier.gi
 
702
//----------------------------------------------
703 212 olivier.gi
// User LEDs
704 157 olivier.gi
//----------------------------------------------
705 167 olivier.gi
OBUF  LED3_PIN           (.I(omsp1_led[1]),          .O(GPIO_LED4));
706
OBUF  LED2_PIN           (.I(omsp1_led[0]),          .O(GPIO_LED3));
707 157 olivier.gi
OBUF  LED1_PIN           (.I(omsp0_led[1]),          .O(GPIO_LED2));
708
OBUF  LED0_PIN           (.I(omsp0_led[0]),          .O(GPIO_LED1));
709
 
710
//----------------------------------------------
711
// Silicon Labs CP2102 USB-to-UART Bridge Chip
712
//----------------------------------------------
713
IBUF  UART_RXD_PIN       (.O(omsp0_uart_rxd),        .I(USB_RS232_RXD));
714
OBUF  UART_TXD_PIN       (.I(omsp0_uart_txd),        .O(USB_RS232_TXD));
715
 
716
//----------------------------------------------
717
// Texas Instruments CDCE913 programming port
718
//----------------------------------------------
719
IOBUF SCL_PIN            (.T(1'b0), .I(1'b1), .O(),  .IO(SCL));
720
IOBUF SDA_PIN            (.T(1'b0), .I(1'b1), .O(),  .IO(SDA));
721
 
722
//----------------------------------------------
723 212 olivier.gi
// Micron MT46H32M16LFBF-5 LPDDR
724 157 olivier.gi
//----------------------------------------------
725
 
726
// Addresses
727
OBUF  LPDDR_A0_PIN       (.I(1'b0),                  .O(LPDDR_A0));
728
OBUF  LPDDR_A1_PIN       (.I(1'b0),                  .O(LPDDR_A1));
729
OBUF  LPDDR_A2_PIN       (.I(1'b0),                  .O(LPDDR_A2));
730
OBUF  LPDDR_A3_PIN       (.I(1'b0),                  .O(LPDDR_A3));
731
OBUF  LPDDR_A4_PIN       (.I(1'b0),                  .O(LPDDR_A4));
732
OBUF  LPDDR_A5_PIN       (.I(1'b0),                  .O(LPDDR_A5));
733
OBUF  LPDDR_A6_PIN       (.I(1'b0),                  .O(LPDDR_A6));
734
OBUF  LPDDR_A7_PIN       (.I(1'b0),                  .O(LPDDR_A7));
735
OBUF  LPDDR_A8_PIN       (.I(1'b0),                  .O(LPDDR_A8));
736
OBUF  LPDDR_A9_PIN       (.I(1'b0),                  .O(LPDDR_A9));
737
OBUF  LPDDR_A10_PIN      (.I(1'b0),                  .O(LPDDR_A10));
738
OBUF  LPDDR_A11_PIN      (.I(1'b0),                  .O(LPDDR_A11));
739
OBUF  LPDDR_A12_PIN      (.I(1'b0),                  .O(LPDDR_A12));
740
OBUF  LPDDR_BA0_PIN      (.I(1'b0),                  .O(LPDDR_BA0));
741
OBUF  LPDDR_BA1_PIN      (.I(1'b0),                  .O(LPDDR_BA1));
742
 
743 212 olivier.gi
// Data
744 157 olivier.gi
IOBUF LPDDR_DQ0_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ0));
745
IOBUF LPDDR_DQ1_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ1));
746
IOBUF LPDDR_DQ2_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ2));
747
IOBUF LPDDR_DQ3_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ3));
748
IOBUF LPDDR_DQ4_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ4));
749
IOBUF LPDDR_DQ5_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ5));
750
IOBUF LPDDR_DQ6_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ6));
751
IOBUF LPDDR_DQ7_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ7));
752
IOBUF LPDDR_DQ8_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ8));
753
IOBUF LPDDR_DQ9_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ9));
754
IOBUF LPDDR_DQ10_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ10));
755
IOBUF LPDDR_DQ11_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ11));
756
IOBUF LPDDR_DQ12_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ12));
757
IOBUF LPDDR_DQ13_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ13));
758
IOBUF LPDDR_DQ14_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ14));
759
IOBUF LPDDR_DQ15_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_DQ15));
760
OBUF  LPDDR_LDM_PIN      (.I(1'b0),                  .O(LPDDR_LDM));
761
OBUF  LPDDR_UDM_PIN      (.I(1'b0),                  .O(LPDDR_UDM));
762
IOBUF LPDDR_LDQS_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_LDQS));
763
IOBUF LPDDR_UDQS_PIN     (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_UDQS));
764
 
765
// Clock
766
IOBUF LPDDR_CK_N_PIN     (.T(1'b1), .I(1'b0), .O(),  .IO(LPDDR_CK_N));
767
IOBUF LPDDR_CK_P_PIN     (.T(1'b1), .I(1'b1), .O(),  .IO(LPDDR_CK_P));
768
OBUF  LPDDR_CKE_PIN      (.I(1'b0),                  .O(LPDDR_CKE));
769
 
770
// Control
771
OBUF  LPDDR_CAS_N_PIN    (.I(1'b1),                  .O(LPDDR_CAS_n));
772
OBUF  LPDDR_RAS_N_PIN    (.I(1'b1),                  .O(LPDDR_RAS_n));
773
OBUF  LPDDR_WE_N_PIN     (.I(1'b1),                  .O(LPDDR_WE_n));
774
IOBUF LPDDR_RZQ_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(LPDDR_RZQ));
775
 
776
 
777
//----------------------------------------------
778 212 olivier.gi
// National Semiconductor DP83848J 10/100 Ethernet PHY
779 157 olivier.gi
//   Pull-ups on RXD are necessary to set the PHY AD to 11110b.
780 212 olivier.gi
//   Must keep the PHY from defaulting to PHY AD = 00000b
781
//   because this is Isolate Mode
782 157 olivier.gi
//----------------------------------------------
783
IBUF  ETH_COL_PIN        (.O(),                      .I(ETH_COL));
784
IBUF  ETH_CRS_PIN        (.O(),                      .I(ETH_CRS));
785
OBUF  ETH_MDC_PIN        (.I(1'b0),                  .O(ETH_MDC));
786
IOBUF ETH_MDIO_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(ETH_MDIO));
787
OBUF  ETH_RESET_N_PIN    (.I(1'b1),                  .O(ETH_RESET_n));
788
IBUF  ETH_RX_CLK_PIN     (.O(),                      .I(ETH_RX_CLK));
789
IBUF  ETH_RX_D0_PIN      (.O(),                      .I(ETH_RX_D0));
790
IBUF  ETH_RX_D1_PIN      (.O(),                      .I(ETH_RX_D1));
791
IBUF  ETH_RX_D2_PIN      (.O(),                      .I(ETH_RX_D2));
792
IBUF  ETH_RX_D3_PIN      (.O(),                      .I(ETH_RX_D3));
793
IBUF  ETH_RX_DV_PIN      (.O(),                      .I(ETH_RX_DV));
794
IBUF  ETH_RX_ER_PIN      (.O(),                      .I(ETH_RX_ER));
795
IBUF  ETH_TX_CLK_PIN     (.O(),                      .I(ETH_TX_CLK));
796
OBUF  ETH_TX_D0_PIN      (.I(1'b0),                  .O(ETH_TX_D0));
797
OBUF  ETH_TX_D1_PIN      (.I(1'b0),                  .O(ETH_TX_D1));
798
OBUF  ETH_TX_D2_PIN      (.I(1'b0),                  .O(ETH_TX_D2));
799
OBUF  ETH_TX_D3_PIN      (.I(1'b0),                  .O(ETH_TX_D3));
800
OBUF  ETH_TX_EN_PIN      (.I(1'b0),                  .O(ETH_TX_EN));
801
 
802
//----------------------------------------------
803
// Peripheral Modules (PMODs) and GPIO
804
//     https://www.digilentinc.com/PMODs
805
//----------------------------------------------
806
 
807 167 olivier.gi
assign omsp_dbg_i2c_sda_out = omsp0_dbg_i2c_sda_out & omsp1_dbg_i2c_sda_out;
808 212 olivier.gi
 
809 157 olivier.gi
// Connector J5
810
IOBUF PMOD1_P1_PIN       (.T(1'b0),                  .I(1'b0), .O(),                     .IO(PMOD1_P1));
811
IOBUF PMOD1_P2_PIN       (.T(1'b0),                  .I(1'b0), .O(),                     .IO(PMOD1_P2));
812 167 olivier.gi
IOBUF PMOD1_P3_PIN       (.T(omsp_dbg_i2c_sda_out),  .I(1'b0), .O(omsp_dbg_i2c_sda_in),  .IO(PMOD1_P3));
813
IBUF  PMOD1_P4_PIN       (                                     .O(omsp_dbg_i2c_scl),     .I (PMOD1_P4));
814 157 olivier.gi
IOBUF PMOD1_P7_PIN       (.T(1'b0),                  .I(1'b0), .O(),                     .IO(PMOD1_P7));
815
IBUF  PMOD1_P8_PIN       (                                     .O(),                     .I (PMOD1_P8));
816
IOBUF PMOD1_P9_PIN       (.T(1'b0),                  .I(1'b0), .O(),                     .IO(PMOD1_P9));
817
IOBUF PMOD1_P10_PIN      (.T(1'b0),                  .I(1'b0), .O(),                     .IO(PMOD1_P10));
818 212 olivier.gi
 
819 157 olivier.gi
// Connector J4
820
IOBUF PMOD2_P1_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P1));
821
IOBUF PMOD2_P2_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P2));
822
IOBUF PMOD2_P3_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P3));
823
IOBUF PMOD2_P4_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P4));
824
IOBUF PMOD2_P7_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P7));
825
IOBUF PMOD2_P8_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P8));
826
IOBUF PMOD2_P9_PIN       (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P9));
827
IOBUF PMOD2_P10_PIN      (.T(1'b0), .I(1'b0), .O(),  .IO(PMOD2_P10));
828
 
829
 
830
//=============================================================================
831
//8)  CHIPSCOPE
832
//=============================================================================
833
//`define WITH_CHIPSCOPE
834
`ifdef WITH_CHIPSCOPE
835
 
836
// Sampling clock
837
reg [7:0] div_cnt;
838
always @ (posedge dco_clk or posedge dco_rst)
839
  if (dco_rst)           div_cnt <=  8'h00;
840
  else if (div_cnt > 10) div_cnt <=  8'h00;
841
  else                   div_cnt <=  div_cnt+8'h01;
842
 
843
reg clk_sample;
844
always @ (posedge dco_clk or posedge dco_rst)
845
  if (dco_rst) clk_sample <=  1'b0;
846
  else         clk_sample <=  (div_cnt==8'h00);
847
 
848 212 olivier.gi
 
849 157 olivier.gi
// ChipScope instance
850
wire        [35:0] chipscope_control;
851
chipscope_ila chipscope_ila (
852
    .CONTROL  (chipscope_control),
853
    .CLK      (clk_sample),
854
    .TRIG0    (chipscope_trigger)
855
);
856
 
857
chipscope_icon chipscope_icon (
858
    .CONTROL0 (chipscope_control)
859
);
860
 
861
 
862
assign chipscope_trigger[0]     = 1'b0;
863 167 olivier.gi
assign chipscope_trigger[1]     = 1'b0;
864
assign chipscope_trigger[2]     = 1'b0;
865 157 olivier.gi
assign chipscope_trigger[23:3]  = 21'h00_0000;
866
`endif
867
 
868
endmodule // openMSP430_fpga

powered by: WebSVN 2.1.0

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