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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [core/] [rtl/] [verilog/] [openMSP430.v] - Blame information for rev 117

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

Line No. Rev Author Line
1 2 olivier.gi
//----------------------------------------------------------------------------
2 117 olivier.gi
// Copyright (C) 2009 , Olivier Girard
3 2 olivier.gi
//
4 117 olivier.gi
// Redistribution and use in source and binary forms, with or without
5
// modification, are permitted provided that the following conditions
6
// are met:
7
//     * Redistributions of source code must retain the above copyright
8
//       notice, this list of conditions and the following disclaimer.
9
//     * Redistributions in binary form must reproduce the above copyright
10
//       notice, this list of conditions and the following disclaimer in the
11
//       documentation and/or other materials provided with the distribution.
12
//     * Neither the name of the authors nor the names of its contributors
13
//       may be used to endorse or promote products derived from this software
14
//       without specific prior written permission.
15 2 olivier.gi
//
16 117 olivier.gi
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21
// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26
// THE POSSIBILITY OF SUCH DAMAGE
27 2 olivier.gi
//
28
//----------------------------------------------------------------------------
29
//
30
// *File Name: openMSP430.v
31
// 
32
// *Module Description:
33
//                       openMSP430 Top level file
34
//
35
// *Author(s):
36
//              - Olivier Girard,    olgirard@gmail.com
37
//
38
//----------------------------------------------------------------------------
39 17 olivier.gi
// $Rev: 117 $
40
// $LastChangedBy: olivier.girard $
41
// $LastChangedDate: 2011-06-23 21:30:51 +0200 (Thu, 23 Jun 2011) $
42
//----------------------------------------------------------------------------
43 103 olivier.gi
`ifdef OMSP_NO_INCLUDE
44
`else
45 23 olivier.gi
`include "openMSP430_defines.v"
46 103 olivier.gi
`endif
47 2 olivier.gi
 
48
module  openMSP430 (
49
 
50
// OUTPUTs
51 33 olivier.gi
    aclk_en,                       // ACLK enable
52
    dbg_freeze,                    // Freeze peripherals
53
    dbg_uart_txd,                  // Debug interface: UART TXD
54
    dmem_addr,                     // Data Memory address
55
    dmem_cen,                      // Data Memory chip enable (low active)
56
    dmem_din,                      // Data Memory data input
57
    dmem_wen,                      // Data Memory write enable (low active)
58
    irq_acc,                       // Interrupt request accepted (one-hot signal)
59
    mclk,                          // Main system clock
60
    per_addr,                      // Peripheral address
61
    per_din,                       // Peripheral data input
62 106 olivier.gi
    per_we,                        // Peripheral write enable (high active)
63 33 olivier.gi
    per_en,                        // Peripheral enable (high active)
64
    pmem_addr,                     // Program Memory address
65
    pmem_cen,                      // Program Memory chip enable (low active)
66
    pmem_din,                      // Program Memory data input (optional)
67
    pmem_wen,                      // Program Memory write enable (low active) (optional)
68 111 olivier.gi
    puc_rst,                       // Main system reset
69 33 olivier.gi
    smclk_en,                      // SMCLK enable
70 2 olivier.gi
 
71
// INPUTs
72 106 olivier.gi
    cpu_en,                        // Enable CPU code execution (asynchronous)
73
    dbg_en,                        // Debug interface enable (asynchronous)
74
    dbg_uart_rxd,                  // Debug interface: UART RXD (asynchronous)
75 33 olivier.gi
    dco_clk,                       // Fast oscillator (fast clock)
76
    dmem_dout,                     // Data Memory data output
77
    irq,                           // Maskable interrupts
78
    lfxt_clk,                      // Low frequency oscillator (typ 32kHz)
79
    nmi,                           // Non-maskable interrupt (asynchronous)
80
    per_dout,                      // Peripheral data output
81
    pmem_dout,                     // Program Memory data output
82 106 olivier.gi
    reset_n                        // Reset Pin (low active, asynchronous)
83 2 olivier.gi
);
84
 
