1 //----------------------------------------------------------------------------
2 // Copyright (C) 2001 Authors
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
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.
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.
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
23 //----------------------------------------------------------------------------
25 // *File Name: openMSP430.v
27 // *Module Description:
28 // openMSP430 Top level file
31 // - Olivier Girard, olgirard@gmail.com
33 //----------------------------------------------------------------------------
35 // $LastChangedBy: olivier.girard $
36 // $LastChangedDate: 2010-03-07 12:59:38 +0100 (Sun, 07 Mar 2010) $
37 //----------------------------------------------------------------------------
38 `include "timescale.v"
39 `include "openMSP430_defines.v"
44 aclk_en, // ACLK enable
45 dbg_freeze, // Freeze peripherals
46 dbg_uart_txd, // Debug interface: UART TXD
47 dmem_addr, // Data Memory address
48 dmem_cen, // Data Memory chip enable (low active)
49 dmem_din, // Data Memory data input
50 dmem_wen, // Data Memory write enable (low active)
51 irq_acc, // Interrupt request accepted (one-hot signal)
52 mclk, // Main system clock
53 per_addr, // Peripheral address
54 per_din, // Peripheral data input
55 per_wen, // Peripheral write enable (high active)
56 per_en, // Peripheral enable (high active)
57 pmem_addr, // Program Memory address
58 pmem_cen, // Program Memory chip enable (low active)
59 pmem_din, // Program Memory data input (optional)
60 pmem_wen, // Program Memory write enable (low active) (optional)
61 puc, // Main system reset
62 smclk_en, // SMCLK enable
65 dbg_uart_rxd, // Debug interface: UART RXD
66 dco_clk, // Fast oscillator (fast clock)
67 dmem_dout, // Data Memory data output
68 irq, // Maskable interrupts
69 lfxt_clk, // Low frequency oscillator (typ 32kHz)
70 nmi, // Non-maskable interrupt (asynchronous)
71 per_dout, // Peripheral data output
72 pmem_dout, // Program Memory data output
73 reset_n // Reset Pin (low active)
78 output aclk_en; // ACLK enable
79 output dbg_freeze; // Freeze peripherals
80 output dbg_uart_txd; // Debug interface: UART TXD
81 output [`DMEM_MSB:0] dmem_addr; // Data Memory address
82 output dmem_cen; // Data Memory chip enable (low active)
83 output [15:0] dmem_din; // Data Memory data input
84 output [1:0] dmem_wen; // Data Memory write enable (low active)
85 output [13:0] irq_acc; // Interrupt request accepted (one-hot signal)
86 output mclk; // Main system clock
87 output [7:0] per_addr; // Peripheral address
88 output [15:0] per_din; // Peripheral data input
89 output [1:0] per_wen; // Peripheral write enable (high active)
90 output per_en; // Peripheral enable (high active)
91 output [`PMEM_MSB:0] pmem_addr; // Program Memory address
92 output pmem_cen; // Program Memory chip enable (low active)
93 output [15:0] pmem_din; // Program Memory data input (optional)
94 output [1:0] pmem_wen; // Program Memory write enable (low active) (optional)
95 output puc; // Main system reset
96 output smclk_en; // SMCLK enable
101 input dbg_uart_rxd; // Debug interface: UART RXD
102 input dco_clk; // Fast oscillator (fast clock)
103 input [15:0] dmem_dout; // Data Memory data output
104 input [13:0] irq; // Maskable interrupts
105 input lfxt_clk; // Low frequency oscillator (typ 32kHz)
106 input nmi; // Non-maskable interrupt (asynchronous)
107 input [15:0] per_dout; // Peripheral data output
108 input [15:0] pmem_dout; // Program Memory data output
109 input reset_n; // Reset Pin (active low)
113 //=============================================================================
114 // 1) INTERNAL WIRES/REGISTERS/PARAMETERS DECLARATION
115 //=============================================================================
119 wire [11:0] inst_alu;
121 wire [15:0] inst_dest;
122 wire [15:0] inst_dext;
123 wire [15:0] inst_sext;
125 wire [15:0] inst_src;
126 wire [2:0] inst_type;
131 wire [15:0] eu_mdb_in;
132 wire [15:0] eu_mdb_out;
135 wire [15:0] fe_mdb_in;
142 wire [15:0] dbg_mem_addr;
143 wire [15:0] dbg_mem_dout;
144 wire [15:0] dbg_mem_din;
145 wire [15:0] dbg_reg_din;
146 wire [1:0] dbg_mem_wr;
148 wire [15:0] per_dout_or;
149 wire [15:0] per_dout_sfr;
150 wire [15:0] per_dout_wdog;
151 wire [15:0] per_dout_mpy;
152 wire [15:0] per_dout_clk;
155 //=============================================================================
156 // 2) GLOBAL CLOCK & RESET MANAGEMENT
157 //=============================================================================
159 omsp_clock_module clock_module_0 (
162 .aclk_en (aclk_en), // ACLK enablex
163 .mclk (mclk), // Main system clock
164 .per_dout (per_dout_clk), // Peripheral data output
165 .por (por), // Power-on reset
166 .puc (puc), // Main system reset
167 .smclk_en (smclk_en), // SMCLK enable
170 .dbg_reset (dbg_reset), // Reset CPU from debug interface
171 .dco_clk (dco_clk), // Fast oscillator (fast clock)
172 .lfxt_clk (lfxt_clk), // Low frequency oscillator (typ 32kHz)
173 .oscoff (oscoff), // Turns off LFXT1 clock input
174 .per_addr (per_addr), // Peripheral address
175 .per_din (per_din), // Peripheral data input
176 .per_en (per_en), // Peripheral enable (high active)
177 .per_wen (per_wen), // Peripheral write enable (high active)
178 .reset_n (reset_n), // Reset Pin (low active)
179 .scg1 (scg1), // System clock generator 1. Turns off the SMCLK
180 .wdt_reset (wdt_reset) // Watchdog-timer reset
184 //=============================================================================
185 // 3) FRONTEND (<=> FETCH & DECODE)
186 //=============================================================================
188 omsp_frontend frontend_0 (
191 .dbg_halt_st (dbg_halt_st), // Halt/Run status from CPU
192 .decode_noirq (decode_noirq), // Frontend decode instruction
193 .e_state (e_state), // Execution state
194 .exec_done (exec_done), // Execution completed
195 .inst_ad (inst_ad), // Decoded Inst: destination addressing mode
196 .inst_as (inst_as), // Decoded Inst: source addressing mode
197 .inst_alu (inst_alu), // ALU control signals
198 .inst_bw (inst_bw), // Decoded Inst: byte width
199 .inst_dest (inst_dest), // Decoded Inst: destination (one hot)
200 .inst_dext (inst_dext), // Decoded Inst: destination extended instruction word
201 .inst_irq_rst (inst_irq_rst), // Decoded Inst: Reset interrupt
202 .inst_jmp (inst_jmp), // Decoded Inst: Conditional jump
203 .inst_sext (inst_sext), // Decoded Inst: source extended instruction word
204 .inst_so (inst_so), // Decoded Inst: Single-operand arithmetic
205 .inst_src (inst_src), // Decoded Inst: source (one hot)
206 .inst_type (inst_type), // Decoded Instruction type
207 .irq_acc (irq_acc), // Interrupt request accepted
208 .mab (fe_mab), // Frontend Memory address bus
209 .mb_en (fe_mb_en), // Frontend Memory bus enable
210 .nmi_acc (nmi_acc), // Non-Maskable interrupt request accepted
211 .pc (pc), // Program counter
212 .pc_nxt (pc_nxt), // Next PC value (for CALL & IRQ)
215 .cpuoff (cpuoff), // Turns off the CPU
216 .dbg_halt_cmd (dbg_halt_cmd), // Halt CPU command
217 .dbg_reg_sel (dbg_mem_addr[3:0]), // Debug selected register for rd/wr access
218 .fe_pmem_wait (fe_pmem_wait), // Frontend wait for Instruction fetch
219 .gie (gie), // General interrupt enable
220 .irq (irq), // Maskable interrupts
221 .mclk (mclk), // Main system clock
222 .mdb_in (fe_mdb_in), // Frontend Memory data bus input
223 .nmi_evt (nmi_evt), // Non-maskable interrupt event
224 .pc_sw (pc_sw), // Program counter software value
225 .pc_sw_wr (pc_sw_wr), // Program counter software write
226 .puc (puc), // Main system reset
227 .wdt_irq (wdt_irq) // Watchdog-timer interrupt
231 //=============================================================================
233 //=============================================================================
235 omsp_execution_unit execution_unit_0 (
238 .cpuoff (cpuoff), // Turns off the CPU
239 .dbg_reg_din (dbg_reg_din), // Debug unit CPU register data input
240 .mab (eu_mab), // Memory address bus
241 .mb_en (eu_mb_en), // Memory bus enable
242 .mb_wr (eu_mb_wr), // Memory bus write transfer
243 .mdb_out (eu_mdb_out), // Memory data bus output
244 .oscoff (oscoff), // Turns off LFXT1 clock input
245 .pc_sw (pc_sw), // Program counter software value
246 .pc_sw_wr (pc_sw_wr), // Program counter software write
247 .scg1 (scg1), // System clock generator 1. Turns off the SMCLK
250 .dbg_halt_st (dbg_halt_st), // Halt/Run status from CPU
251 .dbg_mem_dout (dbg_mem_dout), // Debug unit data output
252 .dbg_reg_wr (dbg_reg_wr), // Debug unit CPU register write
253 .e_state (e_state), // Execution state
254 .exec_done (exec_done), // Execution completed
255 .gie (gie), // General interrupt enable
256 .inst_ad (inst_ad), // Decoded Inst: destination addressing mode
257 .inst_as (inst_as), // Decoded Inst: source addressing mode
258 .inst_alu (inst_alu), // ALU control signals
259 .inst_bw (inst_bw), // Decoded Inst: byte width
260 .inst_dest (inst_dest), // Decoded Inst: destination (one hot)
261 .inst_dext (inst_dext), // Decoded Inst: destination extended instruction word
262 .inst_irq_rst (inst_irq_rst), // Decoded Inst: reset interrupt
263 .inst_jmp (inst_jmp), // Decoded Inst: Conditional jump
264 .inst_sext (inst_sext), // Decoded Inst: source extended instruction word
265 .inst_so (inst_so), // Decoded Inst: Single-operand arithmetic
266 .inst_src (inst_src), // Decoded Inst: source (one hot)
267 .inst_type (inst_type), // Decoded Instruction type
268 .mclk (mclk), // Main system clock
269 .mdb_in (eu_mdb_in), // Memory data bus input
270 .pc (pc), // Program counter
271 .pc_nxt (pc_nxt), // Next PC value (for CALL & IRQ)
272 .puc (puc) // Main system reset
276 //=============================================================================
277 // 5) MEMORY BACKBONE
278 //=============================================================================
280 omsp_mem_backbone mem_backbone_0 (
283 .dbg_mem_din (dbg_mem_din), // Debug unit Memory data input
284 .dmem_addr (dmem_addr), // Data Memory address
285 .dmem_cen (dmem_cen), // Data Memory chip enable (low active)
286 .dmem_din (dmem_din), // Data Memory data input
287 .dmem_wen (dmem_wen), // Data Memory write enable (low active)
288 .eu_mdb_in (eu_mdb_in), // Execution Unit Memory data bus input
289 .fe_mdb_in (fe_mdb_in), // Frontend Memory data bus input
290 .fe_pmem_wait (fe_pmem_wait), // Frontend wait for Instruction fetch
291 .per_addr (per_addr), // Peripheral address
292 .per_din (per_din), // Peripheral data input
293 .per_wen (per_wen), // Peripheral write enable (high active)
294 .per_en (per_en), // Peripheral enable (high active)
295 .pmem_addr (pmem_addr), // Program Memory address
296 .pmem_cen (pmem_cen), // Program Memory chip enable (low active)
297 .pmem_din (pmem_din), // Program Memory data input (optional)
298 .pmem_wen (pmem_wen), // Program Memory write enable (low active) (optional)
301 .dbg_halt_st (dbg_halt_st), // Halt/Run status from CPU
302 .dbg_mem_addr (dbg_mem_addr), // Debug address for rd/wr access
303 .dbg_mem_dout (dbg_mem_dout), // Debug unit data output
304 .dbg_mem_en (dbg_mem_en), // Debug unit memory enable
305 .dbg_mem_wr (dbg_mem_wr), // Debug unit memory write
306 .dmem_dout (dmem_dout), // Data Memory data output
307 .eu_mab (eu_mab[15:1]), // Execution Unit Memory address bus
308 .eu_mb_en (eu_mb_en), // Execution Unit Memory bus enable
309 .eu_mb_wr (eu_mb_wr), // Execution Unit Memory bus write transfer
310 .eu_mdb_out (eu_mdb_out), // Execution Unit Memory data bus output
311 .fe_mab (fe_mab[15:1]), // Frontend Memory address bus
312 .fe_mb_en (fe_mb_en), // Frontend Memory bus enable
313 .mclk (mclk), // Main system clock
314 .per_dout (per_dout_or), // Peripheral data output
315 .pmem_dout (pmem_dout), // Program Memory data output
316 .puc (puc) // Main system reset
320 //=============================================================================
321 // 6) SPECIAL FUNCTION REGISTERS
322 //=============================================================================
327 .nmie (nmie), // Non-maskable interrupt enable
328 .per_dout (per_dout_sfr), // Peripheral data output
329 .wdt_irq (wdt_irq), // Watchdog-timer interrupt
330 .wdt_reset (wdt_reset), // Watchdog-timer reset
331 .wdtie (wdtie), // Watchdog-timer interrupt enable
334 .mclk (mclk), // Main system clock
335 .nmi_acc (nmi_acc), // Non-Maskable interrupt request accepted
336 .per_addr (per_addr), // Peripheral address
337 .per_din (per_din), // Peripheral data input
338 .per_en (per_en), // Peripheral enable (high active)
339 .per_wen (per_wen), // Peripheral write enable (high active)
340 .por (por), // Power-on reset
341 .puc (puc), // Main system reset
342 .wdtifg_clr (irq_acc[10]), // Clear Watchdog-timer interrupt flag
343 .wdtifg_set (wdtifg_set), // Set Watchdog-timer interrupt flag
344 .wdtpw_error (wdtpw_error), // Watchdog-timer password error
345 .wdttmsel (wdttmsel) // Watchdog-timer mode select
349 //=============================================================================
351 //=============================================================================
353 omsp_watchdog watchdog_0 (
356 .nmi_evt (nmi_evt), // NMI Event
357 .per_dout (per_dout_wdog), // Peripheral data output
358 .wdtifg_set (wdtifg_set), // Set Watchdog-timer interrupt flag
359 .wdtpw_error (wdtpw_error), // Watchdog-timer password error
360 .wdttmsel (wdttmsel), // Watchdog-timer mode select
363 .aclk_en (aclk_en), // ACLK enable
364 .dbg_freeze (dbg_freeze), // Freeze Watchdog counter
365 .mclk (mclk), // Main system clock
366 .nmi (nmi), // Non-maskable interrupt (asynchronous)
367 .nmie (nmie), // Non-maskable interrupt enable
368 .per_addr (per_addr), // Peripheral address
369 .per_din (per_din), // Peripheral data input
370 .per_en (per_en), // Peripheral enable (high active)
371 .per_wen (per_wen), // Peripheral write enable (high active)
372 .puc (puc), // Main system reset
373 .smclk_en (smclk_en), // SMCLK enable
374 .wdtie (wdtie) // Watchdog-timer interrupt enable
378 //=============================================================================
379 // 8) HARDWARE MULTIPLIER
380 //=============================================================================
382 omsp_multiplier multiplier_0 (
385 .per_dout (per_dout_mpy), // Peripheral data output
388 .mclk (mclk), // Main system clock
389 .per_addr (per_addr), // Peripheral address
390 .per_din (per_din), // Peripheral data input
391 .per_en (per_en), // Peripheral enable (high active)
392 .per_wen (per_wen), // Peripheral write enable (high active)
393 .puc (puc) // Main system reset
396 assign per_dout_mpy = 16'h0000;
399 //=============================================================================
400 // 9) PERIPHERALS' OUTPUT BUS
401 //=============================================================================
403 assign per_dout_or = per_dout |
410 //=============================================================================
411 // 10) DEBUG INTERFACE
412 //=============================================================================
418 .dbg_freeze (dbg_freeze), // Freeze peripherals
419 .dbg_halt_cmd (dbg_halt_cmd), // Halt CPU command
420 .dbg_mem_addr (dbg_mem_addr), // Debug address for rd/wr access
421 .dbg_mem_dout (dbg_mem_dout), // Debug unit data output
422 .dbg_mem_en (dbg_mem_en), // Debug unit memory enable
423 .dbg_mem_wr (dbg_mem_wr), // Debug unit memory write
424 .dbg_reg_wr (dbg_reg_wr), // Debug unit CPU register write
425 .dbg_reset (dbg_reset), // Reset CPU from debug interface
426 .dbg_uart_txd (dbg_uart_txd), // Debug interface: UART TXD
429 .dbg_halt_st (dbg_halt_st), // Halt/Run status from CPU
430 .dbg_mem_din (dbg_mem_din), // Debug unit Memory data input
431 .dbg_reg_din (dbg_reg_din), // Debug unit CPU register data input
432 .dbg_uart_rxd (dbg_uart_rxd), // Debug interface: UART RXD
433 .decode_noirq (decode_noirq), // Frontend decode instruction
434 .eu_mab (eu_mab), // Execution-Unit Memory address bus
435 .eu_mb_en (eu_mb_en), // Execution-Unit Memory bus enable
436 .eu_mb_wr (eu_mb_wr), // Execution-Unit Memory bus write transfer
437 .eu_mdb_in (eu_mdb_in), // Memory data bus input
438 .eu_mdb_out (eu_mdb_out), // Memory data bus output
439 .exec_done (exec_done), // Execution completed
440 .fe_mb_en (fe_mb_en), // Frontend Memory bus enable
441 .fe_mdb_in (fe_mdb_in), // Frontend Memory data bus input
442 .mclk (mclk), // Main system clock
443 .pc (pc), // Program counter
444 .por (por), // Power on reset
445 .puc (puc) // Main system reset
449 assign dbg_freeze = 1'b0;
450 assign dbg_halt_cmd = 1'b0;
451 assign dbg_mem_addr = 16'h0000;
452 assign dbg_mem_dout = 16'h0000;
453 assign dbg_mem_en = 1'b0;
454 assign dbg_mem_wr = 2'b00;
455 assign dbg_reg_wr = 1'b0;
456 assign dbg_reset = 1'b0;
457 assign dbg_uart_txd = 1'b0;
461 endmodule // openMSP430
463 `include "openMSP430_undefines.v"