//-----------------------------------------------------------------------------
// customised top-level example Cortex-M0 controller
// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
//
// Contributors
//
// David Flynn (d.w.flynn@soton.ac.uk)
//
// Copyright � 2021-2, SoC Labs (www.soclabs.org)
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// The confidential and proprietary information contained in this file may
// only be used by a person authorised under and to the extent permitted
// by a subsisting licensing agreement from Arm Limited or its affiliates.
//
// (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
// ALL RIGHTS RESERVED
//
// This entire notice must be reproduced on all copies of this file
// and copies of this file may only be made by a person if such person is
// permitted to do so under the terms of a subsisting license agreement
// from Arm Limited or its affiliates.
//
// SVN Information
//
// Checked In : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
//
// Revision : $Revision: 371321 $
//
// Release Information : Cortex-M System Design Kit-r1p1-00rel0
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller
//-----------------------------------------------------------------------------
//
`include "cmsdk_mcu_defs.v"
module cmsdk_mcu_chip
#(
//-----------------------------------------
// CPU options
`ifdef ARM_CMSDK_INCLUDE_CLKGATE
parameter CLKGATE_PRESENT = 1,
`else
parameter CLKGATE_PRESENT = 0,
`endif
parameter BE = 0, // Big or little endian
parameter BKPT = 4, // Number of breakpoint comparators
parameter DBG = 1, // Debug configuration
parameter NUMIRQ = 32, // NUM of IRQ
parameter SMUL = 0, // Multiplier configuration
parameter SYST = 1, // SysTick
parameter WIC = 1, // Wake-up interrupt controller support
parameter WICLINES = 34, // Supported WIC lines
parameter WPT = 2, // Number of DWT comparators
parameter RESET_ALL_REGS = 0, // Do not reset all registers
parameter BOOT_MEM_TYPE = `ARM_CMSDK_BOOT_MEM_TYPE, // Boot loader memory type
parameter ROM_MEM_TYPE = `ARM_CMSDK_ROM_MEM_TYPE, // ROM memory type
parameter RAM_MEM_TYPE = `ARM_CMSDK_RAM_MEM_TYPE, // RAM memory type
//-----------------------------------------
// System options
`ifdef ARM_CMSDK_INCLUDE_DMA
parameter INCLUDE_DMA = 1, // Include instantiation of DMA-230
// This option also add a number of bus components
parameter DMA_CHANNEL_NUM = 1,
`else
parameter INCLUDE_DMA = 0,
parameter DMA_CHANNEL_NUM = 1,
`endif
`ifdef ARM_CMSDK_INCLUDE_BITBAND
parameter INCLUDE_BITBAND = 1,
// Include instantiation of Bit-band wrapper
// This option add bit band wrapper to CPU interface
`else
parameter INCLUDE_BITBAND = 0,
`endif
`ifdef ARM_CMSDK_INCLUDE_JTAG
parameter INCLUDE_JTAG = 1 // Include JTAG feature
`else
parameter INCLUDE_JTAG = 0 // Do not Include JTAG feature
`endif
)
(
`ifdef POWER_PINS
inout wire VDDIO,
inout wire VSSIO,
inout wire VDD,
inout wire VSS,
`endif
input wire xtal_clk_i,
output wire xtal_clk_o,
input wire nrst_i,
input wire [15:0] p0_i, // level-shifted input from pad
output wire [15:0] p0_o, // output port drive
output wire [15:0] p0_e, // active high output drive enable (pad tech dependent)
output wire [15:0] p0_z, // active low output drive enable (pad tech dependent)
input wire [15:0] p1_i, // level-shifted input from pad
output wire [15:0] p1_o, // output port drive
output wire [15:0] p1_e, // active high output drive enable (pad tech dependent)
output wire [15:0] p1_z, // active low output drive enable (pad tech dependent)
`ifdef ARM_CMSDK_INCLUDE_JTAG
input wire ntrst_i,
input wire tdi_i,
output wire tdo_o,
`endif
input wire swdio_i,
output wire swdio_o,
output wire swdio_e,
output wire swdio_z,
input wire swdclk_i
);
//------------------------------------
// CMSDK internal wire naming preserved
wire xtal_clk_in = xtal_clk_i;
wire xtal_clk_out;
assign xtal_clk_o = xtal_clk_out;
wire nrst_in = nrst_i;
wire [15:0] p0_in; // level-shifted input from pad
wire [15:0] p0_out; // output port drive
wire [15:0] p0_out_en; // active high output drive enable (pad tech dependent)
wire [15:0] p0_out_nen; // active low output drive enable (pad tech dependent)
wire [15:0] p1_in; // level-shifted input from pad
wire [15:0] p1_out; // output port drive
wire [15:0] p1_out_en; // active high output drive enable (pad tech dependent)
wire [15:0] p1_out_nen; // active low output drive enable (pad tech dependent)
wire [15:0] p1_in_mux; // level-shifted input from pad
wire [15:0] p1_out_mux; // output port drive
wire [15:0] p1_out_en_mux; // active high output drive enable (pad tech dependent)
wire [15:0] p1_out_nen_mux; // active low output drive enable (pad tech dependent)
`ifdef ARM_CMSDK_INCLUDE_JTAG
wire ntrst_in;
wire tdi_in;
wire tdo_out;
`endif
wire swdio_in;
wire swdio_out;
wire swdio_out_en;
wire swdio_out_nen;
wire swdclk_in;
wire ft_clk_o;
wire ft_ssn_o;
wire ft_miso_i;
wire ft_miosio_o;
wire ft_miosio_e;
wire ft_miosio_z;
wire ft_miosio_i;
// --------------------------------------------------------------------------------
// Port-0 IO pad driver mapping
// --------------------------------------------------------------------------------
assign p0_in = p0_i; // level-shifted input from pad
assign p0_o = p0_out; // output port drive
assign p0_e = p0_out_en; // active high output drive enable (pad tech dependent)
assign p0_z = p0_out_nen; // active low output drive enable (pad tech dependent)
// --------------------------------------------------------------------------------
// Port-1 IO pad driver mapping
// --------------------------------------------------------------------------------
// modify p1_mux [3:0] for ft1248 interface
// assign p1_in_mux[3:0] = p1_i[3:0]; // IO MUX controlled bidirectionals
// assign p1_o[3:0] = p1_out_mux[3:0];
// assign p1_e[3:0] = p1_out_en_mux[3:0];
// assign p1_z[3:0] = p1_out_nen_mux[3:0];
assign ft_miso_i = p1_i[0]; // FT_MISO INPUT pad configuration
assign p1_in_mux[0] = p1_i[0];
assign p1_o[0] = 1'b0;
assign p1_e[0] = 1'b0;
assign p1_z[0] = 1'b1;
assign p1_in_mux[1] = p1_i[1]; // FT_CLK OUTPUT pad configuration
assign p1_o[1] = ft_clk_o;
assign p1_e[1] = 1'b1;
assign p1_z[1] = 1'b0;
assign ft_miosio_i = p1_i[2]; // FT_MIOSIO INOUT pad configuration
assign p1_in_mux[2] = p1_i[2];
assign p1_o[2] = ft_miosio_o;
assign p1_e[2] = ft_miosio_e;
assign p1_z[2] = ft_miosio_z;
assign p1_in_mux[3] = p1_i[3]; // FT_SSN OUTPUT pad configuration
assign p1_o[3] = ft_ssn_o;
assign p1_e[3] = 1'b1;
assign p1_z[3] = 1'b0;
assign p1_in_mux[15:4] = p1_i[15:4]; // IO MUX controlled bidirectionals
assign p1_o[15:4] = p1_out_mux[15:4];
assign p1_e[15:4] = p1_out_en_mux[15:4];
assign p1_z[15:4] = p1_out_nen_mux[15:4];
//TIE_HI uTIEHI (.tiehi(tiehi));
wire tiehi = 1'b1;
//TIE_LO uTIELO (.tielo(tielo));
wire tielo = 1'b0;
//------------------------------------
// internal wires
assign p0_out_nen = ~p0_out_en; //active low pad drive option
assign p1_out_nen_mux = ~p1_out_en_mux; //active low pad drive option
wire SLEEPING;
wire APBACTIVE;
wire SYSRESETREQ; // processor system reset request
wire WDOGRESETREQ; // watchdog system reset request
wire HRESETREQ; // Combined system reset request
wire cmsdk_SYSRESETREQ; // Combined system reset request
wire clk_ctrl_sys_reset_req;
wire PMUHRESETREQ;
wire PMUDBGRESETREQ;
wire LOCKUP;
wire LOCKUPRESET;
wire PMUENABLE;
wire SLEEPDEEP;
wire ADPRESETREQ;
`ifdef CORTEX_M0DESIGNSTART
// if using DesignStart CortexM0, remove these signals
`else
wire WAKEUP;
wire GATEHCLK;
wire WICENREQ;
wire WICENACK;
wire CDBGPWRUPREQ;
wire CDBGPWRUPACK;
wire SLEEPHOLDREQn;
wire SLEEPHOLDACKn;
wire SYSPWRDOWNACK;
wire DBGPWRDOWNACK;
wire SYSPWRDOWN;
wire DBGPWRDOWN;
wire SYSISOLATEn;
wire SYSRETAINn;
wire DBGISOLATEn;
`endif
wire PORESETn;// Power on reset
wire HRESETn; // AHB reset
wire PRESETn; // APB and peripheral reset
`ifndef CORTEX_M0DESIGNSTART
wire DBGRESETn; // Debug system reset
`endif
wire FCLK; // Free running system clock
wire HCLK; // System clock from PMU
`ifndef CORTEX_M0DESIGNSTART
wire DCLK;
`endif
wire SCLK;
wire PCLK; // Peripheral clock
wire PCLKG; // Gated PCLK for APB
wire HCLKSYS; // System clock for memory
wire PCLKEN; // Clock divider for AHB to APB bridge
// Common AHB signals
wire [31:0] HADDR;
wire [1:0] HTRANS;
wire [2:0] HSIZE;
wire HWRITE;
wire [31:0] HWDATA;
wire HREADY;
// DMA controller master interface
wire [31:0] ahbx_haddr;
wire [1:0] ahbx_htrans;
wire [2:0] ahbx_hsize;
wire [2:0] ahbx_hburst;
wire [3:0] ahbx_hprot;
wire ahbx_hmastlock;
wire ahbx_hwrite;
wire [31:0] ahbx_hwdata;
wire [31:0] ahbx_hrdata;
wire ahbx_hready;
wire ahbx_hresp;
wire ahbx_done;
wire ahbx_err;
wire exp_penable;
wire exp_pwrite;
wire [11:0] exp_paddr;
wire [31:0] exp_pwdata;
wire exp15_psel;
wire exp15_pready;
wire exp15_pslverr;
wire [31:0] exp15_prdata;
wire exp14_psel;
wire exp14_pready;
wire exp14_pslverr;
wire [31:0] exp14_prdata;
// Flash memory AHB signals
wire flash_hsel;
wire flash_hreadyout;
wire [31:0] flash_hrdata;
wire flash_hresp;
// SRAM AHB signals
wire sram_hsel;
wire sram_hreadyout;
wire [31:0] sram_hrdata;
wire sram_hresp;
// Boot loader/firmware AHB signals
// Only use if BOOT_MEM_TYPE is not zero
wire boot_hsel;
wire boot_hreadyout;
wire [31:0] boot_hrdata;
wire boot_hresp;
// internal peripheral signals
wire uart0_rxd;
wire uart0_txd;
wire uart0_txen;
wire uart1_rxd;
wire uart1_txd;
wire uart1_txen;
wire uart2_rxd;
wire uart2_txd;
wire uart2_txen;
wire timer0_extin;
wire timer1_extin;
wire [15:0] p0_altfunc;
wire [15:0] p1_altfunc;
localparam BASEADDR_GPIO0 = 32'h4001_0000;
localparam BASEADDR_GPIO1 = 32'h4001_1000;
localparam BASEADDR_SYSROMTABLE = 32'hF000_0000;
`ifdef CORTEX_M0PLUS
`ifdef ARM_CMSDK_INCLUDE_MTB
// MTB Control
wire TSTART;
wire TSTOP;
// EMBEDDED SRAM (MTB) INTERFACE
wire RAMHCLK;
wire [31:0] RAMRD;
wire [AWIDTH-3:0] RAMAD;
wire [31:0] RAMWD;
wire RAMCS;
wire [ 3:0] RAMWE;
localparam BASEADDR_MTBSRAM = 32'hF021_0000;
wire [31:0] SRAMBASEADDR = BASEADDR_MTBSRAM;
`endif
`endif
// Internal Debug signals
wire i_trst_n;
wire i_swditms;
wire i_swclktck;
wire i_tdi;
wire i_tdo;
wire i_tdoen_n;
wire i_swdo;
wire i_swdoen;
wire TESTMODE;
`ifdef ARM_CMSDK_INCLUDE_JTAG
`else
// Serial wire debug is used. nTRST, TDI and TDO are not needed
wire nTRST = 1'b0;
wire TDI = 1'b1;
wire TDO;
`endif
assign TESTMODE = 1'b0;
//----------------------------------------
// Clock and reset controller
//----------------------------------------
`ifdef CORTEX_M0DESIGNSTART
// Clock controller generates reset if PMU request (PMUHRESETREQ),
// CPU request or watchdog request (SYSRESETREQ)
assign clk_ctrl_sys_reset_req = PMUHRESETREQ | cmsdk_SYSRESETREQ;
`else
// Clock controller generates reset if PMU request (PMUHRESETREQ),
// CPU request or watchdog request (HRESETREQ)
assign clk_ctrl_sys_reset_req = PMUHRESETREQ | HRESETREQ;
`endif
// Clock controller to generate reset and clock signals
cmsdk_mcu_clkctrl
#(.CLKGATE_PRESENT(CLKGATE_PRESENT))
u_cmsdk_mcu_clkctrl(
// inputs
.XTAL1 (xtal_clk_in),
.NRST (nrst_in),
.APBACTIVE (APBACTIVE),
.SLEEPING (SLEEPING),
.SLEEPDEEP (SLEEPDEEP),
.LOCKUP (LOCKUP),
.LOCKUPRESET (LOCKUPRESET),
.SYSRESETREQ (clk_ctrl_sys_reset_req),
.DBGRESETREQ (PMUDBGRESETREQ),
.CGBYPASS (TESTMODE),
.RSTBYPASS (TESTMODE),
// outputs
.XTAL2 (xtal_clk_out),
.FCLK (FCLK),
.PCLK (PCLK),
.PCLKG (PCLKG),
.PCLKEN (PCLKEN),
`ifdef CORTEX_M0DESIGNSTART
.PORESETn (PORESETn), // for cm0 designstart
.HRESETn (HRESETn), // for cm0 designstart
`endif
.PRESETn (PRESETn)
);
//----------------------------------------
//
// System Reset request can be from processor or watchdog
// or when lockup happens and the control flag is set.
assign cmsdk_SYSRESETREQ = SYSRESETREQ | WDOGRESETREQ |
ADPRESETREQ |
(LOCKUP & LOCKUPRESET);
`ifdef CORTEX_M0DESIGNSTART
// Power Management Unit will not be available
assign HCLK = FCLK; // connect HCLK to FCLK
assign SCLK = FCLK; // connect SCLK to FCLK
// Since there is no PMU, these signals are not used
assign PMUDBGRESETREQ = 1'b0;
assign PMUHRESETREQ = 1'b0;
`else
wire gated_hclk;
wire gated_dclk;
wire gated_sclk;
`ifdef CORTEX_M0
// Cortex-M0 Power management unit
cortexm0_pmu u_cortexm0_pmu
( // Inputs
.FCLK (FCLK),
.PORESETn (PORESETn),
.HRESETREQ (cmsdk_SYSRESETREQ), // from processor / watchdog
.PMUENABLE (PMUENABLE), // from System Controller
.WICENACK (WICENACK), // from WIC in integration
.WAKEUP (WAKEUP), // from WIC in integration
.CDBGPWRUPREQ (CDBGPWRUPREQ),
.SLEEPDEEP (SLEEPDEEP),
.SLEEPHOLDACKn (SLEEPHOLDACKn),
.GATEHCLK (GATEHCLK),
.SYSPWRDOWNACK (SYSPWRDOWNACK),
.DBGPWRDOWNACK (DBGPWRDOWNACK),
.CGBYPASS (TESTMODE),
// Outputs
.HCLK (gated_hclk),
.DCLK (gated_dclk),
.SCLK (gated_sclk),
.WICENREQ (WICENREQ),
.CDBGPWRUPACK (CDBGPWRUPACK),
.SYSISOLATEn (SYSISOLATEn),
.SYSRETAINn (SYSRETAINn),
.SYSPWRDOWN (SYSPWRDOWN),
.DBGISOLATEn (DBGISOLATEn),
.DBGPWRDOWN (DBGPWRDOWN),
.SLEEPHOLDREQn (SLEEPHOLDREQn),
.PMUDBGRESETREQ (PMUDBGRESETREQ),
.PMUHRESETREQ (PMUHRESETREQ)
);
cortexm0_rst_ctl u_rst_ctl
(// Inputs
.GLOBALRESETn (nrst_in),
.FCLK (FCLK),
.HCLK (gated_hclk),
.DCLK (gated_dclk),
.SYSRESETREQ (cmsdk_SYSRESETREQ),
.PMUHRESETREQ (PMUHRESETREQ),
.PMUDBGRESETREQ (PMUDBGRESETREQ),
.RSTBYPASS (1'b0),
.SE (1'b0),
// Outputs
.PORESETn (PORESETn),
.HRESETn (HRESETn),
.DBGRESETn (DBGRESETn),
.HRESETREQ (HRESETREQ));
`else
// Cortex-M0+ Power management unit
cm0p_ik_pmu u_cortexm0plus_pmu
( // Inputs
.FCLK (FCLK),
.PORESETn (PORESETn),
.HRESETREQ (HRESETREQ),
.PMUENABLE (PMUENABLE),
.WICENACK (WICENACK),
.WAKEUP (WAKEUP),
.CDBGPWRUPREQ (CDBGPWRUPREQ),
.SLEEPDEEP (SLEEPDEEP),
.SLEEPHOLDACKn (SLEEPHOLDACKn),
.GATEHCLK (GATEHCLK),
.SYSPWRDOWNACK (SYSPWRDOWNACK),
.DBGPWRDOWNACK (DBGPWRDOWNACK),
.DFTSE (1'b0),
// Outputs
.HCLK (gated_hclk),
.DCLK (gated_dclk),
.SCLK (gated_sclk),
.WICENREQ (WICENREQ),
.CDBGPWRUPACK (CDBGPWRUPACK),
.SYSISOLATEn (SYSISOLATEn),
.SYSRETAINn (SYSRETAINn),
.SYSPWRDOWN (SYSPWRDOWN),
.DBGISOLATEn (DBGISOLATEn),
.DBGPWRDOWN (DBGPWRDOWN),
.SLEEPHOLDREQn (SLEEPHOLDREQn),
.PMUHRESETREQ (PMUHRESETREQ),
.PMUDBGRESETREQ (PMUDBGRESETREQ)
);
cm0p_ik_rst_ctl u_rst_ctl
(// Inputs
.GLOBALRESETn (nrst_in),
.FCLK (FCLK),
.HCLK (gated_hclk),
.DCLK (gated_dclk),
.SYSRESETREQ (cmsdk_SYSRESETREQ),
.PMUHRESETREQ (PMUHRESETREQ),
.PMUDBGRESETREQ (PMUDBGRESETREQ),
.HREADY (HREADY),
.DFTRSTDISABLE (1'b0),
.DFTSE (1'b0),
// Outputs
.PORESETn (PORESETn),
.HRESETn (HRESETn),
.DBGRESETn (DBGRESETn),
.HRESETREQ (HRESETREQ));
`endif
// Bypass clock gating cell in PMU if CLKGATE_PRESENT is 0
assign HCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_hclk;
assign DCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_dclk;
assign SCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_sclk;
// In this example system, power control takes place immediately.
// In a real circuit you might need to add delays in the next two
// signal assignments for correct operation.
assign SYSPWRDOWNACK = SYSPWRDOWN;
assign DBGPWRDOWNACK = DBGPWRDOWN;
`endif
// -------------------------------
// DMA Controller - ADP engine
// -------------------------------
wire comio_tx_ready;
wire [7:0] comio_tx_data8;
wire comio_tx_valid;
wire comio_rx_ready;
wire [7:0] comio_rx_data8;
wire comio_rx_valid;
wire stdio_tx_ready;
wire [7:0] stdio_tx_data8;
wire stdio_tx_valid;
wire stdio_rx_ready;
wire [7:0] stdio_rx_data8;
wire stdio_rx_valid;
wire [7:0] adp_gpo8;
wire [7:0] adp_gpi8;
assign adp_gpi8 = adp_gpo8;
assign ADPRESETREQ = adp_gpo8[0];
// DMA controller present
ADPcontrol_v1_0 u_ADP (
// Clock and Reset
.ahb_hclk (HCLKSYS),
.ahb_hresetn (HRESETn),
// DMA Control
.com_rx_tready (comio_rx_ready),
.com_rx_tdata (comio_rx_data8),
.com_rx_tvalid (comio_rx_valid),
.com_tx_tready (comio_tx_ready),
.com_tx_tdata (comio_tx_data8),
.com_tx_tvalid (comio_tx_valid),
.stdio_rx_tready (stdio_rx_ready),
.stdio_rx_tdata (stdio_rx_data8),
.stdio_rx_tvalid (stdio_rx_valid),
.stdio_tx_tready (stdio_tx_ready),
.stdio_tx_tdata (stdio_tx_data8),
.stdio_tx_tvalid (stdio_tx_valid),
.gpo8 (adp_gpo8),
.gpi8 (adp_gpi8),
// AHB-Lite Master Interface
.ahb_hready (ahbx_hready),
.ahb_hresp (ahbx_hresp),
.ahb_hrdata (ahbx_hrdata),
.ahb_htrans (ahbx_htrans),
.ahb_hwrite (ahbx_hwrite),
.ahb_haddr (ahbx_haddr),
.ahb_hsize (ahbx_hsize),
.ahb_hburst (ahbx_hburst),
.ahb_hmastlock (ahbx_hmastlock),
.ahb_hprot (ahbx_hprot),
.ahb_hwdata (ahbx_hwdata)
);
cmsdk_apb_usrt u_apb_usrt_com (
.PCLK (PCLK), // Peripheral clock
.PCLKG (PCLKG), // Gated PCLK for bus
.PRESETn (PRESETn), // Reset
.PSEL (exp14_psel), // APB interface inputs
.PADDR (exp_paddr[11:2]),
.PENABLE (exp_penable),
.PWRITE (exp_pwrite),
.PWDATA (exp_pwdata),
.PRDATA (exp14_prdata), // APB interface outputs
.PREADY (exp14_pready),
.PSLVERR (exp14_pslverr),
.ECOREVNUM (4'h0),// Engineering-change-order revision bits
.TX_VALID_o (stdio_rx_valid),
.TX_DATA8_o (stdio_rx_data8),
.TX_READY_i (stdio_rx_ready),
.RX_VALID_i (stdio_tx_valid),
.RX_DATA8_i (stdio_tx_data8),
.RX_READY_o (stdio_tx_ready),
.TXINT ( ), // Transmit Interrupt
.RXINT ( ), // Receive Interrupt
.TXOVRINT ( ), // Transmit Overrun Interrupt
.RXOVRINT ( ), // Receive Overrun Interrupt
.UARTINT ( ) // Combined Interrupt
);
wire [7:0] ft_clkdiv = 8'd03;
ft1248_streamio_v1_0 #
(.FT1248_WIDTH (1),
.FT1248_CLKON(0) )
u_ftdio_com (
.clk (HCLKSYS),
.resetn (HRESETn),
.ft_clkdiv (ft_clkdiv ),
.ft_clk_o (ft_clk_o ),
.ft_ssn_o (ft_ssn_o ),
.ft_miso_i (ft_miso_i ),
.ft_miosio_o (ft_miosio_o ),
.ft_miosio_e (ft_miosio_e ),
.ft_miosio_z (ft_miosio_z ),
.ft_miosio_i (ft_miosio_i ),
.rxd_tready (comio_tx_ready),
.rxd_tdata (comio_tx_data8),
.rxd_tvalid (comio_tx_valid),
.rxd_tlast (1'b0),
.txd_tready (comio_rx_ready),
.txd_tdata (comio_rx_data8),
.txd_tvalid (comio_rx_valid),
.txd_tlast ( )
);
//---------------------------------------------------
// System design for example Cortex-M0/Cortex-M0+ MCU
//---------------------------------------------------
cmsdk_mcu_system
#(.CLKGATE_PRESENT (CLKGATE_PRESENT),
.BE (BE),
.BASEADDR_GPIO0 (BASEADDR_GPIO0), // GPIO0 Base Address
.BASEADDR_GPIO1 (BASEADDR_GPIO1), // GPIO1 Base Address
.BKPT (BKPT), // Number of breakpoint comparators
.DBG (DBG), // Debug configuration
.NUMIRQ (NUMIRQ), // NUMIRQ
.SMUL (SMUL), // Multiplier configuration
.SYST (SYST), // SysTick
.WIC (WIC), // Wake-up interrupt controller support
.WICLINES (WICLINES), // Supported WIC lines
.WPT (WPT), // Number of DWT comparators
.RESET_ALL_REGS (RESET_ALL_REGS), // Do not reset all registers
.BOOT_MEM_TYPE (BOOT_MEM_TYPE), // Boot loader memory type
.INCLUDE_DMA (INCLUDE_DMA), // Include DMA feature
.DMA_CHANNEL_NUM (DMA_CHANNEL_NUM), // and number of channels
.INCLUDE_BITBAND (INCLUDE_BITBAND), // Include bit band wrapper
.INCLUDE_JTAG (INCLUDE_JTAG), // Include JTAG feature
.BASEADDR_SYSROMTABLE (BASEADDR_SYSROMTABLE) // System ROM Table base address
)
u_cmsdk_mcu_system (
.FCLK (FCLK),
.HCLK (HCLK),
`ifndef CORTEX_M0DESIGNSTART
.DCLK (DCLK),
`endif
.SCLK (SCLK),
.HRESETn (HRESETn),
.PORESETn (PORESETn),
`ifdef CORTEX_M0
.DBGRESETn (DBGRESETn),
.RSTBYPASS (TESTMODE),
`endif
.PCLK (PCLK),
.PCLKG (PCLKG),
.PRESETn (PRESETn),
.PCLKEN (PCLKEN),
// Common AHB signals
.HADDR (HADDR),
.HTRANS (HTRANS),
.HSIZE (HSIZE),
.HWRITE (HWRITE),
.HWDATA (HWDATA),
.HREADY (HREADY),
// Flash
.flash_hsel (flash_hsel),
.flash_hreadyout (flash_hreadyout),
.flash_hrdata (flash_hrdata),
.flash_hresp (flash_hresp),
// SRAM
.sram_hsel (sram_hsel),
.sram_hreadyout (sram_hreadyout),
.sram_hrdata (sram_hrdata),
.sram_hresp (sram_hresp),
// Optional boot loader
// Only use if BOOT_MEM_TYPE is not zero
.boot_hsel (boot_hsel),
.boot_hreadyout (boot_hreadyout),
.boot_hrdata (boot_hrdata),
.boot_hresp (boot_hresp),
// Status
.APBACTIVE (APBACTIVE),
.SLEEPING (SLEEPING),
.SYSRESETREQ (SYSRESETREQ),
.WDOGRESETREQ (WDOGRESETREQ),
.LOCKUP (LOCKUP),
.LOCKUPRESET (LOCKUPRESET),
.PMUENABLE (PMUENABLE),
.SLEEPDEEP (SLEEPDEEP),
`ifdef CORTEX_M0DESIGNSTART
`else //if using DesignStart CortexM0, remove these signals
.GATEHCLK (GATEHCLK),
.WAKEUP (WAKEUP),
.WICENREQ (WICENREQ),
.WICENACK (WICENACK),
.CDBGPWRUPREQ (CDBGPWRUPREQ),
.CDBGPWRUPACK (CDBGPWRUPACK),
.SLEEPHOLDREQn (SLEEPHOLDREQn),
.SLEEPHOLDACKn (SLEEPHOLDACKn),
// Debug
.nTRST (i_trst_n),
.SWDITMS (i_swditms),
.SWCLKTCK (i_swclktck),
.TDI (i_tdi),
.TDO (i_tdo),
.nTDOEN (i_tdoen_n),
.SWDO (i_swdo),
.SWDOEN (i_swdoen),
`endif
// UART
.uart0_rxd (uart0_rxd),
.uart0_txd (uart0_txd),
.uart0_txen (uart0_txen),
.uart1_rxd (uart1_rxd),
.uart1_txd (uart1_txd),
.uart1_txen (uart1_txen),
.uart2_rxd (uart2_rxd),
.uart2_txd (uart2_txd),
.uart2_txen (uart2_txen),
// Timer
.timer0_extin (timer0_extin),
.timer1_extin (timer1_extin),
// IO Ports
.p0_in (p0_in),
.p0_out (p0_out),
.p0_outen (p0_out_en),
.p0_altfunc (p0_altfunc),
.p1_in (p1_in),
.p1_out (p1_out),
.p1_outen (p1_out_en),
.p1_altfunc (p1_altfunc),
// AHB-Lite Master Interface
.ahbx_hready (ahbx_hready),
.ahbx_hresp (ahbx_hresp),
.ahbx_hrdata (ahbx_hrdata),
.ahbx_htrans (ahbx_htrans),
.ahbx_hwrite (ahbx_hwrite),
.ahbx_haddr (ahbx_haddr),
.ahbx_hsize (ahbx_hsize),
.ahbx_hburst (ahbx_hburst),
.ahbx_hmastlock (ahbx_hmastlock),
.ahbx_hprot (ahbx_hprot),
.ahbx_hwdata (ahbx_hwdata),
// APB Slave Interface
.exp12_psel ( ),
.exp13_psel ( ),
.exp14_psel (exp14_psel),
.exp_penable (exp_penable),
.exp_pwrite (exp_pwrite),
.exp_paddr (exp_paddr[11:0]),
.exp_pwdata (exp_pwdata[31:0]),
.exp12_prdata (32'h00000000),
.exp12_pready (1'b1),
.exp12_pslverr (1'b0),
.exp13_prdata (32'h00000000),
.exp13_pready (1'b1),
.exp13_pslverr (1'b0),
.exp14_prdata (exp14_prdata),
.exp14_pready (exp14_pready),
.exp14_pslverr (exp14_pslverr),
.DFTSE (1'b0)
);
//----------------------------------------
// If DMA is present, use SCLK for system HCLK so that
// DMA can run even if processor is in sleep mode.
// Otherwise there is only one master (cpu), so AHB system
// clock can be stopped when DMA take place.
assign HCLKSYS = (INCLUDE_DMA!=0) ? SCLK : HCLK;
// assign HCLKSYS = SCLK;
//----------------------------------------
// Flash memory
//----------------------------------------
cmsdk_ahb_rom
//cmsdk_ahb_ram
#(.MEM_TYPE(ROM_MEM_TYPE),
.AW(16), // 64K bytes flash ROM
// .AW(13), // 8K bytes flash ROM -Dhry
/// .AW(10), // 1K bytes flash ROM - Hello
.filename("../rtl_sim/image.hex"),
.WS_N(`ARM_CMSDK_ROM_MEM_WS_N),
.WS_S(`ARM_CMSDK_ROM_MEM_WS_S)
,.BE (BE)
)
u_ahb_rom (
.HCLK (HCLKSYS),
.HRESETn (HRESETn),
.HSEL (flash_hsel), // AHB inputs
.HADDR (HADDR[15:0]),
// .HADDR (HADDR[12:0]),
/// .HADDR (HADDR[ 9:0]),
.HTRANS (HTRANS),
.HSIZE (HSIZE),
.HWRITE (HWRITE),
.HWDATA (HWDATA),
.HREADY (HREADY),
.HREADYOUT (flash_hreadyout), // Outputs
.HRDATA (flash_hrdata),
.HRESP (flash_hresp)
);
//----------------------------------------
// Boot loader / Firmware
//----------------------------------------
// Only use if BOOT_MEM_TYPE is not zero
`ifdef SYNTHBOOTROM
ahb_bootrom
//ahb_bootrom__mangled
// #(.AW(10) ) // 1K bytes ROM
u_ahb_bootloader (
.HCLK (HCLKSYS),
.HRESETn (HRESETn),
.HSEL (boot_hsel), // AHB inputs
.HADDR (HADDR[ 9:0]),
.HTRANS (HTRANS),
.HSIZE (HSIZE),
.HWRITE (HWRITE),
.HWDATA (HWDATA),
.HREADY (HREADY),
.HREADYOUT (boot_hreadyout), // Outputs
.HRDATA (boot_hrdata),
.HRESP (boot_hresp)
);
`else
// Only use if BOOT_MEM_TYPE is not zero
cmsdk_ahb_rom
#(.MEM_TYPE(BOOT_MEM_TYPE),
// .AW(12), // 4K bytes ROM
.AW(10), // 1K bytes ROM
.filename("bootloader.hex"),
.WS_N(`ARM_CMSDK_BOOT_MEM_WS_N),
.WS_S(`ARM_CMSDK_BOOT_MEM_WS_S),
.BE (BE))
u_ahb_bootloader (
.HCLK (HCLKSYS),
.HRESETn (HRESETn),
.HSEL (boot_hsel), // AHB inputs
// .HADDR (HADDR[11:0]),
.HADDR (HADDR[ 9:0]),
.HTRANS (HTRANS),
.HSIZE (HSIZE),
.HWRITE (HWRITE),
.HWDATA (HWDATA),
.HREADY (HREADY),
.HREADYOUT (boot_hreadyout), // Outputs
.HRDATA (boot_hrdata),
.HRESP (boot_hresp)
);
`endif
//----------------------------------------
// SRAM
//----------------------------------------
cmsdk_ahb_ram
#(.MEM_TYPE(RAM_MEM_TYPE),
.AW(16), // 64K bytes SRAM
// .AW(10), // 1K bytes SRAM
/// .AW( 9), // 512 bytes SRAM
.WS_N(`ARM_CMSDK_RAM_MEM_WS_N),
.WS_S(`ARM_CMSDK_RAM_MEM_WS_S))
u_ahb_ram (
.HCLK (HCLKSYS),
.HRESETn (HRESETn),
.HSEL (sram_hsel), // AHB inputs
.HADDR (HADDR[15:0]),
// .HADDR (HADDR[ 9:0]),
/// .HADDR (HADDR[ 8:0]),
.HTRANS (HTRANS),
.HSIZE (HSIZE),
.HWRITE (HWRITE),
.HWDATA (HWDATA),
.HREADY (HREADY),
.HREADYOUT (sram_hreadyout), // Outputs
.HRDATA (sram_hrdata),
.HRESP (sram_hresp)
);
//----------------------------------------
// MTB SRAM Memory
//----------------------------------------
`ifdef CORTEX_M0PLUS
`ifdef ARM_CMSDK_INCLUDE_MTB
This page: |
Created: | Wed Nov 16 11:46:43 2022 |
|
From: |
../verilog/cmsdk_mcu_chip.v |