85
// OUTPUTs
86
//=========
87 33 olivier.gi
output               aclk_en;      // ACLK enable
88
output               dbg_freeze;   // Freeze peripherals
89
output               dbg_uart_txd; // Debug interface: UART TXD
90
output [`DMEM_MSB:0] dmem_addr;    // Data Memory address
91
output               dmem_cen;     // Data Memory chip enable (low active)
92
output        [15:0] dmem_din;     // Data Memory data input
93
output         [1:0] dmem_wen;     // Data Memory write enable (low active)
94
output        [13:0] irq_acc;      // Interrupt request accepted (one-hot signal)
95
output               mclk;         // Main system clock
96 111 olivier.gi
output        [13:0] per_addr;     // Peripheral address
97 33 olivier.gi
output        [15:0] per_din;      // Peripheral data input
98 106 olivier.gi
output         [1:0] per_we;       // Peripheral write enable (high active)
99 33 olivier.gi
output               per_en;       // Peripheral enable (high active)
100
output [`PMEM_MSB:0] pmem_addr;    // Program Memory address
101
output               pmem_cen;     // Program Memory chip enable (low active)
102
output        [15:0] pmem_din;     // Program Memory data input (optional)
103
output         [1:0] pmem_wen;     // Program Memory write enable (low active) (optional)
104 111 olivier.gi
output               puc_rst;      // Main system reset
105 33 olivier.gi
output               smclk_en;     // SMCLK enable
106 2 olivier.gi
 
107
 
108
// INPUTs
109
//=========
110 106 olivier.gi
input                cpu_en;       // Enable CPU code execution (asynchronous)
111
input                dbg_en;       // Debug interface enable (asynchronous)
112
input                dbg_uart_rxd; // Debug interface: UART RXD (asynchronous)
113 33 olivier.gi
input                dco_clk;      // Fast oscillator (fast clock)
114
input         [15:0] dmem_dout;    // Data Memory data output
115
input         [13:0] irq;          // Maskable interrupts
116
input                lfxt_clk;     // Low frequency oscillator (typ 32kHz)
117
input                nmi;          // Non-maskable interrupt (asynchronous)
118
input         [15:0] per_dout;     // Peripheral data output
119
input         [15:0] pmem_dout;    // Program Memory data output
120 106 olivier.gi
input                reset_n;      // Reset Pin (active low, asynchronous)
121 2 olivier.gi
 
122
 
123
 
124
//=============================================================================
125
// 1)  INTERNAL WIRES/REGISTERS/PARAMETERS DECLARATION
126
//=============================================================================
127
 
128
wire          [7:0] inst_ad;
129
wire          [7:0] inst_as;
130
wire         [11:0] inst_alu;
131
wire                inst_bw;
132 111 olivier.gi
wire                inst_irq_rst;
133
wire                inst_mov;
134 2 olivier.gi
wire         [15:0] inst_dest;
135
wire         [15:0] inst_dext;
136
wire         [15:0] inst_sext;
137
wire          [7:0] inst_so;
138
wire         [15:0] inst_src;
139
wire          [2:0] inst_type;
140 111 olivier.gi
wire          [7:0] inst_jmp;
141 2 olivier.gi
wire          [3:0] e_state;
142
wire                exec_done;
143 111 olivier.gi
wire                decode_noirq;
144
wire                cpu_en_s;
145
wire                cpuoff;
146
wire                oscoff;
147
wire                scg1;
148
wire                por;
149
wire                gie;
150 2 olivier.gi
 
151
wire         [15:0] eu_mab;
152
wire         [15:0] eu_mdb_in;
153
wire         [15:0] eu_mdb_out;
154
wire          [1:0] eu_mb_wr;
155 111 olivier.gi
wire                eu_mb_en;
156 2 olivier.gi
wire         [15:0] fe_mab;
157
wire         [15:0] fe_mdb_in;
158 111 olivier.gi
wire                fe_mb_en;
159
wire                fe_pmem_wait;
160 2 olivier.gi
 
161 111 olivier.gi
wire                pc_sw_wr;
162 2 olivier.gi
wire         [15:0] pc_sw;
163
wire         [15:0] pc;
164
wire         [15:0] pc_nxt;
165
 
166 111 olivier.gi
wire                nmie;
167
wire                nmi_acc;
168
wire                nmi_evt;
169
 
170
wire                wdtie;
171
wire                wdtifg_set;
172
wire                wdtpw_error;
173
wire                wdttmsel;
174
wire                wdt_irq;
175
wire                wdt_reset;
176
 
