-- Sim DRAM
signal wb_dram_in : wishbone_master_out;
signal wb_dram_out : wishbone_slave_out;
- signal wb_dram_ctrl_in : wb_io_master_out;
- signal wb_dram_ctrl_out : wb_io_slave_out;
- signal wb_dram_is_csr : std_ulogic;
- signal wb_dram_is_init : std_ulogic;
+ signal wb_ext_io_in : wb_io_master_out;
+ signal wb_ext_io_out : wb_io_slave_out;
+ signal wb_ext_is_dram_csr : std_ulogic;
+ signal wb_ext_is_dram_init : std_ulogic;
signal core_alt_reset : std_ulogic;
-- SPI
system_clk => system_clk,
wb_dram_in => wb_dram_in,
wb_dram_out => wb_dram_out,
- wb_dram_ctrl_in => wb_dram_ctrl_in,
- wb_dram_ctrl_out => wb_dram_ctrl_out,
- wb_dram_is_csr => wb_dram_is_csr,
- wb_dram_is_init => wb_dram_is_init,
+ wb_ext_io_in => wb_ext_io_in,
+ wb_ext_io_out => wb_ext_io_out,
+ wb_ext_is_dram_csr => wb_ext_is_dram_csr,
+ wb_ext_is_dram_init => wb_ext_is_dram_init,
spi_flash_sck => spi_sck,
spi_flash_cs_n => spi_cs_n,
spi_flash_sdat_o => spi_sdat_o,
PAYLOAD_SIZE => ROM_SIZE
)
port map(
- clk_in => clk,
+ clk_in => clk,
rst => rst,
- system_clk => system_clk,
- system_reset => soc_rst,
- core_alt_reset => core_alt_reset,
- pll_locked => open,
-
- wb_in => wb_dram_in,
- wb_out => wb_dram_out,
- wb_ctrl_in => wb_dram_ctrl_in,
- wb_ctrl_out => wb_dram_ctrl_out,
- wb_ctrl_is_csr => wb_dram_is_csr,
- wb_ctrl_is_init => wb_dram_is_init,
-
- init_done => open,
- init_error => open,
-
- ddram_a => open,
- ddram_ba => open,
- ddram_ras_n => open,
- ddram_cas_n => open,
- ddram_we_n => open,
- ddram_cs_n => open,
- ddram_dm => open,
- ddram_dq => open,
- ddram_dqs_p => open,
- ddram_dqs_n => open,
- ddram_clk_p => open,
- ddram_clk_n => open,
- ddram_cke => open,
- ddram_odt => open,
- ddram_reset_n => open
+ system_clk => system_clk,
+ system_reset => soc_rst,
+ core_alt_reset => core_alt_reset,
+
+ wb_in => wb_dram_in,
+ wb_out => wb_dram_out,
+ wb_ctrl_in => wb_ext_io_in,
+ wb_ctrl_out => wb_ext_io_out,
+ wb_ctrl_is_csr => wb_ext_is_dram_csr,
+ wb_ctrl_is_init => wb_ext_is_dram_init
);
clk_process: process
signal wb_dram_out : wishbone_slave_out;
-- DRAM control wishbone connection
- signal wb_dram_ctrl_in : wb_io_master_out;
- signal wb_dram_ctrl_out : wb_io_slave_out;
- signal wb_dram_is_csr : std_ulogic;
- signal wb_dram_is_init : std_ulogic;
+ signal wb_ext_io_in : wb_io_master_out;
+ signal wb_ext_io_out : wb_io_slave_out;
+ signal wb_ext_is_dram_csr : std_ulogic;
+ signal wb_ext_is_dram_init : std_ulogic;
+ signal wb_ext_is_eth : std_ulogic;
+
-- Control/status
signal core_alt_reset : std_ulogic;
spi_flash_sdat_i => spi_sdat_i,
-- DRAM wishbone
- wb_dram_in => wb_dram_in,
- wb_dram_out => wb_dram_out,
- wb_dram_ctrl_in => wb_dram_ctrl_in,
- wb_dram_ctrl_out => wb_dram_ctrl_out,
- wb_dram_is_csr => wb_dram_is_csr,
- wb_dram_is_init => wb_dram_is_init,
- alt_reset => core_alt_reset
+ wb_dram_in => wb_dram_in,
+ wb_dram_out => wb_dram_out,
+ wb_ext_io_in => wb_ext_io_in,
+ wb_ext_io_out => wb_ext_io_out,
+ wb_ext_is_dram_csr => wb_ext_is_dram_csr,
+ wb_ext_is_dram_init => wb_ext_is_dram_init,
+ alt_reset => core_alt_reset
);
-- SPI Flash
wb_in => wb_dram_in,
wb_out => wb_dram_out,
- wb_ctrl_in => wb_dram_ctrl_in,
- wb_ctrl_out => wb_dram_ctrl_out,
- wb_ctrl_is_csr => wb_dram_is_csr,
- wb_ctrl_is_init => wb_dram_is_init,
+ wb_ctrl_in => wb_ext_io_in,
+ wb_ctrl_out => wb_ext_io_out,
+ wb_ctrl_is_csr => wb_ext_is_dram_csr,
+ wb_ctrl_is_init => wb_ext_is_dram_init,
init_done => dram_init_done,
init_error => dram_init_error,
signal wb_dram_out : wishbone_slave_out;
-- DRAM control wishbone connection
- signal wb_dram_ctrl_in : wb_io_master_out;
- signal wb_dram_ctrl_out : wb_io_slave_out;
- signal wb_dram_is_csr : std_ulogic;
- signal wb_dram_is_init : std_ulogic;
+ signal wb_ext_io_in : wb_io_master_out;
+ signal wb_ext_io_out : wb_io_slave_out;
+ signal wb_ext_is_dram_csr : std_ulogic;
+ signal wb_ext_is_dram_init : std_ulogic;
-- Control/status
signal core_alt_reset : std_ulogic;
spi_flash_sdat_i => spi_sdat_i,
-- DRAM wishbone
- wb_dram_in => wb_dram_in,
- wb_dram_out => wb_dram_out,
- wb_dram_ctrl_in => wb_dram_ctrl_in,
- wb_dram_ctrl_out => wb_dram_ctrl_out,
- wb_dram_is_csr => wb_dram_is_csr,
- wb_dram_is_init => wb_dram_is_init,
- alt_reset => core_alt_reset
+ wb_dram_in => wb_dram_in,
+ wb_dram_out => wb_dram_out,
+ wb_ext_io_in => wb_ext_io_in,
+ wb_ext_io_out => wb_ext_io_out,
+ wb_ext_is_dram_csr => wb_dram_is_csr,
+ wb_ext_is_dram_init => wb_dram_is_init,
+ alt_reset => core_alt_reset
);
-- SPI Flash. The SPI clk needs to be fed through the STARTUPE2
wb_in => wb_dram_in,
wb_out => wb_dram_out,
- wb_ctrl_in => wb_dram_ctrl_in,
- wb_ctrl_out => wb_dram_ctrl_out,
- wb_ctrl_is_csr => wb_dram_is_csr,
- wb_ctrl_is_init => wb_dram_is_init,
+ wb_ctrl_in => wb_ext_io_in,
+ wb_ctrl_out => wb_ext_io_out,
+ wb_ctrl_is_csr => wb_ext_is_dram_csr,
+ wb_ctrl_is_init => wb_ext_is_dram_init,
init_done => dram_init_done,
init_error => dram_init_error,
#define UART_BASE 0xc0002000 /* UART */
#define XICS_BASE 0xc0004000 /* Interrupt controller */
#define SPI_FCTRL_BASE 0xc0006000 /* SPI flash controller registers */
-#define DRAM_CTRL_BASE 0xc0100000 /* LiteDRAM control registers */
+#define DRAM_CTRL_BASE 0xc8000000 /* LiteDRAM control registers */
#define SPI_FLASH_BASE 0xf0000000 /* SPI Flash memory map */
#define DRAM_INIT_BASE 0xff000000 /* Internal DRAM init firmware */
4bfff9a938637cb0
000000004bfffd78
0000088003000000
-612908043d20c010
+612908043d20c800
7c0004ac79290020
-3d40c0107c604f2a
+3d40c8007c604f2a
614a080839200001
7c0004ac794a0020
4e8000207d20572a
600000007d2903a6
4e8000204200fffc
0000000000000000
-3d20c01000000000
+3d20c80000000000
6129001439400001
792900207d431830
7c604f2a7c0004ac
-610800183d00c010
+610800183d00c800
7c0004ac79080020
394000007d40472a
7d404f2a7c0004ac
000000004e800020
0000000000000000
-394000013d20c010
+394000013d20c800
7d43183061290014
7c0004ac79290020
-3d00c0107c604f2a
+3d00c8007c604f2a
790800206108001c
7d40472a7c0004ac
7c0004ac39400000
4e8000207d404f2a
0000000000000000
-3d40c01000000000
+3d40c80000000000
614a083439200025
7c0004ac794a0020
-3d40c0107d20572a
+3d40c8007d20572a
614a083839200001
7c0004ac794a0020
4e8000207d20572a
38c600017ce831ae
394affff4200ffe0
794a002139080004
-3d20c0104082ffc4
+3d20c8004082ffc4
6129080c3be00000
7c0004ac79290020
-3d20c0107fe04f2a
+3d20c8007fe04f2a
7929002061290810
7fe04f2a7c0004ac
4bfffd8d38600009
4bfffdc13860000f
-7fa4eb783c60c010
+7fa4eb783c60c800
7863002060630814
-3c60c0104bfffead
+3c60c8004bfffead
6063082c38810064
4bfffe9978630020
-388100683c60c010
+388100683c60c800
7863002060630844
-3c60c0104bfffe85
+3c60c8004bfffe85
6063085c3881006c
4bfffe7178630020
-612908543d20c010
+612908543d20c800
7c0004ac79290020
-3d20c0107fe04f2a
+3d20c8007fe04f2a
7929002061290858
7fe04f2a7c0004ac
-392000173d40c010
+392000173d40c800
794a0020614a084c
7d20572a7c0004ac
-392000013d40c010
+392000013d40c800
794a0020614a0850
7d20572a7c0004ac
-6129083c3d20c010
+6129083c3d20c800
7c0004ac79290020
-3d20c0107fe04f2a
+3d20c8007fe04f2a
7929002061290840
7fe04f2a7c0004ac
22de00017fc3f378
600000004bfff4cd
3be000007fc3f378
7f9fe8004bfffb8d
-3d40c010419c0070
+3d40c800419c0070
614a080c39200000
7c0004ac794a0020
-3d40c0107d20572a
+3d40c8007d20572a
794a0020614a0810
7d20572a7c0004ac
4bfffaed3860000b
000000004bffff7c
00000b8001000000
384299e03c4c0001
-3d40c0107c0802a6
+3d40c8007c0802a6
3920000e614a0800
f8010010794a0020
7c0004acf821ffa1
000000004e800020
0000008001000000
384299883c4c0001
-3d40c0107c0802a6
+3d40c8007c0802a6
39200001614a0800
f8010010794a0020
7c0004acf821ffa1
3c4c000100000380
7c0802a638429644
f821fec1480010f5
-3bc000013fe0c010
+3bc000013fe0c800
7bff002063ff0014
386000004bfffc49
7c0004ac4bfff72d
-3f80c0107fc0ff2a
+3f80c8007fc0ff2a
7b9c0020639c0020
7fc0e72a7c0004ac
7c0004ac3ba00000
39ef7fa83a107f28
3a527f6839ce7fb0
3b20000139210064
-3ea0c0103e80c010
+3ea0c8003e80c800
39210068f9210088
6294080c7f39f830
7b33002062b50810
7ab500207a940020
7fbeeb7848000054
419e029c2f9d000f
-612900143d20c010
+612900143d20c800
7c0004ac79290020
-3d00c0107e604f2a
+3d00c8007e604f2a
6108002439400001
7c0004ac79080020
394000007d40472a
7c0004ac7f60a72a
386000097f60af2a
3860000f4bfff521
-3c60c0104bfff555
+3c60c8004bfff555
606308147f44d378
4bfff64178630020
-3c60c010e8810088
+3c60c800e8810088
786300206063082c
e88100904bfff62d
-606308443c60c010
+606308443c60c800
4bfff61978630020
-3881006c3c60c010
+3881006c3c60c800
786300206063085c
-3d20c0104bfff605
+3d20c8004bfff605
7929002061290854
7f604f2a7c0004ac
-612908583d20c010
+612908583d20c800
7c0004ac79290020
-3d40c0107f604f2a
+3d40c8007f604f2a
614a084c39200017
7c0004ac794a0020
-3d40c0107d20572a
+3d40c8007d20572a
614a085039200001
7c0004ac794a0020
-3d20c0107d20572a
+3d20c8007d20572a
792900206129083c
7f604f2a7c0004ac
-612908403d20c010
+612908403d20c800
7c0004ac79290020
e86100987f604f2a
7fe4fb787fa5eb78
7fc5f3783c62ffff
38637fb87fe4fb78
600000004bffecc5
-612900143d20c010
+612900143d20c800
7c0004ac79290020
-3d00c0107f204f2a
+3d00c8007f204f2a
6108002039400001
7c0004ac79080020
394000007d40472a
7d404f2a7c0004ac
-3d00c0107bde0020
+3d00c8007bde0020
6108002438de0001
394000017cc903a6
38e0000079080020
384291b83c4c0001
3c62ffff7c0802a6
48000c9138637f70
-3f60c010f821ff71
+3f60c800f821ff71
637b10003be00000
4bffebd17b7b0020
7c0004ac60000000
-3f40c0107fe0df2a
+3f40c8007fe0df2a
7b5a0020635a1004
7fe0d72a7c0004ac
-4bfff78d3fa0c010
+4bfff78d3fa0c800
7bbd002063bd080c
7fe0ef2a7c0004ac
-63de08103fc0c010
+63de08103fc0c800
7c0004ac7bde0020
-3f80c0107fe0f72a
+3f80c8007fe0f72a
639c08003920000c
7c0004ac7b9c0020
386000007d20e72a
000000000000002d
30252d2b64323025
0000000000006432
-00000000c0100818
-00000000c0100830
-00000000c0100848
-00000000c0100860
+00000000c8000818
+00000000c8000830
+00000000c8000848
+00000000c8000860
6f6e204d41524453
207265646e752077
6572617764726168
4bfff9a938637cb0
000000004bfffd78
0000088003000000
-612908043d20c010
+612908043d20c800
7c0004ac79290020
-3d40c0107c604f2a
+3d40c8007c604f2a
614a080839200001
7c0004ac794a0020
4e8000207d20572a
600000007d2903a6
4e8000204200fffc
0000000000000000
-3d20c01000000000
+3d20c80000000000
6129001439400001
792900207d431830
7c604f2a7c0004ac
-610800183d00c010
+610800183d00c800
7c0004ac79080020
394000007d40472a
7d404f2a7c0004ac
000000004e800020
0000000000000000
-394000013d20c010
+394000013d20c800
7d43183061290014
7c0004ac79290020
-3d00c0107c604f2a
+3d00c8007c604f2a
790800206108001c
7d40472a7c0004ac
7c0004ac39400000
4e8000207d404f2a
0000000000000000
-3d40c01000000000
+3d40c80000000000
614a083439200025
7c0004ac794a0020
-3d40c0107d20572a
+3d40c8007d20572a
614a083839200001
7c0004ac794a0020
4e8000207d20572a
38c600017ce831ae
394affff4200ffe0
794a002139080004
-3d20c0104082ffc4
+3d20c8004082ffc4
6129080c3be00000
7c0004ac79290020
-3d20c0107fe04f2a
+3d20c8007fe04f2a
7929002061290810
7fe04f2a7c0004ac
4bfffd8d38600009
4bfffdc13860000f
-7fa4eb783c60c010
+7fa4eb783c60c800
7863002060630814
-3c60c0104bfffead
+3c60c8004bfffead
6063082c38810064
4bfffe9978630020
-388100683c60c010
+388100683c60c800
7863002060630844
-3c60c0104bfffe85
+3c60c8004bfffe85
6063085c3881006c
4bfffe7178630020
-612908543d20c010
+612908543d20c800
7c0004ac79290020
-3d20c0107fe04f2a
+3d20c8007fe04f2a
7929002061290858
7fe04f2a7c0004ac
-392000173d40c010
+392000173d40c800
794a0020614a084c
7d20572a7c0004ac
-392000013d40c010
+392000013d40c800
794a0020614a0850
7d20572a7c0004ac
-6129083c3d20c010
+6129083c3d20c800
7c0004ac79290020
-3d20c0107fe04f2a
+3d20c8007fe04f2a
7929002061290840
7fe04f2a7c0004ac
22de00017fc3f378
600000004bfff4cd
3be000007fc3f378
7f9fe8004bfffb8d
-3d40c010419c0070
+3d40c800419c0070
614a080c39200000
7c0004ac794a0020
-3d40c0107d20572a
+3d40c8007d20572a
794a0020614a0810
7d20572a7c0004ac
4bfffaed3860000b
000000004bffff7c
00000b8001000000
384299e03c4c0001
-3d40c0107c0802a6
+3d40c8007c0802a6
3920000e614a0800
f8010010794a0020
7c0004acf821ffa1
000000004e800020
0000008001000000
384299883c4c0001
-3d40c0107c0802a6
+3d40c8007c0802a6
39200001614a0800
f8010010794a0020
7c0004acf821ffa1
3c4c000100000380
7c0802a638429644
f821fec1480010f5
-3bc000013fe0c010
+3bc000013fe0c800
7bff002063ff0014
386000004bfffc49
7c0004ac4bfff72d
-3f80c0107fc0ff2a
+3f80c8007fc0ff2a
7b9c0020639c0020
7fc0e72a7c0004ac
7c0004ac3ba00000
39ef7fa83a107f28
3a527f6839ce7fb0
3b20000139210064
-3ea0c0103e80c010
+3ea0c8003e80c800
39210068f9210088
6294080c7f39f830
7b33002062b50810
7ab500207a940020
7fbeeb7848000054
419e029c2f9d000f
-612900143d20c010
+612900143d20c800
7c0004ac79290020
-3d00c0107e604f2a
+3d00c8007e604f2a
6108002439400001
7c0004ac79080020
394000007d40472a
7c0004ac7f60a72a
386000097f60af2a
3860000f4bfff521
-3c60c0104bfff555
+3c60c8004bfff555
606308147f44d378
4bfff64178630020
-3c60c010e8810088
+3c60c800e8810088
786300206063082c
e88100904bfff62d
-606308443c60c010
+606308443c60c800
4bfff61978630020
-3881006c3c60c010
+3881006c3c60c800
786300206063085c
-3d20c0104bfff605
+3d20c8004bfff605
7929002061290854
7f604f2a7c0004ac
-612908583d20c010
+612908583d20c800
7c0004ac79290020
-3d40c0107f604f2a
+3d40c8007f604f2a
614a084c39200017
7c0004ac794a0020
-3d40c0107d20572a
+3d40c8007d20572a
614a085039200001
7c0004ac794a0020
-3d20c0107d20572a
+3d20c8007d20572a
792900206129083c
7f604f2a7c0004ac
-612908403d20c010
+612908403d20c800
7c0004ac79290020
e86100987f604f2a
7fe4fb787fa5eb78
7fc5f3783c62ffff
38637fb87fe4fb78
600000004bffecc5
-612900143d20c010
+612900143d20c800
7c0004ac79290020
-3d00c0107f204f2a
+3d00c8007f204f2a
6108002039400001
7c0004ac79080020
394000007d40472a
7d404f2a7c0004ac
-3d00c0107bde0020
+3d00c8007bde0020
6108002438de0001
394000017cc903a6
38e0000079080020
384291b83c4c0001
3c62ffff7c0802a6
48000c9138637f70
-3f60c010f821ff71
+3f60c800f821ff71
637b10003be00000
4bffebd17b7b0020
7c0004ac60000000
-3f40c0107fe0df2a
+3f40c8007fe0df2a
7b5a0020635a1004
7fe0d72a7c0004ac
-4bfff78d3fa0c010
+4bfff78d3fa0c800
7bbd002063bd080c
7fe0ef2a7c0004ac
-63de08103fc0c010
+63de08103fc0c800
7c0004ac7bde0020
-3f80c0107fe0f72a
+3f80c8007fe0f72a
639c08003920000c
7c0004ac7b9c0020
386000007d20e72a
000000000000002d
30252d2b64323025
0000000000006432
-00000000c0100818
-00000000c0100830
-00000000c0100848
-00000000c0100860
+00000000c8000818
+00000000c8000830
+00000000c8000848
+00000000c8000860
6f6e204d41524453
207265646e752077
6572617764726168
4bfff9a938637dd0
000000004bfffd78
0000088003000000
-612908043d20c010
+612908043d20c800
7c0004ac79290020
-3d40c0107c604f2a
+3d40c8007c604f2a
614a080839200001
7c0004ac794a0020
4e8000207d20572a
0000000000000000
3c4c000100000000
7c0802a638429414
-614a08003d40c010
+614a08003d40c800
794a00203920000e
f821ffa1f8010010
7d20572a7c0004ac
0100000000000000
3c4c000100000080
7c0802a6384293bc
-614a08003d40c010
+614a08003d40c800
794a002039200001
f821ffa1f8010010
7d20572a7c0004ac
384290703c4c0001
600000007c0802a6
48000c6938628048
-3f60c010f821ff71
+3f60c800f821ff71
637b10003be00000
4bfff5897b7b0020
7c0004ac60000000
-3f40c0107fe0df2a
+3f40c8007fe0df2a
7b5a0020635a1004
7fe0d72a7c0004ac
-4bfffc113fa0c010
+4bfffc113fa0c800
7bbd002063bd080c
7fe0ef2a7c0004ac
-63de08103fc0c010
+63de08103fc0c800
7c0004ac7bde0020
-3d20c0107fe0f72a
+3d20c8007fe0f72a
612908003940000c
7c0004ac79290020
7c0004ac7d404f2a
-- 0xc0002000: UART0
-- 0xc0004000: XICS ICP
-- 0xc0006000: SPI Flash controller
--- 0xc0100000: LiteDRAM control (CSRs)
+-- 0xc8nnnnnn: External IO bus
-- 0xf0000000: Flash "ROM" mapping
--- 0xff000000: DRAM init code (if any) or flash ROM
+-- 0xff000000: DRAM init code (if any) or flash ROM (**)
+
+-- External IO bus:
+-- 0xc8000000: LiteDRAM control (CSRs)
+
+-- (**) DRAM init code is currently special and goes to the external
+-- IO bus, this will be fixed when it's moved out of litedram and
+-- into the main SoC once we have a common "firmware".
+
entity soc is
generic (
rst : in std_ulogic;
system_clk : in std_ulogic;
- -- DRAM controller signals
+ -- "Large" (64-bit) DRAM wishbone
wb_dram_in : out wishbone_master_out;
wb_dram_out : in wishbone_slave_out := wishbone_slave_out_init;
- wb_dram_ctrl_in : out wb_io_master_out;
- wb_dram_ctrl_out : in wb_io_slave_out := wb_io_slave_out_init;
- wb_dram_is_csr : out std_ulogic;
- wb_dram_is_init : out std_ulogic;
+
+ -- "Small" (32-bit) external IO wishbone
+ wb_ext_io_in : out wb_io_master_out;
+ wb_ext_io_out : in wb_io_slave_out := wb_io_slave_out_init;
+ wb_ext_is_dram_csr : out std_ulogic;
+ wb_ext_is_dram_init : out std_ulogic;
-- UART0 signals:
uart0_txd : out std_ulogic;
signal rst_wbdb : std_ulogic := '1';
signal alt_reset_d : std_ulogic;
- -- IO branch split:
- type slave_io_type is (SLAVE_IO_SYSCON,
- SLAVE_IO_UART,
- SLAVE_IO_DRAM_INIT,
- SLAVE_IO_DRAM_CSR,
- SLAVE_IO_ICP_0,
- SLAVE_IO_SPI_FLASH_REG,
- SLAVE_IO_SPI_FLASH_MAP,
- SLAVE_IO_NONE);
+ -- IO branch split:
+ type slave_io_type is (SLAVE_IO_SYSCON,
+ SLAVE_IO_UART,
+ SLAVE_IO_ICP_0,
+ SLAVE_IO_SPI_FLASH_REG,
+ SLAVE_IO_SPI_FLASH_MAP,
+ SLAVE_IO_EXTERNAL,
+ SLAVE_IO_NONE);
signal slave_io_dbg : slave_io_type;
begin
-- IO wishbone slave intercon.
--
slave_io_intercon: process(wb_sio_out, wb_syscon_out, wb_uart0_out,
- wb_dram_ctrl_out, wb_xics0_out, wb_spiflash_out)
+ wb_ext_io_out, wb_xics0_out, wb_spiflash_out)
variable slave_io : slave_io_type;
variable match : std_ulogic_vector(31 downto 12);
+ variable ext_valid : boolean;
begin
-- Simple address decoder.
slave_io := SLAVE_IO_NONE;
match := "11" & wb_sio_out.adr(29 downto 12);
if std_match(match, x"FF---") and HAS_DRAM then
- slave_io := SLAVE_IO_DRAM_INIT;
+ slave_io := SLAVE_IO_EXTERNAL;
elsif std_match(match, x"F----") then
slave_io := SLAVE_IO_SPI_FLASH_MAP;
elsif std_match(match, x"C0000") then
slave_io := SLAVE_IO_SYSCON;
elsif std_match(match, x"C0002") then
slave_io := SLAVE_IO_UART;
- elsif std_match(match, x"C01--") then
- slave_io := SLAVE_IO_DRAM_CSR;
+ elsif std_match(match, x"C8---") then
+ slave_io := SLAVE_IO_EXTERNAL;
elsif std_match(match, x"C0004") then
slave_io := SLAVE_IO_ICP_0;
elsif std_match(match, x"C0006") then
wb_xics0_in.adr(7 downto 0) <= wb_sio_out.adr(7 downto 0);
wb_xics0_in.cyc <= '0';
- wb_dram_ctrl_in <= wb_sio_out;
- wb_dram_ctrl_in.cyc <= '0';
- wb_dram_is_csr <= '0';
- wb_dram_is_init <= '0';
+ wb_ext_io_in <= wb_sio_out;
+ wb_ext_io_in.cyc <= '0';
wb_syscon_in <= wb_sio_out;
wb_syscon_in.cyc <= '0';
+ wb_ext_is_dram_csr <= '0';
+ wb_ext_is_dram_init <= '0';
+
+ -- Default response, ack & return all 1's
+ wb_sio_in.dat <= (others => '1');
+ wb_sio_in.ack <= wb_sio_out.stb and wb_sio_out.cyc;
+ wb_sio_in.stall <= '0';
+
case slave_io is
- when SLAVE_IO_DRAM_INIT =>
- if HAS_DRAM then
- wb_dram_ctrl_in.cyc <= wb_sio_out.cyc;
- wb_sio_in <= wb_dram_ctrl_out;
- else
- wb_sio_in.ack <= wb_sio_out.cyc and wb_sio_out.stb;
- wb_sio_in.dat <= (others => '1');
- wb_sio_in.stall <= '0';
+ when SLAVE_IO_EXTERNAL =>
+ -- Ext IO "chip selects"
+ --
+ -- DRAM init is special at 0xFF* so we just test the top
+ -- bit. Everything else is at 0xC8* so we test only bits
+ -- 23 downto 16.
+ --
+ ext_valid := false;
+ if wb_sio_out.adr(29) = '1' and HAS_DRAM then -- DRAM init is special
+ wb_ext_is_dram_init <= '1';
+ ext_valid := true;
+ elsif wb_sio_out.adr(23 downto 16) = x"00" and HAS_DRAM then
+ wb_ext_is_dram_csr <= '1';
+ ext_valid := true;
end if;
- wb_dram_is_init <= '1';
- when SLAVE_IO_DRAM_CSR =>
- if HAS_DRAM then
- wb_dram_ctrl_in.cyc <= wb_sio_out.cyc;
- wb_sio_in <= wb_dram_ctrl_out;
- else
- wb_sio_in.ack <= wb_sio_out.cyc and wb_sio_out.stb;
- wb_sio_in.dat <= (others => '1');
- wb_sio_in.stall <= '0';
+ if ext_valid then
+ wb_ext_io_in.cyc <= wb_sio_out.cyc;
+ wb_sio_in <= wb_ext_io_out;
end if;
- wb_dram_is_csr <= '1';
+
when SLAVE_IO_SYSCON =>
wb_syscon_in.cyc <= wb_sio_out.cyc;
wb_sio_in <= wb_syscon_out;
wb_sio_in <= wb_spiflash_out;
wb_spiflash_is_reg <= '1';
when others =>
- wb_sio_in.dat <= (others => '1');
- wb_sio_in.ack <= wb_sio_out.stb and wb_sio_out.cyc;
- wb_sio_in.stall <= '0';
end case;
end process;