diff options
-rw-r--r-- | picosoc/README.md | 12 | ||||
-rw-r--r-- | picosoc/firmware.c | 22 | ||||
-rw-r--r-- | picosoc/hx8kdemo_tb.v | 5 | ||||
-rw-r--r-- | picosoc/spimemio.v | 20 | ||||
-rw-r--r-- | picosoc/start.s | 13 |
5 files changed, 57 insertions, 15 deletions
diff --git a/picosoc/README.md b/picosoc/README.md index 5a6413c..c112835 100644 --- a/picosoc/README.md +++ b/picosoc/README.md @@ -55,7 +55,7 @@ GPIO pins mapped to the 32 bit word at address 0x03000000. | 30:23 | Reserved (read 0) | | 22 | DDR Enable bit (reset=0) | | 21 | QSPI Enable bit (reset=0) | -| 20 | Continous Read Enable bit (reset=0) | +| 20 | XIP Enable bit (reset=0) | | 19:16 | Number of QSPI dummy cycles (reset=0) | | 15:12 | Reserved (read 0) | | 11:8 | IO Output enable bits in bit bang mode | @@ -64,3 +64,13 @@ GPIO pins mapped to the 32 bit word at address 0x03000000. | 4 | Serial clock line in bit bang mode | | 3:0 | IO data bits in bit bang mode | +The following settings for XIP/DDR/QSPI modes are valid: + +| XIP | DDR | QSPI | Read Command Byte | Mode Byte | +| :-: | :-: | :--: | :-------------------- | :-------: | +| 0 | 0 | 0 | 03h Read | N/A | +| 0 | 0 | 1 | EBh Quad I/O Read | FFh | +| 1 | 0 | 1 | EBh Quad I/O Read | A5h / FFh | +| 0 | 1 | 1 | EDh DDR Quad I/O Read | FFh | +| 1 | 1 | 1 | EDh DDR Quad I/O Read | A5h / FFh | + diff --git a/picosoc/firmware.c b/picosoc/firmware.c index ecc8657..1e1fcb3 100644 --- a/picosoc/firmware.c +++ b/picosoc/firmware.c @@ -222,7 +222,9 @@ void cmd_benchmark() void main() { reg_uart_clkdiv = 104; + set_quad_spi_flag(); + // reg_spictrl = (reg_spictrl & ~0x00700000) | 0x00600000; while (getchar_prompt("Press ENTER to continue..\n") != '\r') { /* wait */ } @@ -266,9 +268,11 @@ void main() print("\n"); print(" [1] Read SPI Flash ID\n"); print(" [2] Read SPI Config Regs\n"); - print(" [3] Enable/disable DDR\n"); - print(" [4] Enable/disable QSPI\n"); - print(" [5] Enable/disable XIP\n"); + print(" [3] Switch to QSPI DDR XIP mode\n"); + print(" [4] Switch to QSPI DDR mode\n"); + print(" [5] Switch to QSPI XIP mode\n"); + print(" [6] Switch to QSPI mode\n"); + print(" [7] Switch to default mode\n"); print(" [0] Run simplistic benchmark\n"); print("\n"); @@ -289,13 +293,19 @@ void main() cmd_read_flash_regs(); break; case '3': - reg_spictrl ^= 1 << 22; + reg_spictrl = (reg_spictrl & ~0x00700000) | 0x00700000; break; case '4': - reg_spictrl ^= 1 << 21; + reg_spictrl = (reg_spictrl & ~0x00700000) | 0x00600000; break; case '5': - reg_spictrl ^= 1 << 20; + reg_spictrl = (reg_spictrl & ~0x00700000) | 0x00300000; + break; + case '6': + reg_spictrl = (reg_spictrl & ~0x00700000) | 0x00200000; + break; + case '7': + reg_spictrl = (reg_spictrl & ~0x00700000) | 0x00000000; break; case '0': cmd_benchmark(); diff --git a/picosoc/hx8kdemo_tb.v b/picosoc/hx8kdemo_tb.v index 83b1340..1e13cde 100644 --- a/picosoc/hx8kdemo_tb.v +++ b/picosoc/hx8kdemo_tb.v @@ -27,7 +27,10 @@ module testbench; $dumpfile("testbench.vcd"); $dumpvars(0, testbench); - repeat (200000) @(posedge clk); + repeat (6) begin + repeat (50000) @(posedge clk); + $display("+50000 cycles"); + end $finish; end diff --git a/picosoc/spimemio.v b/picosoc/spimemio.v index e5706d7..976e5a2 100644 --- a/picosoc/spimemio.v +++ b/picosoc/spimemio.v @@ -143,6 +143,18 @@ module spimemio ( wire xfer_io2_do; wire xfer_io3_do; + reg xfer_io0_90; + reg xfer_io1_90; + reg xfer_io2_90; + reg xfer_io3_90; + + always @(negedge clk) begin + xfer_io0_90 <= xfer_io0_do; + xfer_io1_90 <= xfer_io1_do; + xfer_io2_90 <= xfer_io2_do; + xfer_io3_90 <= xfer_io3_do; + end + assign flash_csb = config_en ? xfer_csb : config_csb; assign flash_clk = config_en ? xfer_clk : config_clk; @@ -151,10 +163,10 @@ module spimemio ( assign flash_io2_oe = config_en ? xfer_io2_oe : config_oe[2]; assign flash_io3_oe = config_en ? xfer_io3_oe : config_oe[3]; - assign flash_io0_do = config_en ? xfer_io0_do : config_do[0]; - assign flash_io1_do = config_en ? xfer_io1_do : config_do[1]; - assign flash_io2_do = config_en ? xfer_io2_do : config_do[2]; - assign flash_io3_do = config_en ? xfer_io3_do : config_do[3]; + assign flash_io0_do = config_en ? (config_ddr ? xfer_io0_90 : xfer_io0_do) : config_do[0]; + assign flash_io1_do = config_en ? (config_ddr ? xfer_io1_90 : xfer_io1_do) : config_do[1]; + assign flash_io2_do = config_en ? (config_ddr ? xfer_io2_90 : xfer_io2_do) : config_do[2]; + assign flash_io3_do = config_en ? (config_ddr ? xfer_io3_90 : xfer_io3_do) : config_do[3]; spimemio_xfer xfer ( .clk (clk ), diff --git a/picosoc/start.s b/picosoc/start.s index 9a285d1..5e43feb 100644 --- a/picosoc/start.s +++ b/picosoc/start.s @@ -1,8 +1,10 @@ .section .text start: + +# zero-initialize register file addi x1, zero, 0 -addi x2, zero, 0 +# x2 (sp) is initialized by reset addi x3, zero, 0 addi x4, zero, 0 addi x5, zero, 0 @@ -33,9 +35,14 @@ addi x29, zero, 0 addi x30, zero, 0 addi x31, zero, 0 -li sp, 4*256 -call main +# zero initialize scratchpad memory +setmemloop: +sw zero, 0(x1) +addi x1, x1, 4 +blt x1, sp, setmemloop +# call main +call main loop: j loop |