177
wire                dbg_clk;
178
wire                dbg_rst;
179
wire                dbg_en_s;
180
wire                dbg_halt_st;
181 86 olivier.gi
wire                dbg_halt_cmd;
182
wire                dbg_mem_en;
183
wire                dbg_reg_wr;
184 106 olivier.gi
wire                dbg_cpu_reset;
185 2 olivier.gi
wire         [15:0] dbg_mem_addr;
186
wire         [15:0] dbg_mem_dout;
187
wire         [15:0] dbg_mem_din;
188
wire         [15:0] dbg_reg_din;
189
wire          [1:0] dbg_mem_wr;
190
 
191
wire         [15:0] per_dout_or;
192
wire         [15:0] per_dout_sfr;
193
wire         [15:0] per_dout_wdog;
194 67 olivier.gi
wire         [15:0] per_dout_mpy;
195 2 olivier.gi
wire         [15:0] per_dout_clk;
196
 
197
 
198
//=============================================================================
199
// 2)  GLOBAL CLOCK & RESET MANAGEMENT
200
//=============================================================================
201
 
202 34 olivier.gi
omsp_clock_module clock_module_0 (
203 2 olivier.gi
 
204
// OUTPUTs
205
    .aclk_en      (aclk_en),       // ACLK enablex
206 106 olivier.gi
    .cpu_en_s     (cpu_en_s),      // Enable CPU code execution (synchronous)
207
    .dbg_clk      (dbg_clk),       // Debug unit clock
208
    .dbg_en_s     (dbg_en_s),      // Debug interface enable (synchronous)
209
    .dbg_rst      (dbg_rst),       // Debug unit reset
210 2 olivier.gi
    .mclk         (mclk),          // Main system clock
211
    .per_dout     (per_dout_clk),  // Peripheral data output
212
    .por          (por),           // Power-on reset
213 111 olivier.gi
    .puc_rst      (puc_rst),       // Main system reset
214 2 olivier.gi
    .smclk_en     (smclk_en),      // SMCLK enable
215
 
216
// INPUTs
217 106 olivier.gi
    .cpu_en       (cpu_en),        // Enable CPU code execution (asynchronous)
218
    .dbg_cpu_reset(dbg_cpu_reset), // Reset CPU from debug interface
219
    .dbg_en       (dbg_en),        // Debug interface enable (asynchronous)
220 2 olivier.gi
    .dco_clk      (dco_clk),       // Fast oscillator (fast clock)
221
    .lfxt_clk     (lfxt_clk),      // Low frequency oscillator (typ 32kHz)
222
    .oscoff       (oscoff),        // Turns off LFXT1 clock input
223
    .per_addr     (per_addr),      // Peripheral address
224
    .per_din      (per_din),       // Peripheral data input
225
    .per_en       (per_en),        // Peripheral enable (high active)
226 106 olivier.gi
    .per_we       (per_we),        // Peripheral write enable (high active)
227
    .reset_n      (reset_n),       // Reset Pin (low active, asynchronous)
228 2 olivier.gi
    .scg1         (scg1),          // System clock generator 1. Turns off the SMCLK
229
    .wdt_reset    (wdt_reset)      // Watchdog-timer reset
230
);
231
 
232
 
233
//=============================================================================
234
// 3)  FRONTEND (<=> FETCH & DECODE)
235
//=============================================================================
236
 
