Skip to content
Snippets Groups Projects
Select Git revision
  • 22c4d4d4130c6f5a4507ca2ea9a74b6680760918
  • main default protected
  • feat_dma230_dataio
  • feat_qspi_rom
  • feat_extio
  • feat_dmax4
  • feat_dma350
  • feat_nanosoc_regions
  • feat_accel_decouple
  • dev
  • feat_accel_hash_stream
  • nanosoc-2023
12 results

nanosoc_region_sysio.v

Blame
  • nanosoc_region_sysio.v 16.03 KiB
    //-----------------------------------------------------------------------------
    // Nanosoc System Peripheral Region (SYSIO)
    // - Region Mapped to: 0x40000000-0x4fffffff
    // A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
    //
    // Contributors
    //
    // David Mapstone (d.a.mapstone@soton.ac.uk)
    // David Flynn    (d.w.flynn@soton.ac.uk)
    //
    // Copyright 2021-3, SoC Labs (www.soclabs.org)
    //-----------------------------------------------------------------------------
    
    module nanosoc_region_sysio #(
        parameter    SYS_ADDR_W=32,  // System Address Width
        parameter    SYS_DATA_W=32,  // System Data Width
        parameter    APB_ADDR_W=12,  // APB Peripheral Address Width
        parameter    APB_DATA_W=32   // APB Peripheral Data Width
      )(
        input  wire                   FCLK,             // Free-running system clock
        input  wire                   PORESETn,         // Power-On-Reset reset (active-low)
        input  wire                   TESTMODE,         // Reset bypass in scan test
        
        // AHB interface
        input  wire                   HCLK,             // AHB clock
        input  wire                   HRESETn,          // AHB reset (active-low)
        input  wire                   HSEL,             // AHB region select
        input  wire  [SYS_ADDR_W-1:0] HADDR,            // AHB address
        input  wire            [ 2:0] HBURST,           // AHB burst
        input  wire                   HMASTLOCK,        // AHB lock
        input  wire            [ 3:0] HPROT,            // AHB prot
        input  wire            [ 2:0] HSIZE,            // AHB size
        input  wire            [ 1:0] HTRANS,           // AHB transfer
        input  wire  [SYS_DATA_W-1:0] HWDATA,           // AHB write data
        input  wire                   HWRITE,           // AHB write
        input  wire                   HREADY,           // AHB ready
        output  wire [SYS_DATA_W-1:0] HRDATA,           // AHB read-data
        output  wire                  HRESP,            // AHB response
        output  wire                  HREADYOUT,        // AHB ready out
        
        // APB clocking control
        input  wire                   PCLK,             // Peripheral clock
        input  wire                   PCLKG,            // Gated Peripheral bus clock
        input  wire                   PRESETn,          // Peripheral system and APB reset
        input  wire                   PCLKEN,           // Clock divide control for AHB to APB bridge
        
        // APB external Slave Interface
        output wire                   exp12_psel,
        output wire                   exp13_psel,
        output wire                   exp14_psel,
        output wire                   exp15_psel,
        output wire                   exp_penable,
        output wire                   exp_pwrite,
        output wire  [APB_ADDR_W-1:0] exp_paddr,
        output wire  [APB_DATA_W-1:0] exp_pwdata,
        input  wire  [APB_DATA_W-1:0] exp12_prdata,
        input  wire                   exp12_pready,
        input  wire                   exp12_pslverr,
        input  wire  [APB_DATA_W-1:0] exp13_prdata,
        input  wire                   exp13_pready,
        input  wire                   exp13_pslverr,
        input  wire  [APB_DATA_W-1:0] exp14_prdata,
        input  wire                   exp14_pready,
        input  wire                   exp14_pslverr,
        input  wire  [APB_DATA_W-1:0] exp15_prdata,
        input  wire                   exp15_pready,
        input  wire                   exp15_pslverr,
    
        // CPU sideband signalling
        output wire                 SYS_NMI,          // watchdog_interrupt;
        output wire         [31:0]  SYS_APB_IRQ,      // apbsubsys_interrupt;
        output wire         [15:0]  SYS_GPIO0_IRQ,    // GPIO 0 irqs
        output wire         [15:0]  SYS_GPIO1_IRQ,    // GPIO 0 irqs
        
        // CPU power/reset control
        output wire                 REMAP_CTRL,       // REMAP control bit
        output wire                 APBACTIVE,        // APB bus active (for clock gating of PCLKG)
        output wire                 SYSRESETREQ,      // Processor control - system reset request
        output wire                 WDOGRESETREQ,     // Watchdog reset request
        input  wire                 LOCKUP,           // Processor status - Locked up
        output wire                 LOCKUPRESET,      // System Controller cfg - reset if lockup
        output wire                 PMUENABLE,        // System Controller cfg - Enable PMU
    
        // IO signalling
        input  wire                 uart0_rxd,        // Uart 0 receive data
        output wire                 uart0_txd,        // Uart 0 transmit data
        output wire                 uart0_txen,       // Uart 0 transmit data enable
        input  wire                 uart1_rxd,        // Uart 1 receive data
        output wire                 uart1_txd,        // Uart 1 transmit data
        output wire                 uart1_txen,       // Uart 1 transmit data enable
        input  wire                 uart2_rxd,        // Uart 2 receive data
        output wire                 uart2_txd,        // Uart 2 transmit data
        output wire                 uart2_txen,       // Uart 2 transmit data enable
        input  wire                 timer0_extin,     // Timer 0 external input
        input  wire                 timer1_extin,     // Timer 1 external input
    
        // GPIO
        input  wire          [15:0] p0_in,            // GPIO 0 inputs
        output wire          [15:0] p0_out,           // GPIO 0 outputs
        output wire          [15:0] p0_outen,         // GPIO 0 output enables
        output wire          [15:0] p0_altfunc,       // GPIO 0 alternate function (pin mux)
        input  wire          [15:0] p1_in,            // GPIO 1 inputs
        output wire          [15:0] p1_out,           // GPIO 1 outputs
        output wire          [15:0] p1_outen,         // GPIO 1 output enables
        output wire          [15:0] p1_altfunc        // GPIO 1 alternate function (pin mux)
      );
    
      // Sysctrl base address
      localparam BASEADDR_APBSS       = 32'h4000_0000; // GPIO0 peripheral base address
      localparam BASEADDR_GPIO0       = 32'h4001_0000; // GPIO0 peripheral base address
      localparam BASEADDR_GPIO1       = 32'h4001_1000; // GPIO1 peripheral base address
      localparam BASEADDR_SYSCTRL     = 32'h4001_f000; // Sysctrl peripheral basse address
      localparam BE                   = 0;
      
       // ------------------------------------------------------------
       // Local wires
       // ------------------------------------------------------------
    
      wire                        defslv_hsel;   // AHB default slave signals
      wire                        defslv_hreadyout;
      wire     [SYS_DATA_W-1:0]   defslv_hrdata;
      wire                        defslv_hresp;
    
      wire                        apbsys_hsel;  // APB subsystem AHB interface signals
      wire                        apbsys_hreadyout;
      wire     [SYS_DATA_W-1:0]   apbsys_hrdata;
      wire                        apbsys_hresp;
    
      wire                        gpio0_hsel;   // AHB GPIO bus interface signals
      wire                        gpio0_hreadyout;
      wire     [SYS_DATA_W-1:0]   gpio0_hrdata;
      wire                        gpio0_hresp;
    
      wire                        gpio1_hsel;   // AHB GPIO bus interface signals
      wire                        gpio1_hreadyout;
      wire     [SYS_DATA_W-1:0]   gpio1_hrdata;
      wire                        gpio1_hresp;
    
      wire                        sysctrl_hsel;  // System control bus interface signals
      wire                        sysctrl_hreadyout;
      wire     [SYS_DATA_W-1:0]   sysctrl_hrdata;
      wire                        sysctrl_hresp;
    
    
      // AHB address decode
      nanosoc_sysio_decode #(
         .BASEADDR_APBSS       (BASEADDR_APBSS),
         .BASEADDR_GPIO0       (BASEADDR_GPIO0),
         .BASEADDR_GPIO1       (BASEADDR_GPIO1),
         .BASEADDR_SYSCTRL     (BASEADDR_SYSCTRL)
      ) u_addr_decode (
        // System Address
        .hsel         (HSEL),
        .haddr        (HADDR),
        .apbsys_hsel  (apbsys_hsel),
        .gpio0_hsel   (gpio0_hsel),
        .gpio1_hsel   (gpio1_hsel),
        .sysctrl_hsel (sysctrl_hsel),
        .defslv_hsel  (defslv_hsel)
      );
    
      // AHB slave multiplexer
      cmsdk_ahb_slave_mux #(
        .PORT0_ENABLE  (1), // APB subsystem bridge
        .PORT1_ENABLE  (1), // GPIO Port 0
        .PORT2_ENABLE  (1), // GPIO Port 1
        .PORT3_ENABLE  (1), // SYS control
        .PORT4_ENABLE  (1), // Default
        .PORT5_ENABLE  (0),
        .PORT6_ENABLE  (0),
        .PORT7_ENABLE  (0),
        .PORT8_ENABLE  (0),
        .PORT9_ENABLE  (0),
        .DW            (32)
      ) u_ahb_slave_mux_sys_bus (
        .HCLK         (HCLK),
        .HRESETn      (HRESETn),
        .HREADY       (HREADY),
        .HSEL0        (apbsys_hsel),     // Input Port 0
        .HREADYOUT0   (apbsys_hreadyout),
        .HRESP0       (apbsys_hresp),
        .HRDATA0      (apbsys_hrdata),
        .HSEL1        (gpio0_hsel),      // Input Port 1
        .HREADYOUT1   (gpio0_hreadyout),
        .HRESP1       (gpio0_hresp),
        .HRDATA1      (gpio0_hrdata),
        .HSEL2        (gpio1_hsel),      // Input Port 2
        .HREADYOUT2   (gpio1_hreadyout),
        .HRESP2       (gpio1_hresp),
        .HRDATA2      (gpio1_hrdata),
        .HSEL3        (sysctrl_hsel),    // Input Port 3
        .HREADYOUT3   (sysctrl_hreadyout),
        .HRESP3       (sysctrl_hresp),
        .HRDATA3      (sysctrl_hrdata),
        .HSEL4        (defslv_hsel),     // Input Port 4
        .HREADYOUT4   (defslv_hreadyout),
        .HRESP4       (defslv_hresp),
        .HRDATA4      (defslv_hrdata),
        .HSEL5        (1'b0),     // Input Port 5
        .HREADYOUT5   (defslv_hreadyout),
        .HRESP5       (defslv_hresp),
        .HRDATA5      (defslv_hrdata),
        .HSEL6        (1'b0),     // Input Port 6
        .HREADYOUT6   (defslv_hreadyout),
        .HRESP6       (defslv_hresp),
        .HRDATA6      (defslv_hrdata),
        .HSEL7        (1'b0),     // Input Port 7
        .HREADYOUT7   (defslv_hreadyout),
        .HRESP7       (defslv_hresp),
        .HRDATA7      (defslv_hrdata),
        .HSEL8        (1'b0),     // Input Port 8
        .HREADYOUT8   (defslv_hreadyout),
        .HRESP8       (defslv_hresp),
        .HRDATA8      (defslv_hrdata),
        .HSEL9        (1'b0),     // Input Port 9
        .HREADYOUT9   (defslv_hreadyout),
        .HRESP9       (defslv_hresp),
        .HRDATA9      (defslv_hrdata),
    
        .HREADYOUT    (HREADYOUT),   // Outputs
        .HRESP        (HRESP),
        .HRDATA       (HRDATA)
      );
    
      // Default slave
      cmsdk_ahb_default_slave u_ahb_default_slave_1 (
        .HCLK         (HCLK),
        .HRESETn      (HRESETn),
        .HSEL         (defslv_hsel),
        .HTRANS       (HTRANS),
        .HREADY       (HREADY),
        .HREADYOUT    (defslv_hreadyout),
        .HRESP        (defslv_hresp)
      );
    
      assign   defslv_hrdata = 32'h00000000; // Default slave do not have read data
    
      // -------------------------------
      // Peripherals
      // -------------------------------
    
      nanosoc_sysctrl #(
        .BE (BE)
      ) u_nanosoc_sysctrl (
       // AHB Inputs
        .HCLK         (HCLK),
        .HRESETn      (HRESETn),
        .FCLK         (FCLK),
        .PORESETn     (PORESETn),
        .HSEL         (sysctrl_hsel),
        .HREADY       (HREADY),
        .HTRANS       (HTRANS),
        .HSIZE        (HSIZE),
        .HWRITE       (HWRITE),
        .HADDR        (HADDR[11:0]),
        .HWDATA       (HWDATA),
       // AHB Outputs
        .HREADYOUT    (sysctrl_hreadyout),
        .HRESP        (sysctrl_hresp),
        .HRDATA       (sysctrl_hrdata),
       // Reset information
        .SYSRESETREQ  (SYSRESETREQ),
        .WDOGRESETREQ (WDOGRESETREQ),
        .LOCKUP       (LOCKUP),
        // Engineering-change-order revision bits
        .ECOREVNUM    (4'h0),
       // System control signals
        .REMAP        (REMAP_CTRL),
        .PMUENABLE    (PMUENABLE),
        .LOCKUPRESET  (LOCKUPRESET)
       );
    
      // GPIO is driven from the AHB
      cmsdk_ahb_gpio #(
        .ALTERNATE_FUNC_MASK     (16'h0000), // No pin muxing for Port #0
        .ALTERNATE_FUNC_DEFAULT  (16'h0000), // All pins default to GPIO
        .BE                      (BE)
        )
        u_nanosoc_gpio_0  (
       // AHB Inputs
        .HCLK         (HCLK),
        .HRESETn      (HRESETn),
        .FCLK         (FCLK),
        .HSEL         (gpio0_hsel),
        .HREADY       (HREADY),
        .HTRANS       (HTRANS),
        .HSIZE        (HSIZE),
        .HWRITE       (HWRITE),
        .HADDR        (HADDR[11:0]),
        .HWDATA       (HWDATA),
       // AHB Outputs
        .HREADYOUT    (gpio0_hreadyout),
        .HRESP        (gpio0_hresp),
        .HRDATA       (gpio0_hrdata),
    
        .ECOREVNUM    (4'h0),// Engineering-change-order revision bits
    
        .PORTIN       (p0_in),   // GPIO Interface inputs
        .PORTOUT      (p0_out),  // GPIO Interface outputs
        .PORTEN       (p0_outen),
        .PORTFUNC     (p0_altfunc), // Alternate function control
    
        .GPIOINT      (SYS_GPIO0_IRQ[15:0]),  // Interrupt outputs
        .COMBINT      ()
      );
    
    
      cmsdk_ahb_gpio #(
        .ALTERNATE_FUNC_MASK     (16'h002A), // pin muxing for Port #1
        .ALTERNATE_FUNC_DEFAULT  (16'h0000), // All pins default to GPIO
        .BE                      (BE)
      ) u_nanosoc_gpio_1 (
       // AHB Inputs
        .HCLK         (HCLK),
        .HRESETn      (HRESETn),
        .FCLK         (FCLK),
        .HSEL         (gpio1_hsel),
        .HREADY       (HREADY),
        .HTRANS       (HTRANS),
        .HSIZE        (HSIZE),
        .HWRITE       (HWRITE),
        .HADDR        (HADDR[11:0]),
        .HWDATA       (HWDATA),
       // AHB Outputs
        .HREADYOUT    (gpio1_hreadyout),
        .HRESP        (gpio1_hresp),
        .HRDATA       (gpio1_hrdata),
    
        .ECOREVNUM    (4'h0),// Engineering-change-order revision bits
    
        .PORTIN       (p1_in),   // GPIO Interface inputs
        .PORTOUT      (p1_out),  // GPIO Interface outputs
        .PORTEN       (p1_outen),
        .PORTFUNC     (p1_altfunc), // Alternate function control
    
        .GPIOINT      (SYS_GPIO1_IRQ[15:0]),  // Interrupt outputs
        .COMBINT      ( )
      );
    
      // APB subsystem for timers, UARTs
      nanosoc_sysio_apb_ss #(
        .APB_EXT_PORT12_ENABLE   (1), // DMAC 1
        .APB_EXT_PORT13_ENABLE   (0), // Not Used
        .APB_EXT_PORT14_ENABLE   (1), // USRT
        .APB_EXT_PORT15_ENABLE   (1), // DMAC 0
        .INCLUDE_IRQ_SYNCHRONIZER(0),  // require IRQs to be HCLK synchronous
        .INCLUDE_APB_TEST_SLAVE  (1),  // Include example test slave
        .INCLUDE_APB_TIMER0      (1),  // Include simple timer #0
        .INCLUDE_APB_TIMER1      (1),  // Include simple timer #1
        .INCLUDE_APB_DUALTIMER0  (1),  // Include dual timer module
        .INCLUDE_APB_UART0       (0),  // Exclude simple UART #0
        .INCLUDE_APB_UART1       (0),  // Exclude simple UART #1
        .INCLUDE_APB_UART2       (1),  // Include simple UART #2.
        .INCLUDE_APB_WATCHDOG    (1),  // Include APB watchdog module
        .BE                      (BE)
      ) u_nanosoc_sysio_apb_ss (
    
      // AHB interface for AHB to APB bridge
        .HCLK          (HCLK),
        .HRESETn       (HRESETn),
    
        .HSEL          (apbsys_hsel),
        .HADDR         (HADDR[15:0]),
        .HTRANS        (HTRANS[1:0]),
        .HWRITE        (HWRITE),
        .HSIZE         (HSIZE),
        .HPROT         (HPROT),
        .HREADY        (HREADY),
        .HWDATA        (HWDATA[31:0]),
    
        .HREADYOUT     (apbsys_hreadyout),
        .HRDATA        (apbsys_hrdata),
        .HRESP         (apbsys_hresp),
    
      // APB clock and reset
        .PCLK          (PCLK),
        .PCLKG         (PCLKG),
        .PCLKEN        (PCLKEN),
        .PRESETn       (PRESETn),
    
      // APB extension ports
        .PADDR         (exp_paddr[11:0]),
        .PWRITE        (exp_pwrite),
        .PWDATA        (exp_pwdata[31:0]),
        .PENABLE       (exp_penable),
    
        .ext12_psel    (exp12_psel),
        .ext13_psel    (exp13_psel),
        .ext14_psel    (exp14_psel),
        .ext15_psel    (exp15_psel),
    
      // Input from APB devices on APB expansion ports
        .ext12_prdata  (exp12_prdata),
        .ext12_pready  (exp12_pready),
        .ext12_pslverr (exp12_pslverr),
        .ext13_prdata  (exp13_prdata),
        .ext13_pready  (exp13_pready),
        .ext13_pslverr (exp13_pslverr),
        .ext14_prdata  (exp14_prdata),
        .ext14_pready  (exp14_pready),
        .ext14_pslverr (exp14_pslverr),
        .ext15_prdata  (exp15_prdata),
        .ext15_pready  (exp15_pready),
        .ext15_pslverr (exp15_pslverr),
    
        .APBACTIVE     (APBACTIVE),  // Status Output for clock gating
    
      // Peripherals
        // 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),
    
      // Interrupt outputs
        .apbsubsys_interrupt (SYS_APB_IRQ),
        .watchdog_interrupt  (SYS_NMI),
       // reset output
        .watchdog_reset      (WDOGRESETREQ)
      );
    
    endmodule