237 34 olivier.gi
omsp_frontend frontend_0 (
238 2 olivier.gi
 
239
// OUTPUTs
240
    .dbg_halt_st  (dbg_halt_st),   // Halt/Run status from CPU
241 53 olivier.gi
    .decode_noirq (decode_noirq),  // Frontend decode instruction
242 2 olivier.gi
    .e_state      (e_state),       // Execution state
243
    .exec_done    (exec_done),     // Execution completed
244
    .inst_ad      (inst_ad),       // Decoded Inst: destination addressing mode
245
    .inst_as      (inst_as),       // Decoded Inst: source addressing mode
246
    .inst_alu     (inst_alu),      // ALU control signals
247
    .inst_bw      (inst_bw),       // Decoded Inst: byte width
248
    .inst_dest    (inst_dest),     // Decoded Inst: destination (one hot)
249
    .inst_dext    (inst_dext),     // Decoded Inst: destination extended instruction word
250
    .inst_irq_rst (inst_irq_rst),  // Decoded Inst: Reset interrupt
251
    .inst_jmp     (inst_jmp),      // Decoded Inst: Conditional jump
252 105 olivier.gi
    .inst_mov     (inst_mov),      // Decoded Inst: mov instruction
253 2 olivier.gi
    .inst_sext    (inst_sext),     // Decoded Inst: source extended instruction word
254
    .inst_so      (inst_so),       // Decoded Inst: Single-operand arithmetic
255
    .inst_src     (inst_src),      // Decoded Inst: source (one hot)
256
    .inst_type    (inst_type),     // Decoded Instruction type
257
    .irq_acc      (irq_acc),       // Interrupt request accepted
258
    .mab          (fe_mab),        // Frontend Memory address bus
259
    .mb_en        (fe_mb_en),      // Frontend Memory bus enable
260
    .nmi_acc      (nmi_acc),       // Non-Maskable interrupt request accepted
261
    .pc           (pc),            // Program counter
262
    .pc_nxt       (pc_nxt),        // Next PC value (for CALL & IRQ)
263
 
264
// INPUTs
265 106 olivier.gi
    .cpu_en_s     (cpu_en_s),      // Enable CPU code execution (synchronous)
266 2 olivier.gi
    .cpuoff       (cpuoff),        // Turns off the CPU
267
    .dbg_halt_cmd (dbg_halt_cmd),  // Halt CPU command
268
    .dbg_reg_sel  (dbg_mem_addr[3:0]), // Debug selected register for rd/wr access
269 33 olivier.gi
    .fe_pmem_wait (fe_pmem_wait),  // Frontend wait for Instruction fetch
270 2 olivier.gi
    .gie          (gie),           // General interrupt enable
271
    .irq          (irq),           // Maskable interrupts
272
    .mclk         (mclk),          // Main system clock
273
    .mdb_in       (fe_mdb_in),     // Frontend Memory data bus input
274
    .nmi_evt      (nmi_evt),       // Non-maskable interrupt event
275
    .pc_sw        (pc_sw),         // Program counter software value
276
    .pc_sw_wr     (pc_sw_wr),      // Program counter software write
277 111 olivier.gi
    .puc_rst      (puc_rst),       // Main system reset
278 2 olivier.gi
    .wdt_irq      (wdt_irq)        // Watchdog-timer interrupt
279
);
280
 
281
 
282
//=============================================================================
283
// 4)  EXECUTION UNIT
284
//=============================================================================
285
 
286 34 olivier.gi
omsp_execution_unit execution_unit_0 (
287 2 olivier.gi
 
288
// OUTPUTs
289
    .cpuoff       (cpuoff),        // Turns off the CPU
290
    .dbg_reg_din  (dbg_reg_din),   // Debug unit CPU register data input
291
    .mab          (eu_mab),        // Memory address bus
292
    .mb_en        (eu_mb_en),      // Memory bus enable
293
    .mb_wr        (eu_mb_wr),      // Memory bus write transfer
294
    .mdb_out      (eu_mdb_out),    // Memory data bus output
295
    .oscoff       (oscoff),        // Turns off LFXT1 clock input
296
    .pc_sw        (pc_sw),         // Program counter software value
297
    .pc_sw_wr     (pc_sw_wr),      // Program counter software write
298
    .scg1         (scg1),          // System clock generator 1. Turns off the SMCLK
299
 
300
// INPUTs
301
    .dbg_halt_st  (dbg_halt_st),   // Halt/Run status from CPU
302
    .dbg_mem_dout (dbg_mem_dout),  // Debug unit data output
303
    .dbg_reg_wr   (dbg_reg_wr),    // Debug unit CPU register write
304
    .e_state      (e_state),       // Execution state
305
    .exec_done    (exec_done),     // Execution completed
306
    .gie          (gie),           // General interrupt enable
307
    .inst_ad      (inst_ad),       // Decoded Inst: destination addressing mode
308
    .inst_as      (inst_as),       // Decoded Inst: source addressing mode
309
    .inst_alu     (inst_alu),      // ALU control signals
310
    .inst_bw      (inst_bw),       // Decoded Inst: byte width
311
    .inst_dest    (inst_dest),     // Decoded Inst: destination (one hot)
312
    .inst_dext    (inst_dext),     // Decoded Inst: destination extended instruction word
313
    .inst_irq_rst (inst_irq_rst),  // Decoded Inst: reset interrupt
314
    .inst_jmp     (inst_jmp),      // Decoded Inst: Conditional jump
315 105 olivier.gi
    .inst_mov     (inst_mov),      // Decoded Inst: mov instruction
316 2 olivier.gi
    .inst_sext    (inst_sext),     // Decoded Inst: source extended instruction word
317
    .inst_so      (inst_so),       // Decoded Inst: Single-operand arithmetic
318
    .inst_src     (inst_src),      // Decoded Inst: source (one hot)
319
    .inst_type    (inst_type),     // Decoded Instruction type
320
    .mclk         (mclk),          // Main system clock
321
    .mdb_in       (eu_mdb_in),     // Memory data bus input
322
    .pc           (pc),            // Program counter
323
    .pc_nxt       (pc_nxt),        // Next PC value (for CALL & IRQ)
324 111 olivier.gi
    .puc_rst      (puc_rst)        // Main system reset
325 2 olivier.gi
);
326
 
327
 
328
//=============================================================================
329
// 5)  MEMORY BACKBONE
330
//=============================================================================
331
 
332 34 olivier.gi
omsp_mem_backbone mem_backbone_0 (
333 2 olivier.gi
 
334
// OUTPUTs
335
    .dbg_mem_din  (dbg_mem_din),   // Debug unit Memory data input
336 33 olivier.gi
    .dmem_addr    (dmem_addr),     // Data Memory address
337
    .dmem_cen     (dmem_cen),      // Data Memory chip enable (low active)
338
    .dmem_din     (dmem_din),      // Data Memory data input
339
    .dmem_wen     (dmem_wen),      // Data Memory write enable (low active)
340 2 olivier.gi
    .eu_mdb_in    (eu_mdb_in),     // Execution Unit Memory data bus input
341
    .fe_mdb_in    (fe_mdb_in),     // Frontend Memory data bus input
342 33 olivier.gi
    .fe_pmem_wait (fe_pmem_wait),  // Frontend wait for Instruction fetch
343 2 olivier.gi
    .per_addr     (per_addr),      // Peripheral address
344
    .per_din      (per_din),       // Peripheral data input
345 106 olivier.gi
    .per_we       (per_we),        // Peripheral write enable (high active)
346 2 olivier.gi
    .per_en       (per_en),        // Peripheral enable (high active)
347 33 olivier.gi
    .pmem_addr    (pmem_addr),     // Program Memory address
348
    .pmem_cen     (pmem_cen),      // Program Memory chip enable (low active)
349
    .pmem_din     (pmem_din),      // Program Memory data input (optional)
350
    .pmem_wen     (pmem_wen),      // Program Memory write enable (low active) (optional)
351 2 olivier.gi
 
352
// INPUTs
353
    .dbg_halt_st  (dbg_halt_st),   // Halt/Run status from CPU
354
    .dbg_mem_addr (dbg_mem_addr),  // Debug address for rd/wr access
355
    .dbg_mem_dout (dbg_mem_dout),  // Debug unit data output
356
    .dbg_mem_en   (dbg_mem_en),    // Debug unit memory enable
357
    .dbg_mem_wr   (dbg_mem_wr),    // Debug unit memory write
358 33 olivier.gi
    .dmem_dout    (dmem_dout),     // Data Memory data output
359 2 olivier.gi
    .eu_mab       (eu_mab[15:1]),  // Execution Unit Memory address bus
360
    .eu_mb_en     (eu_mb_en),      // Execution Unit Memory bus enable
361
    .eu_mb_wr     (eu_mb_wr),      // Execution Unit Memory bus write transfer
362
    .eu_mdb_out   (eu_mdb_out),    // Execution Unit Memory data bus output
363
    .fe_mab       (fe_mab[15:1]),  // Frontend Memory address bus
364
    .fe_mb_en     (fe_mb_en),      // Frontend Memory bus enable
365
    .mclk         (mclk),          // Main system clock
366
    .per_dout     (per_dout_or),   // Peripheral data output
367 33 olivier.gi
    .pmem_dout    (pmem_dout),     // Program Memory data output
368 111 olivier.gi
    .puc_rst      (puc_rst)        // Main system reset
369 2 olivier.gi
);
370
 
371
 
372
//=============================================================================
373
// 6)  SPECIAL FUNCTION REGISTERS
374
//=============================================================================
375
 
376 34 olivier.gi
omsp_sfr sfr_0 (
377 2 olivier.gi
 
378
// OUTPUTs
379
    .nmie         (nmie),          // Non-maskable interrupt enable
380
    .per_dout     (per_dout_sfr),  // Peripheral data output
381
    .wdt_irq      (wdt_irq),       // Watchdog-timer interrupt
382
    .wdt_reset    (wdt_reset),     // Watchdog-timer reset
383
    .wdtie        (wdtie),         // Watchdog-timer interrupt enable
384
 
385
// INPUTs
386
    .mclk         (mclk),          // Main system clock
387
    .nmi_acc      (nmi_acc),       // Non-Maskable interrupt request accepted
388
    .per_addr     (per_addr),      // Peripheral address
389
    .per_din      (per_din),       // Peripheral data input
390
    .per_en       (per_en),        // Peripheral enable (high active)
391 106 olivier.gi
    .per_we       (per_we),        // Peripheral write enable (high active)
392 2 olivier.gi
    .por          (por),           // Power-on reset
393 111 olivier.gi
    .puc_rst      (puc_rst),       // Main system reset
394 2 olivier.gi
    .wdtifg_clr   (irq_acc[10]),   // Clear Watchdog-timer interrupt flag
395
    .wdtifg_set   (wdtifg_set),    // Set Watchdog-timer interrupt flag
396
    .wdtpw_error  (wdtpw_error),   // Watchdog-timer password error
397
    .wdttmsel     (wdttmsel)       // Watchdog-timer mode select
398
);
399
 
400
 
401
//=============================================================================
402
// 7)  WATCHDOG TIMER
403
//=============================================================================
404
 
405 34 olivier.gi
omsp_watchdog watchdog_0 (
406 2 olivier.gi
 
407
// OUTPUTs
408
    .nmi_evt      (nmi_evt),       // NMI Event
409
    .per_dout     (per_dout_wdog), // Peripheral data output
410
    .wdtifg_set   (wdtifg_set),    // Set Watchdog-timer interrupt flag
411
    .wdtpw_error  (wdtpw_error),   // Watchdog-timer password error
412
    .wdttmsel     (wdttmsel),      // Watchdog-timer mode select
413
 
414
// INPUTs
415
    .aclk_en      (aclk_en),       // ACLK enable
416
    .dbg_freeze   (dbg_freeze),    // Freeze Watchdog counter
417
    .mclk         (mclk),          // Main system clock
418
    .nmi          (nmi),           // Non-maskable interrupt (asynchronous)
419
    .nmie         (nmie),          // Non-maskable interrupt enable
420
    .per_addr     (per_addr),      // Peripheral address
421
    .per_din      (per_din),       // Peripheral data input
422
    .per_en       (per_en),        // Peripheral enable (high active)
423 106 olivier.gi
    .per_we       (per_we),        // Peripheral write enable (high active)
424 111 olivier.gi
    .puc_rst      (puc_rst),       // Main system reset
425 2 olivier.gi
    .smclk_en     (smclk_en),      // SMCLK enable
426
    .wdtie        (wdtie)          // Watchdog-timer interrupt enable
427
);
428
 
429
 
430
//=============================================================================
431 67 olivier.gi
// 8)  HARDWARE MULTIPLIER
432 2 olivier.gi
//=============================================================================
433 67 olivier.gi
`ifdef MULTIPLIER
434
omsp_multiplier multiplier_0 (
435 2 olivier.gi
 
436 67 olivier.gi
// OUTPUTs
437
    .per_dout     (per_dout_mpy),  // Peripheral data output
438
 
439
// INPUTs
440
    .mclk         (mclk),          // Main system clock
441
    .per_addr     (per_addr),      // Peripheral address
442
    .per_din      (per_din),       // Peripheral data input
443
    .per_en       (per_en),        // Peripheral enable (high active)
444 106 olivier.gi
    .per_we       (per_we),        // Peripheral write enable (high active)
445 111 olivier.gi
    .puc_rst      (puc_rst)        // Main system reset
446 67 olivier.gi
);
447
`else
448
assign per_dout_mpy = 16'h0000;
449
`endif
450
 
451
//=============================================================================
452
// 9)  PERIPHERALS' OUTPUT BUS
453
//=============================================================================
454
 
455 2 olivier.gi
assign  per_dout_or  =  per_dout      |
456
                        per_dout_clk  |
457
                        per_dout_sfr  |
458 67 olivier.gi
                        per_dout_wdog |
459
                        per_dout_mpy;
460 2 olivier.gi
 
461
 
462
//=============================================================================
463 67 olivier.gi
// 10)  DEBUG INTERFACE
464 2 olivier.gi
//=============================================================================
465
 
466
`ifdef DBG_EN
467 34 olivier.gi
omsp_dbg dbg_0 (
468 2 olivier.gi
 
469
// OUTPUTs
470
    .dbg_freeze   (dbg_freeze),    // Freeze peripherals
471
    .dbg_halt_cmd (dbg_halt_cmd),  // Halt CPU command
472
    .dbg_mem_addr (dbg_mem_addr),  // Debug address for rd/wr access
473
    .dbg_mem_dout (dbg_mem_dout),  // Debug unit data output
474
    .dbg_mem_en   (dbg_mem_en),    // Debug unit memory enable
475
    .dbg_mem_wr   (dbg_mem_wr),    // Debug unit memory write
476
    .dbg_reg_wr   (dbg_reg_wr),    // Debug unit CPU register write
477 106 olivier.gi
    .dbg_cpu_reset(dbg_cpu_reset), // Reset CPU from debug interface
478 2 olivier.gi
    .dbg_uart_txd (dbg_uart_txd),  // Debug interface: UART TXD
479
 
480
// INPUTs
481 106 olivier.gi
    .cpu_en_s     (cpu_en_s),      // Enable CPU code execution (synchronous)
482
    .dbg_clk      (dbg_clk),       // Debug unit clock
483
    .dbg_en_s     (dbg_en_s),      // Debug interface enable (synchronous)
484 2 olivier.gi
    .dbg_halt_st  (dbg_halt_st),   // Halt/Run status from CPU
485
    .dbg_mem_din  (dbg_mem_din),   // Debug unit Memory data input
486
    .dbg_reg_din  (dbg_reg_din),   // Debug unit CPU register data input
487 106 olivier.gi
    .dbg_rst      (dbg_rst),       // Debug unit reset
488
    .dbg_uart_rxd (dbg_uart_rxd),  // Debug interface: UART RXD (asynchronous)
489 53 olivier.gi
    .decode_noirq (decode_noirq),  // Frontend decode instruction
490 2 olivier.gi
    .eu_mab       (eu_mab),        // Execution-Unit Memory address bus
491
    .eu_mb_en     (eu_mb_en),      // Execution-Unit Memory bus enable
492
    .eu_mb_wr     (eu_mb_wr),      // Execution-Unit Memory bus write transfer
493
    .eu_mdb_in    (eu_mdb_in),     // Memory data bus input
494
    .eu_mdb_out   (eu_mdb_out),    // Memory data bus output
495
    .exec_done    (exec_done),     // Execution completed
496
    .fe_mb_en     (fe_mb_en),      // Frontend Memory bus enable
497
    .fe_mdb_in    (fe_mdb_in),     // Frontend Memory data bus input
498
    .pc           (pc),            // Program counter
499 111 olivier.gi
    .puc_rst      (puc_rst)        // Main system reset
500 2 olivier.gi
);
501
 
502
`else
503 106 olivier.gi
assign dbg_freeze    =  ~cpu_en_s;
504
assign dbg_halt_cmd  =  1'b0;
505
assign dbg_mem_addr  = 16'h0000;
506
assign dbg_mem_dout  = 16'h0000;
507
assign dbg_mem_en    =  1'b0;
508
assign dbg_mem_wr    =  2'b00;
509
assign dbg_reg_wr    =  1'b0;
510
assign dbg_cpu_reset =  1'b0;
511
assign dbg_uart_txd  =  1'b0;
512 2 olivier.gi
`endif
513
 
514
 
515
endmodule // openMSP430
516
 
517 103 olivier.gi
`ifdef OMSP_NO_INCLUDE
518
`else
519 33 olivier.gi
`include "openMSP430_undefines.v"
520 103 olivier.gi
`endif

powered by: WebSVN 2.1.0

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