From 5ca5fca29b7586afe6fc07c7244c9e52281a928d Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 14:55:14 -0700 Subject: [PATCH] Get SD card working in SPI --- hw/efinix_fpga/addr_decode.sv | 4 +- hw/efinix_fpga/debug_profile.wizard.json | 1189 +++-------------- hw/efinix_fpga/init_hex.mem | 406 +++--- hw/efinix_fpga/ip/uart/ipm/component.pickle | Bin 14106 -> 14107 bytes hw/efinix_fpga/ip/uart/ipm/graph.pickle | Bin 18761 -> 18768 bytes hw/efinix_fpga/ip/uart/settings.json | 23 +- hw/efinix_fpga/ip/uart/uart.v | 4 +- hw/efinix_fpga/ip/uart/uart_define.vh | 2 +- hw/efinix_fpga/simulation/spi_controller | 448 ------- .../simulation/spi_controller_tb.sv | 4 +- hw/efinix_fpga/super6502.peri.xml | 22 +- hw/efinix_fpga/super6502.sv | 69 +- hw/efinix_fpga/super6502.xml | 7 +- sw/bootloader/Makefile | 2 +- sw/bootloader/devices/io.inc65 | 9 +- sw/bootloader/devices/sd_card.c | 488 ++++++- sw/bootloader/devices/sd_card.h | 80 +- sw/bootloader/devices/sd_card_asm.s | 66 - sw/bootloader/devices/sd_print.c | 176 +++ sw/bootloader/devices/sd_print.h | 61 + sw/bootloader/devices/spi.h | 12 + sw/bootloader/devices/spi.s | 39 + sw/bootloader/main.c | 77 +- 23 files changed, 1257 insertions(+), 1931 deletions(-) delete mode 100755 hw/efinix_fpga/simulation/spi_controller delete mode 100644 sw/bootloader/devices/sd_card_asm.s create mode 100644 sw/bootloader/devices/sd_print.c create mode 100644 sw/bootloader/devices/sd_print.h create mode 100644 sw/bootloader/devices/spi.h create mode 100644 sw/bootloader/devices/spi.s diff --git a/hw/efinix_fpga/addr_decode.sv b/hw/efinix_fpga/addr_decode.sv index 48320cd..bde918f 100644 --- a/hw/efinix_fpga/addr_decode.sv +++ b/hw/efinix_fpga/addr_decode.sv @@ -8,7 +8,7 @@ module addr_decode output o_multiplier_cs, output o_divider_cs, output o_uart_cs, - output o_sdcard_cs, + output o_spi_cs, output o_sdram_cs ); @@ -17,7 +17,7 @@ assign o_timer_cs = i_addr >= 16'heff8 && i_addr <= 16'heffb; assign o_multiplier_cs = i_addr >= 16'heff0 && i_addr <= 16'heff7; assign o_divider_cs = i_addr >= 16'hefe8 && i_addr <= 16'hefef; assign o_uart_cs = i_addr >= 16'hefe6 && i_addr <= 16'hefe7; -assign o_sdcard_cs = i_addr >= 16'hefd8 && i_addr <= 16'hefdf; +assign o_spi_cs = i_addr >= 16'hefd8 && i_addr <= 16'hefdb; assign o_leds_cs = i_addr == 16'hefff; assign o_sdram_cs = i_addr < 16'h8000; diff --git a/hw/efinix_fpga/debug_profile.wizard.json b/hw/efinix_fpga/debug_profile.wizard.json index e3e4271..73565a8 100644 --- a/hw/efinix_fpga/debug_profile.wizard.json +++ b/hw/efinix_fpga/debug_profile.wizard.json @@ -3,12 +3,12 @@ { "name": "la0", "type": "la", - "uuid": "839a8cb8163a4829a5cc15adcbae907b", + "uuid": "68ae6f6753aa4c41b26baf6770f0d8e4", "trigin_en": false, "trigout_en": false, "auto_inserted": true, "capture_control": false, - "data_depth": 4096, + "data_depth": 8192, "input_pipeline": 1, "probes": [ { @@ -56,105 +56,45 @@ "width": 1, "probe_type": 1 }, - { - "name": "u_sdram_adapter/o_dbg_wr_ack", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/next_counter", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/o_data", - "width": 8, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/next_state", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_data_i", - "width": 32, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/i_rwb", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_addr", - "width": 24, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_data_o", - "width": 32, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/i_cs", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/counter", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/state", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_last", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_data_valid", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_wr_ack", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_read", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_write", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_rd_ack", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_rd_valid", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/o_dbg_ref_req", - "width": 1, - "probe_type": 1 - }, { "name": "cpu_rdy", "width": 1, "probe_type": 1 + }, + { + "name": "spi_clk", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_mosi", + "width": 1, + "probe_type": 1 + }, + { + "name": "sd_cs", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_miso", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_controller/active", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_controller/r_clock_counter", + "width": 9, + "probe_type": 1 + }, + { + "name": "spi_controller/r_baud_rate", + "width": 8, + "probe_type": 1 } ] } @@ -282,7 +222,7 @@ }, { "name": "la0_clk", - "net": "i_sysclk", + "net": "clk_50", "path": [] }, { @@ -477,813 +417,154 @@ }, { "name": "la0_probe9", - "net": "o_dbg_wr_ack", - "path": [ - "u_sdram_adapter" - ] + "net": "cpu_rdy", + "path": [] }, { - "name": "la0_probe10[0]", - "net": "next_counter[0]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe10", + "net": "spi_clk", + "path": [] }, { - "name": "la0_probe10[1]", - "net": "next_counter[1]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe11", + "net": "spi_mosi", + "path": [] }, { - "name": "la0_probe11[0]", - "net": "o_data[0]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe12", + "net": "sd_cs", + "path": [] }, { - "name": "la0_probe11[1]", - "net": "o_data[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[2]", - "net": "o_data[2]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[3]", - "net": "o_data[3]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[4]", - "net": "o_data[4]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[5]", - "net": "o_data[5]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[6]", - "net": "o_data[6]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[7]", - "net": "o_data[7]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe12[0]", - "net": "next_state[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe12[1]", - "net": "next_state[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[0]", - "net": "w_data_i[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[1]", - "net": "w_data_i[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[2]", - "net": "w_data_i[2]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[3]", - "net": "w_data_i[3]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[4]", - "net": "w_data_i[4]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[5]", - "net": "w_data_i[5]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[6]", - "net": "w_data_i[6]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[7]", - "net": "w_data_i[7]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[8]", - "net": "w_data_i[8]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[9]", - "net": "w_data_i[9]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[10]", - "net": "w_data_i[10]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[11]", - "net": "w_data_i[11]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[12]", - "net": "w_data_i[12]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[13]", - "net": "w_data_i[13]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[14]", - "net": "w_data_i[14]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[15]", - "net": "w_data_i[15]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[16]", - "net": "w_data_i[16]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[17]", - "net": "w_data_i[17]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[18]", - "net": "w_data_i[18]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[19]", - "net": "w_data_i[19]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[20]", - "net": "w_data_i[20]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[21]", - "net": "w_data_i[21]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[22]", - "net": "w_data_i[22]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[23]", - "net": "w_data_i[23]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[24]", - "net": "w_data_i[24]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[25]", - "net": "w_data_i[25]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[26]", - "net": "w_data_i[26]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[27]", - "net": "w_data_i[27]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[28]", - "net": "w_data_i[28]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[29]", - "net": "w_data_i[29]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[30]", - "net": "w_data_i[30]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[31]", - "net": "w_data_i[31]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe13", + "net": "spi_miso", + "path": [] }, { "name": "la0_probe14", - "net": "i_rwb", + "net": "active", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[0]", - "net": "w_addr[0]", + "net": "r_clock_counter[0]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[1]", - "net": "w_addr[1]", + "net": "r_clock_counter[1]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[2]", - "net": "w_addr[2]", + "net": "r_clock_counter[2]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[3]", - "net": "w_addr[3]", + "net": "r_clock_counter[3]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[4]", - "net": "w_addr[4]", + "net": "r_clock_counter[4]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[5]", - "net": "w_addr[5]", + "net": "r_clock_counter[5]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[6]", - "net": "w_addr[6]", + "net": "r_clock_counter[6]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[7]", - "net": "w_addr[7]", + "net": "r_clock_counter[7]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[8]", - "net": "w_addr[8]", + "net": "r_clock_counter[8]", "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[9]", - "net": "w_addr[9]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[10]", - "net": "w_addr[10]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[11]", - "net": "w_addr[11]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[12]", - "net": "w_addr[12]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[13]", - "net": "w_addr[13]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[14]", - "net": "w_addr[14]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[15]", - "net": "w_addr[15]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[16]", - "net": "w_addr[16]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[17]", - "net": "w_addr[17]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[18]", - "net": "w_addr[18]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[19]", - "net": "w_addr[19]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[20]", - "net": "w_addr[20]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[21]", - "net": "w_addr[21]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[22]", - "net": "w_addr[22]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[23]", - "net": "w_addr[23]", - "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[0]", - "net": "w_data_o[0]", + "net": "r_baud_rate[0]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[1]", - "net": "w_data_o[1]", + "net": "r_baud_rate[1]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[2]", - "net": "w_data_o[2]", + "net": "r_baud_rate[2]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[3]", - "net": "w_data_o[3]", + "net": "r_baud_rate[3]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[4]", - "net": "w_data_o[4]", + "net": "r_baud_rate[4]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[5]", - "net": "w_data_o[5]", + "net": "r_baud_rate[5]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[6]", - "net": "w_data_o[6]", + "net": "r_baud_rate[6]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[7]", - "net": "w_data_o[7]", + "net": "r_baud_rate[7]", "path": [ - "u_sdram_adapter" + "spi_controller" ] - }, - { - "name": "la0_probe16[8]", - "net": "w_data_o[8]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[9]", - "net": "w_data_o[9]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[10]", - "net": "w_data_o[10]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[11]", - "net": "w_data_o[11]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[12]", - "net": "w_data_o[12]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[13]", - "net": "w_data_o[13]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[14]", - "net": "w_data_o[14]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[15]", - "net": "w_data_o[15]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[16]", - "net": "w_data_o[16]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[17]", - "net": "w_data_o[17]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[18]", - "net": "w_data_o[18]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[19]", - "net": "w_data_o[19]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[20]", - "net": "w_data_o[20]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[21]", - "net": "w_data_o[21]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[22]", - "net": "w_data_o[22]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[23]", - "net": "w_data_o[23]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[24]", - "net": "w_data_o[24]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[25]", - "net": "w_data_o[25]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[26]", - "net": "w_data_o[26]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[27]", - "net": "w_data_o[27]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[28]", - "net": "w_data_o[28]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[29]", - "net": "w_data_o[29]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[30]", - "net": "w_data_o[30]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[31]", - "net": "w_data_o[31]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe17", - "net": "i_cs", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe18[0]", - "net": "counter[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe18[1]", - "net": "counter[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe19[0]", - "net": "state[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe19[1]", - "net": "state[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe20", - "net": "w_last", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe21", - "net": "w_data_valid", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe22", - "net": "w_wr_ack", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe23", - "net": "w_read", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe24", - "net": "w_write", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe25", - "net": "w_rd_ack", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe26", - "net": "w_rd_valid", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe27", - "net": "o_dbg_ref_req", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe28", - "net": "cpu_rdy", - "path": [] } ] } @@ -1297,13 +578,13 @@ ], "session": { "wizard": { - "data_depth": 4096, + "data_depth": 8192, "capture_control": false, "selected_nets": [ { "name": "cpu_data_in", "width": 8, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [], @@ -1313,7 +594,7 @@ { "name": "cpu_rwb", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1321,7 +602,7 @@ { "name": "cpu_sync", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1329,7 +610,7 @@ { "name": "cpu_resb", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1337,7 +618,7 @@ { "name": "cpu_addr", "width": 16, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [], @@ -1347,7 +628,7 @@ { "name": "cpu_nmib", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1355,7 +636,7 @@ { "name": "cpu_irqb", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1363,7 +644,7 @@ { "name": "cpu_data_out", "width": 8, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [], @@ -1373,224 +654,84 @@ { "name": "cpu_phi2", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] }, - { - "name": "o_dbg_wr_ack", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "next_counter", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "o_data", - "width": 8, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 7, - "net_idx_right": 0 - }, - { - "name": "next_state", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "w_data_i", - "width": 32, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 31, - "net_idx_right": 0 - }, - { - "name": "i_rwb", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_addr", - "width": 24, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 23, - "net_idx_right": 0 - }, - { - "name": "w_data_o", - "width": 32, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 31, - "net_idx_right": 0 - }, - { - "name": "i_cs", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "counter", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "state", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "w_last", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_data_valid", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_wr_ack", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_read", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_write", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_rd_ack", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_rd_valid", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "o_dbg_ref_req", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, { "name": "cpu_rdy", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] + }, + { + "name": "spi_clk", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "spi_mosi", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "sd_cs", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "spi_miso", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "active", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [ + "spi_controller" + ] + }, + { + "name": "r_clock_counter", + "width": 9, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [ + "spi_controller" + ], + "net_idx_left": 8, + "net_idx_right": 0 + }, + { + "name": "r_baud_rate", + "width": 8, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [ + "spi_controller" + ], + "net_idx_left": 7, + "net_idx_right": 0 } ], "top_module": "super6502", diff --git a/hw/efinix_fpga/init_hex.mem b/hw/efinix_fpga/init_hex.mem index 15cd4f0..b095bf6 100644 --- a/hw/efinix_fpga/init_hex.mem +++ b/hw/efinix_fpga/init_hex.mem @@ -1,207 +1,152 @@ @00000000 -4C 00 00 8D 11 02 8E 12 02 8D 18 02 8E 19 02 88 -B9 FF FF 8D 22 02 88 B9 FF FF 8D 21 02 8C 24 02 -20 FF FF A0 FF D0 E8 60 00 00 02 FB 00 00 00 00 -A2 FF 9A D8 A9 F0 85 00 A9 7E 85 01 20 7A FB 20 -05 F8 20 50 F0 58 20 29 F1 6C FC FF 20 F9 F7 00 -A0 00 F0 07 A9 50 A2 F0 4C 03 02 60 AD FF EF A2 -00 60 8D FF EF 60 20 0F F1 C9 0A D0 05 A9 0D 20 -0F F1 60 DA 5A A8 B2 00 AA A9 1B 20 0F F1 A9 5B -20 0F F1 98 20 0F F1 A9 3B 20 0F F1 8A 20 0F F1 -A9 48 20 0F F1 7A FA 60 DA A9 1B 20 0F F1 A9 63 -20 0F F1 68 60 40 DA BA 48 E8 E8 BD 00 01 29 10 -D0 06 68 FA 20 28 F1 40 4C B8 F0 48 20 6B F9 8D -D8 EF 8E D9 EF A5 02 8D DA EF A5 03 8D DB EF 68 -8D DC EF 60 5A 85 08 86 09 AD DC EF 29 01 F0 F9 -AD D8 EF A0 00 91 08 AD D9 EF C8 91 08 AD DA EF -C8 91 08 AD DB EF C8 91 08 7A 60 AD DD EF A2 00 -60 48 AD DC EF 29 02 F0 F9 68 60 8D E6 EF 60 48 -8D E6 EF AD E7 EF 89 02 D0 F9 68 60 AD E6 EF A2 -00 60 AD E7 EF A2 00 60 60 20 9D F8 20 98 F0 A9 -C4 A2 FB 20 66 F8 A9 9D A2 FB 20 79 FA A0 02 20 -32 F8 20 AA F1 A9 D6 A2 FB 20 79 FA A0 02 20 32 -F8 20 F7 F2 A0 00 20 A7 FA A9 E6 A2 FB 20 79 FA -A0 03 20 21 F9 20 79 FA A0 04 20 32 F8 A0 01 20 -21 F9 20 36 F3 A9 EF A2 FB 20 79 FA A0 02 20 32 -F8 4C 87 F1 4C 81 F1 4C 84 F1 A9 B2 A2 FB 20 79 -FA AD FC FF AE FD FF 20 79 FA A0 04 20 32 F8 A2 -00 A9 00 4C A6 F1 20 CC F8 60 20 B7 F8 A9 1B A2 -FC 20 66 F8 A2 00 86 02 86 03 A9 00 20 89 F9 A2 -00 A9 00 20 BB F0 A9 0F A2 FC 20 79 FA A0 02 20 -32 F8 A2 01 A9 00 85 02 A9 00 85 03 A9 AA 20 89 -F9 A2 00 A9 08 20 BB F0 A9 02 20 3B F9 20 D4 F0 -A9 32 A2 FC 20 79 FA A0 07 20 2A F9 20 89 F9 A0 -06 20 32 F8 A2 00 A9 00 A0 01 91 00 A0 01 A2 00 -B1 00 C9 65 A9 00 A2 00 2A D0 03 4C 2D F2 A9 F6 -A2 FB 20 79 FA A0 02 20 32 F8 4C F3 F2 A2 00 86 -02 86 03 A9 00 20 89 F9 A2 00 A9 37 20 BB F0 A9 -02 20 3B F9 20 D4 F0 A2 00 A9 18 85 02 A9 40 85 -03 A9 00 20 89 F9 A2 00 A9 29 20 BB F0 A9 02 20 -3B F9 20 D4 F0 A9 03 A2 FC 20 79 FA A0 07 20 2A -F9 20 89 F9 A0 06 20 32 F8 A2 00 A9 00 A0 00 91 -00 A0 00 A2 00 B1 00 C9 FF 20 55 FA F0 03 4C 94 -F2 4C A2 F2 A0 00 A2 00 18 A9 01 71 00 91 00 4C -81 F2 A0 01 A2 00 18 A9 01 71 00 91 00 A0 05 20 -2A F9 20 89 F9 A2 00 86 02 86 03 A9 00 20 47 F9 -F0 03 4C 0C F2 A2 00 86 02 86 03 A9 00 20 89 F9 -A2 00 A9 02 20 BB F0 A9 02 20 3B F9 20 D4 F0 A9 -27 A2 FC 20 79 FA A0 07 20 2A F9 20 89 F9 A0 06 -20 32 F8 20 DF F8 60 20 AA F8 A2 00 86 02 86 03 -A9 00 20 89 F9 A2 00 A9 03 20 BB F0 A2 00 86 02 -86 03 A9 00 A0 00 20 B2 FA A5 00 A6 01 20 D4 F0 -A0 03 20 2A F9 A0 00 A6 03 A5 02 84 03 84 02 4C -32 F3 20 DA F8 60 20 79 FA 20 AA F8 A0 05 20 21 -F9 20 F2 F7 86 03 85 02 A9 00 AA 20 89 F9 A2 00 -A9 07 20 BB F0 A5 00 A6 01 20 D4 F0 A0 01 20 21 -F9 4C 64 F3 20 DF F8 60 20 79 FA 20 AA F8 A0 05 -20 21 F9 20 F2 F7 86 03 85 02 A9 00 AA 20 89 F9 -A2 00 A9 0D 20 BB F0 A5 00 A6 01 20 D4 F0 A0 01 -20 21 F9 4C 96 F3 20 DF F8 60 20 79 FA 20 B7 F8 -A0 0B 20 2A F9 20 89 F9 A2 00 A9 11 20 BB F0 A9 -02 20 3B F9 20 D4 F0 20 01 F1 A2 00 A9 00 A0 00 -20 A7 FA A0 01 20 21 F9 C9 00 8A E9 02 50 02 49 -80 0A A9 00 A2 00 2A F0 03 4C DF F3 4C 06 F4 A0 -07 20 21 F9 20 79 FA A0 03 20 21 F9 20 B3 F7 20 -79 FA 20 FB F0 A0 00 20 8F FA A0 00 A2 00 A9 01 -20 CF F7 4C C3 F3 A0 0C 20 DF F7 60 A0 00 B1 16 -E6 16 D0 02 E6 17 60 AD 3B 04 8D 36 04 20 B8 F4 -A9 36 A2 04 20 79 FA 20 70 FA 4C 00 02 A5 14 38 -E9 02 85 14 B0 02 C6 15 60 AD 40 04 D0 11 20 56 -F4 4C F2 F7 AD 40 04 D0 06 20 56 F4 4C EC F7 20 -56 F4 85 02 86 03 20 2D F4 A0 01 B1 14 AA 88 B1 -14 60 A0 00 84 08 84 09 B1 16 38 E9 30 90 2C C9 -0A B0 28 20 10 F4 48 A5 08 A6 09 06 08 26 09 06 -08 26 09 65 08 85 08 8A 65 09 85 09 06 08 26 09 -68 65 08 85 08 90 D1 E6 09 B0 CD A5 08 A6 09 60 -AC 42 04 EE 42 04 99 43 04 60 A9 43 A2 04 18 6D -42 04 90 01 E8 4C 79 FA A5 18 A6 19 4C 79 FA 20 -17 F4 EE 3C 04 D0 F8 EE 3D 04 D0 F3 60 20 B8 F4 -AD 57 04 AE 58 04 20 79 FA AD 59 04 AE 5A 04 20 -79 FA 4C 00 02 84 08 20 89 F9 20 AA F4 A5 08 4C -B9 F9 84 08 20 89 F9 20 AA F4 A5 08 4C FA F9 48 -A0 05 B9 14 00 99 30 04 88 10 F7 68 85 14 86 15 -20 C4 F8 85 16 86 17 20 C4 F8 85 18 86 19 A9 00 -A8 91 18 C8 91 18 C8 B1 18 8D 01 02 C8 B1 18 8D -02 02 A5 16 85 08 A5 17 85 09 A0 00 B1 16 F0 0B -C9 25 F0 07 C8 D0 F5 E6 17 D0 F1 98 18 65 16 85 -16 90 02 E6 17 38 E5 08 85 0A A5 17 E5 09 85 0B -05 0A F0 25 20 B7 F8 A0 05 A5 19 91 00 88 A5 18 -91 00 88 A5 09 91 00 88 A5 08 91 00 88 A5 0B 91 -00 88 A5 0A 91 00 20 00 02 20 0C F4 AA D0 0B A2 -05 BD 30 04 95 14 CA 10 F8 60 C9 25 D0 09 B1 16 -C9 25 D0 09 20 10 F4 20 1A F4 4C 32 F5 A9 00 A2 -0B 9D 37 04 CA 10 FA B1 16 C9 2D D0 05 8E 37 04 -F0 19 C9 2B D0 05 8E 38 04 F0 10 C9 20 D0 05 8E -39 04 F0 07 C9 23 D0 09 8E 3A 04 20 10 F4 4C B7 -F5 A2 20 C9 30 D0 06 AA 20 10 F4 B1 16 8E 3B 04 -C9 2A D0 09 20 10 F4 20 56 F4 4C 00 F6 20 62 F4 -8D 3C 04 8E 3D 04 8C 3E 04 8C 3F 04 B1 16 C9 2E -D0 1B 20 10 F4 B1 16 C9 2A D0 09 20 10 F4 20 56 -F4 4C 27 F6 20 62 F4 8D 3E 04 8E 3F 04 B1 16 C9 -7A F0 19 C9 68 F0 15 C9 74 F0 11 C9 6A F0 08 C9 -4C F0 04 C9 6C D0 0B A9 FF 8D 40 04 20 10 F4 4C -2D F6 8C 42 04 A2 43 8E 57 04 A2 04 8E 58 04 20 -10 F4 C9 63 D0 0E 20 56 F4 8D 43 04 A9 00 8D 44 -04 4C 51 F7 C9 64 F0 04 C9 69 D0 2D A2 00 AD 39 -04 F0 02 A2 20 AD 38 04 F0 02 A2 2B 8E 41 04 20 -44 F4 A4 03 30 0B AC 41 04 F0 06 8C 43 04 EE 42 -04 A0 0A 20 E5 F4 4C 51 F7 C9 6E D0 15 20 56 F4 -85 08 86 09 A0 00 B1 18 91 08 C8 B1 18 91 08 4C -32 F5 C9 6F D0 27 20 44 F4 AC 3A 04 F0 17 48 86 -10 05 10 05 02 05 03 0D 3E 04 0D 3F 04 F0 06 A9 -30 20 A0 F4 68 A0 08 20 E5 F4 4C 51 F7 C9 70 D0 -0D A2 00 8E 40 04 E8 8E 3A 04 A9 78 D0 27 C9 73 -D0 0C 20 56 F4 8D 57 04 8E 58 04 4C 51 F7 C9 75 -D0 0B 20 39 F4 A0 0A 20 F2 F4 4C 51 F7 C9 78 F0 -04 C9 58 D0 29 48 AD 3A 04 F0 0A A9 30 20 A0 F4 -A9 58 20 A0 F4 20 39 F4 A0 10 20 F2 F4 68 C9 78 -D0 09 AD 57 04 AE 58 04 20 DB FA 4C 51 F7 4C 32 -F5 AD 57 04 AE 58 04 20 C5 FA 8D 59 04 8E 5A 04 -AD 3E 04 0D 3F 04 F0 15 AE 3E 04 EC 59 04 AD 3F -04 A8 ED 5A 04 B0 06 8E 59 04 8C 5A 04 38 AD 3C -04 ED 59 04 AA AD 3D 04 ED 5A 04 B0 03 A9 00 AA -49 FF 8D 3D 04 8A 49 FF 8D 3C 04 AD 37 04 D0 03 -20 C2 F4 20 CD F4 AD 37 04 F0 03 20 C2 F4 4C 32 -F5 A2 00 18 A0 00 71 00 C8 85 10 8A 71 00 AA 18 -A5 00 69 02 85 00 90 02 E6 01 A5 10 60 A0 00 18 +8D 0E 02 8E 0F 02 8D 15 02 8E 16 02 88 B9 FF FF +8D 1F 02 88 B9 FF FF 8D 1E 02 8C 21 02 20 FF FF +A0 FF D0 E8 60 A2 FF 9A D8 A9 F0 85 00 A9 7E 85 +01 20 CD F8 20 38 F7 20 45 F0 58 20 E6 F0 6C FC +FF 20 2C F7 00 A0 00 F0 07 A9 45 A2 F0 4C 00 02 +60 AD FF EF A2 00 60 8D FF EF 60 20 CC F0 C9 0A +D0 05 A9 0D 20 CC F0 60 DA 5A A8 B2 00 AA A9 1B +20 CC F0 A9 5B 20 CC F0 98 20 CC F0 A9 3B 20 CC +F0 8A 20 CC F0 A9 48 20 CC F0 7A FA 60 DA A9 1B +20 CC F0 A9 63 20 CC F0 68 60 40 DA BA 48 E8 E8 +BD 00 01 29 10 D0 06 68 FA 20 E5 F0 40 4C AD F0 +A9 01 8D DB EF 60 9C DB EF 60 A9 00 8D DA EF AD +DB EF 30 FB AD D9 EF 60 8D E6 EF 60 48 8D E6 EF +AD E7 EF 89 02 D0 F9 68 60 AD E6 EF A2 00 60 AD +E7 EF A2 00 60 60 20 B8 F7 A2 00 86 02 86 03 A9 +00 20 38 F8 20 91 F7 A9 14 A2 F9 20 6F F7 20 28 +F1 C9 00 20 50 F8 D0 03 4C 15 F1 A9 F0 A2 F8 20 +6F F7 4C 1C F1 A9 05 A2 F9 20 6F F7 4C 1F F1 4C +1F F1 A0 0C 20 1F F7 60 20 C5 F7 A9 00 20 80 F8 +20 9A F2 4C 5F F1 A0 00 A2 00 18 A9 01 71 00 91 +00 A0 00 A2 00 B1 00 C9 FF 20 56 F8 D0 03 4C 5F +F1 A9 36 A2 F9 20 6F F7 A2 00 A9 01 4C 96 F2 20 +B1 F4 A0 01 91 00 C9 01 20 50 F8 D0 C9 A2 00 A9 +00 A0 06 20 C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 +E8 20 6F F8 F0 03 4C 8C F1 4C 98 F1 A0 06 A2 00 +A9 01 20 0F F7 4C 76 F1 A9 01 20 23 F8 20 0B F5 +A0 01 A2 00 B1 00 C9 01 20 50 F8 D0 03 4C BE F1 +A9 2C A2 F9 20 6F F7 A2 00 A9 01 4C 96 F2 A0 05 +A2 00 B1 00 C9 AA 20 50 F8 D0 03 4C D5 F1 A2 00 +A9 01 4C 96 F2 A2 00 A9 00 A0 00 91 00 A0 00 A2 +00 B1 00 C9 FF 20 56 F8 D0 03 4C FB F1 A9 1C A2 +F9 20 6F F7 A2 00 A9 01 4C 96 F2 20 2D F6 A0 01 +91 00 A0 01 A2 00 B1 00 C9 02 20 6F F8 D0 03 4C +19 F2 20 87 F6 A0 01 91 00 A2 00 A9 00 A0 06 20 +C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 E8 20 6F F8 +F0 03 4C 38 F2 4C 44 F2 A0 06 A2 00 A9 01 20 0F +F7 4C 22 F2 A0 00 A2 00 18 A9 01 71 00 91 00 A0 +01 A2 00 B1 00 C9 00 20 50 F8 D0 81 A2 00 A9 00 +A0 06 20 C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 E8 +20 6F F8 F0 03 4C 7B F2 4C 87 F2 A0 06 A2 00 A9 +01 20 0F F7 4C 65 F2 A9 01 20 23 F8 20 B3 F5 A2 +00 A9 00 4C 96 F2 20 F9 F7 60 20 9E F7 A2 00 A9 +00 20 B6 F0 A2 00 A9 00 A0 01 20 C4 F8 A0 02 20 +09 F8 E0 03 D0 02 C9 E8 20 6F F8 F0 03 4C C3 F2 +4C CF F2 A0 01 A2 00 A9 01 20 0F F7 4C AD F2 A2 +00 A9 FF 20 BC F0 A2 00 A9 00 20 B6 F0 A2 00 A9 +00 A0 00 91 00 A0 00 A2 00 B1 00 C9 50 20 6F F8 +F0 03 4C F8 F2 4C 0D F3 A2 00 A9 FF 20 BC F0 A0 +00 A2 00 18 A9 01 71 00 91 00 4C E5 F2 20 EF F7 +60 20 80 F8 A0 05 A2 00 B1 00 09 40 A2 00 20 BC +F0 A0 04 20 12 F8 A2 00 A5 03 86 02 86 03 A2 00 +20 BC F0 A0 04 20 12 F8 A0 00 A6 03 A5 02 84 03 +84 02 A2 00 20 BC F0 A0 04 20 12 F8 8A A6 02 A4 +03 84 02 A0 00 84 03 A2 00 20 BC F0 A0 01 A2 00 +B1 00 20 BC F0 A0 00 A2 00 B1 00 09 01 A2 00 20 +BC F0 20 F4 F7 60 A9 00 20 80 F8 20 88 F7 4C A1 +F3 A0 01 A2 00 18 A9 01 71 00 91 00 A0 01 A2 00 +B1 00 C9 09 A9 00 A2 00 2A D0 03 4C A1 F3 4C B3 +F3 A2 00 A9 FF 20 BC F0 A0 00 91 00 C9 FF 20 56 +F8 D0 CE A0 00 A2 00 B1 00 4C BC F3 20 E1 F7 60 +20 96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 A0 00 +20 AC F8 A0 01 20 09 F8 1A D0 01 E8 20 96 F8 A2 +00 A9 FF 20 BC F0 A0 00 20 AC F8 20 E1 F7 60 20 +96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 A0 00 20 +AC F8 A0 01 20 09 F8 A0 00 20 FE F7 C9 02 A9 00 +A2 00 2A D0 03 4C 1B F4 4C 2E F4 A0 01 20 09 F8 +1A D0 01 E8 20 96 F8 A2 00 A9 04 20 75 F4 20 E1 +F7 60 20 96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 +A0 00 20 AC F8 A0 01 20 09 F8 A0 00 20 FE F7 C9 +02 A9 00 A2 00 2A D0 03 4C 5E F4 4C 71 F4 A0 01 +20 09 F8 1A D0 01 E8 20 96 F8 A2 00 A9 04 20 75 +F4 20 E1 F7 60 20 80 F8 4C 9A F4 A0 02 20 09 F8 +20 96 F8 A2 00 A9 FF 48 A0 03 A2 00 A9 01 20 0F +F7 68 20 BC F0 A0 00 20 AC F8 A0 00 B1 00 08 A0 +00 A2 00 B1 00 38 E9 01 91 00 28 D0 CE 20 EF F7 +60 20 88 F7 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 +B0 F0 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 80 F8 +A2 00 86 02 86 03 A9 00 20 38 F8 A2 00 A9 94 20 +11 F3 20 76 F3 A0 00 91 00 A2 00 A9 FF 20 BC F0 +A2 00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 A0 00 +A2 00 B1 00 4C 07 F5 20 D2 F7 60 20 96 F8 A2 00 +A9 FF 20 BC F0 A2 00 A9 00 20 B0 F0 A2 00 A9 FF +20 BC F0 A2 00 A9 08 20 80 F8 A2 01 A9 00 85 02 +A9 00 85 03 A9 AA 20 38 F8 A2 00 A9 86 20 11 F3 +A0 01 20 09 F8 20 32 F4 A2 00 A9 FF 20 BC F0 A2 +00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 20 E1 F7 +60 20 96 F8 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 +B0 F0 A2 00 A9 FF 20 BC F0 A2 00 A9 0D 20 80 F8 +A2 00 86 02 86 03 A9 00 20 38 F8 A2 00 A9 00 20 +11 F3 A0 01 20 09 F8 20 C0 F3 A2 00 A9 FF 20 BC +F0 A2 00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 20 +E1 F7 60 20 96 F8 20 88 F7 A2 00 A9 FF 20 BC F0 +A2 00 A9 00 20 B0 F0 A2 00 A9 FF 20 BC F0 A0 00 +91 00 A0 00 A2 00 B1 00 C9 FF 20 50 F8 D0 03 4C +F3 F5 4C E5 F5 A2 00 A9 FF 20 BC F0 C9 FF 20 50 +F8 D0 F2 A2 00 A9 3A 20 80 F8 A2 00 86 02 86 03 +A9 00 20 38 F8 A2 00 A9 00 20 11 F3 A0 02 20 09 +F8 20 EF F3 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 +B6 F0 A2 00 A9 FF 20 BC F0 20 EF F7 60 20 88 F7 +A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 B0 F0 A2 00 +A9 FF 20 BC F0 A2 00 A9 37 20 80 F8 A2 00 86 02 +86 03 A9 00 20 38 F8 A2 00 A9 00 20 11 F3 20 76 +F3 A0 00 91 00 A2 00 A9 FF 20 BC F0 A2 00 A9 00 +20 B6 F0 A2 00 A9 FF 20 BC F0 A0 00 A2 00 B1 00 +4C 83 F6 20 D2 F7 60 20 88 F7 A2 00 A9 FF 20 BC +F0 A2 00 A9 00 20 B0 F0 A2 00 A9 FF 20 BC F0 A2 +00 A9 29 20 80 F8 A2 00 86 02 A9 40 85 03 A9 00 +20 38 F8 A2 00 A9 00 20 11 F3 20 76 F3 A0 00 91 +00 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 B6 F0 A2 +00 A9 FF 20 BC F0 A0 00 A2 00 B1 00 4C DF F6 20 +D2 F7 60 20 96 F8 20 B8 F7 A0 05 A2 00 B1 00 4C +F2 F6 A0 0E 20 1F F7 60 20 96 F8 20 B8 F7 A0 03 +A2 00 B1 00 4C 07 F7 A0 0E 20 1F F7 60 A0 00 18 71 00 91 00 48 C8 8A 71 00 91 00 AA 68 60 C8 48 -18 98 65 00 85 00 90 02 E6 01 68 60 A0 FF E0 80 -B0 02 A0 00 84 02 84 03 60 A0 00 F0 07 A9 50 A2 -F0 4C 03 02 60 A9 00 85 08 A9 F0 85 09 A9 00 85 -0A A9 02 85 0B A2 CF A9 FF 85 10 A0 00 E8 F0 0D -B1 08 91 0A C8 D0 F6 E6 09 E6 0B D0 F0 E6 10 D0 -EF 60 8C 5B 04 88 88 98 18 65 00 85 08 A6 01 90 -01 E8 86 09 A0 01 B1 08 AA 88 B1 08 20 79 FA A5 -08 A6 09 20 4A FB AC 5B 04 4C DF F7 85 08 86 09 -20 73 F0 4C 6A F8 85 08 86 09 A0 00 B1 08 F0 0E -C8 84 10 20 66 F0 A4 10 D0 F2 E6 09 D0 EE 60 E0 -00 D0 15 4A AA BD 64 FC 90 05 4A 4A 4A 4A 18 29 -0F AA BD 59 FC A2 00 60 38 A9 00 AA 60 A5 00 38 -E9 02 85 00 90 01 60 C6 01 60 A5 00 38 E9 04 85 -00 90 01 60 C6 01 60 A5 00 38 E9 06 85 00 90 01 -60 C6 01 60 A0 01 B1 00 AA 88 B1 00 E6 00 F0 05 -E6 00 F0 03 60 E6 00 E6 01 60 A0 04 4C DF F7 A0 -06 4C DF F7 85 08 86 09 A0 03 B1 00 38 E5 03 D0 -22 88 B1 00 C5 02 D0 0C 88 B1 00 C5 09 D0 05 88 -B1 00 C5 08 08 20 DA F8 28 F0 04 B0 03 A9 FF 60 -A9 01 60 50 04 49 FF 09 01 08 20 DA F8 28 60 A0 -01 B1 00 AA 88 B1 00 60 A0 03 B1 00 85 03 88 B1 -00 85 02 88 B1 00 AA 88 B1 00 60 A2 00 18 65 00 -48 8A 65 01 AA 68 60 20 E4 F8 4C 36 FA 18 49 FF -69 01 48 8A 49 FF 69 00 AA A5 02 49 FF 69 00 85 -02 A5 03 49 FF 69 00 85 03 68 60 A0 03 B1 00 85 -03 88 B1 00 85 02 88 B1 00 AA 88 B1 00 4C DA F8 -A9 00 AA A0 00 84 02 84 03 48 20 AA F8 A0 03 A5 -03 91 00 88 A5 02 91 00 88 8A 91 00 68 88 91 00 -60 85 10 20 C4 F8 85 0A 86 0B 85 0C 86 0D 20 62 -FA 20 C4 F8 85 02 86 03 60 20 A1 F9 A6 03 A4 10 -C0 0A D0 39 A5 02 05 09 05 08 D0 11 E0 80 D0 0D -A0 0B B9 4D FC 91 0A 88 10 F8 4C 31 FA 8A 10 1D -A9 2D A0 00 91 0A E6 0A D0 02 E6 0B A5 08 A6 09 -20 4D F9 85 08 86 09 4C FD F9 20 A1 F9 A9 00 48 -A0 20 A9 00 06 08 26 09 26 02 26 03 2A C5 10 90 -04 E5 10 E6 08 88 D0 EC A8 B9 3D FC 48 A5 08 05 -09 05 02 05 03 D0 D9 A0 00 68 91 0A F0 03 C8 D0 -F8 A5 0C A6 0D 60 D0 06 A2 00 8A 60 D0 FA A2 00 -A9 01 60 F0 F9 30 F7 A2 00 8A 60 F0 02 10 EF A2 -00 8A 60 F0 E9 90 E7 A2 00 8A 60 F0 DB A2 00 8A -2A 60 A0 01 B1 00 85 09 88 B1 00 85 08 4C CC F8 -A9 01 4C 77 FA A9 00 A2 00 48 A5 00 38 E9 02 85 -00 B0 02 C6 01 A0 01 8A 91 00 68 88 91 00 60 48 -84 10 A0 01 B1 00 85 09 88 B1 00 85 08 A4 10 68 -91 08 4C CC F8 A0 00 91 00 C8 48 8A 91 00 68 60 -A0 00 91 00 C8 48 8A 91 00 C8 A5 02 91 00 C8 A5 -03 91 00 68 60 85 0A 86 0B A2 00 A0 00 B1 0A F0 -08 C8 D0 F9 E6 0B E8 D0 F4 98 60 85 08 86 09 85 -0A 86 0B A0 00 B1 08 F0 14 20 83 F8 29 02 F0 06 -B1 08 69 20 91 08 C8 D0 EC E6 09 D0 E8 A5 0A A6 -0B 60 20 C4 F8 85 0A 86 0B E8 8E 2F 02 AA E8 8E -2E 02 20 62 FA 20 C4 F8 85 0C 86 0D A0 00 84 10 -B1 0C 18 65 0A 91 0C C8 B1 0C 65 0B 91 0C CE 2E -02 F0 11 A4 10 B1 08 C8 D0 02 E6 09 84 10 20 66 -F0 4C 2E FB CE 2F 02 D0 EA 60 85 08 86 09 A9 00 -8D 28 02 8D 29 02 A0 01 B1 00 AA 88 B1 00 20 79 -FA A0 02 A9 28 91 00 C8 A9 02 91 00 A5 08 A6 09 -20 FF F4 AD 28 02 AE 29 02 60 A9 30 85 08 A9 02 -85 09 A9 00 A8 A2 02 F0 0A 91 08 C8 D0 FB E6 09 -CA D0 F6 C0 2C F0 05 91 08 C8 D0 F7 60 41 6E 64 -20 74 65 73 74 69 6E 67 20 63 70 72 69 6E 74 66 -0A 00 52 65 73 65 74 20 76 65 63 74 6F 72 3A 20 -25 78 0A 00 53 74 61 72 74 69 6E 67 20 73 64 5F -69 6E 69 74 0A 00 66 69 6E 69 73 68 20 73 64 5F -69 6E 69 74 0A 00 72 63 61 3A 20 25 78 0A 00 44 -6F 6E 65 21 0A 00 53 44 20 54 69 6D 65 64 20 6F -75 74 00 43 4D 44 34 31 3A 20 25 6C 78 0A 00 53 -65 6E 74 20 52 65 73 65 74 0A 00 49 6E 20 73 64 -5F 69 6E 69 74 0A 00 43 4D 44 32 3A 20 25 6C 78 -0A 00 43 4D 44 38 3A 20 25 6C 78 0A 00 30 31 32 -33 34 35 36 37 38 39 41 42 43 44 45 46 2D 32 31 -34 37 34 38 33 36 34 38 00 00 01 02 0C 09 0A 10 -40 50 A0 D0 66 66 66 66 A6 88 88 66 66 66 66 66 -66 66 66 66 09 00 00 00 00 00 00 00 33 33 33 33 -33 00 00 00 50 55 55 25 22 22 22 22 22 22 22 22 -22 02 00 00 40 44 44 14 11 11 11 11 11 11 11 11 -11 01 00 70 00 00 00 00 00 00 00 00 00 00 00 00 +18 98 65 00 85 00 90 02 E6 01 68 60 A0 00 F0 07 +A9 45 A2 F0 4C 00 02 60 A9 00 85 08 A9 F0 85 09 +A9 00 85 0A A9 02 85 0B A2 DA A9 FF 85 10 A0 00 +E8 F0 0D B1 08 91 0A C8 D0 F6 E6 09 E6 0B D0 F0 +E6 10 D0 EF 60 85 08 86 09 20 68 F0 4C 73 F7 85 +08 86 09 A0 00 B1 08 F0 0E C8 84 10 20 5B F0 A4 +10 D0 F2 E6 09 D0 EE 60 A4 00 D0 02 C6 01 C6 00 +60 A5 00 38 E9 02 85 00 90 01 60 C6 01 60 A5 00 +38 E9 03 85 00 90 01 60 C6 01 60 A5 00 38 E9 04 +85 00 90 01 60 C6 01 60 A5 00 38 E9 06 85 00 90 +01 60 C6 01 60 A5 00 38 E9 07 85 00 90 01 60 C6 +01 60 E6 00 D0 02 E6 01 60 A0 01 B1 00 AA 88 B1 +00 E6 00 F0 05 E6 00 F0 03 60 E6 00 E6 01 60 A0 +03 4C 1F F7 A0 06 4C 1F F7 A0 08 4C 1F F7 85 08 +86 09 A2 00 B1 08 60 A0 01 B1 00 AA 88 B1 00 60 +A0 03 B1 00 85 03 88 B1 00 85 02 88 B1 00 AA 88 +B1 00 60 A2 00 18 65 00 48 8A 65 01 AA 68 60 A9 +00 AA A0 00 84 02 84 03 48 20 AB F7 A0 03 A5 03 +91 00 88 A5 02 91 00 88 8A 91 00 68 88 91 00 60 +D0 06 A2 00 8A 60 D0 FA A2 00 A9 01 60 F0 F9 30 +F7 A2 00 8A 60 F0 02 10 EF A2 00 8A 60 F0 E9 90 +E7 A2 00 8A 60 F0 DB A2 00 8A 2A 60 A0 00 B1 00 +A4 00 F0 07 C6 00 A0 00 91 00 60 C6 01 C6 00 91 +00 60 A9 00 A2 00 48 A5 00 38 E9 02 85 00 B0 02 +C6 01 A0 01 8A 91 00 68 88 91 00 60 48 84 10 A0 +01 B1 00 85 09 88 B1 00 85 08 A4 10 68 91 08 4C +E1 F7 A0 00 91 00 C8 48 8A 91 00 68 60 A9 25 85 +08 A9 02 85 09 A9 00 A8 A2 02 F0 0A 91 08 C8 D0 +FB E6 09 CA D0 F6 C0 00 F0 05 91 08 C8 D0 F7 60 +45 72 72 6F 72 20 69 6E 69 74 20 53 44 20 43 41 +52 44 0D 0A 00 53 44 20 43 61 72 64 20 69 6E 69 +74 0D 0A 00 53 74 61 72 74 0D 0A 00 6F 70 5F 63 +6F 6E 64 20 65 72 72 6F 72 0D 0A 00 49 46 20 43 +6F 6E 64 0D 0A 00 47 6F 20 49 44 4C 45 0D 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -254,4 +199,59 @@ CA D0 F6 C0 2C F0 05 91 08 C8 D0 F7 60 41 6E 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -00 00 00 00 00 00 00 00 00 00 A5 F0 30 F0 A6 F0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 9A F0 25 F0 9B F0 diff --git a/hw/efinix_fpga/ip/uart/ipm/component.pickle b/hw/efinix_fpga/ip/uart/ipm/component.pickle index 812cad03c96171fdd1087cb031c06e11266f3898..2a652e30158ff6b700bfd2559609586bc921ff08 100644 GIT binary patch delta 2693 zcmbW3O=uHA6vsPtQ>)T8Ax&%=lP1`Fn>9_fY86eiwY1cxhWLr7iB^`u)@WP5+Dcml zE5<{8tDr?iJ%}HNN-iQOih59rcu`Rh1X1wdM-E~SD$YhDBs04~FOS)o_j~i+?tkCR znXa)eZjd{vzQMgJRpB92Pyngga%d|lhM%Ro(Su~Xti4cuhs@)<#JGmU0TJJary3I~ zNq*9-M3o;i(@sH^n6^B)reRAs7-q(X%+N~7p}1Dw~-pksfi zs7CLTrG_PFW>#KB?ZI$!WP_Ahw9-a0J5srprazJ;8)%I?!KZsCU)X;pcfzy`ZHItq zD~iJfQv&q^Z}y;J*l6x_ADZ&#>p1Zc8RAjN3`^#4X65(e2&BxbDfe^o?xTDIj8~~C zV$(=2%qj?a9uujP%a>BZ#jIe|? zu8f2j!n&OgVGHZAGPcg+rR4HL4q?dUo5xA<@Be{6F~{x6mFrhIemw`8*$bh{t1ioG zZG|cbnraxmZP2?ooat>uSma1b=y`r_Pe*r8tfOn2Ft;bRr8l~#hugv6Z~Y*9mAQ}>HARJ$aCrIkX7e}zWF8D5k4zNFc2AoRmXE? oX%IJh4bqX%tqeD=7I9W89Qf)Cf2;Zq;ktzg!7*Zs;6dHmU*=l|+yDRo delta 2730 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 U7(26Hx-Q$_l)2D=Fa3=F4{Vlc{r~^~ diff --git a/hw/efinix_fpga/ip/uart/settings.json b/hw/efinix_fpga/ip/uart/settings.json index 182d6fc..cee281a 100644 --- a/hw/efinix_fpga/ip/uart/settings.json +++ b/hw/efinix_fpga/ip/uart/settings.json @@ -19,31 +19,16 @@ "ENABLE_PARITY": "1'b0", "FIX_BAUDRATE": "1'b1", "PARITY_MODE": "1'b0", - "BOOTUP_CHECK": "1'b1" + "BOOTUP_CHECK": "1'b0" }, "output": { "external_source_source": [ - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_define.vh", "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_tmpl.v", "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_tmpl.vhd" - ], - "external_example_example": [ - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/command_state.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/decoder.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/encoder.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/led_ctl.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/resets.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_defines.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_demo_top.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/user_register.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_demo.peri.xml", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_demo.xml", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_timing_T20.sdc", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_define.vh" + "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_tmpl.vhd", + "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_define.vh" ] }, "sw_version": "2023.1.150", - "generated_date": "2023-07-16T20:20:12.259229" + "generated_date": "2023-07-23T03:23:04.338270" } \ No newline at end of file diff --git a/hw/efinix_fpga/ip/uart/uart.v b/hw/efinix_fpga/ip/uart/uart.v index f80fc6d..3814be2 100644 --- a/hw/efinix_fpga/ip/uart/uart.v +++ b/hw/efinix_fpga/ip/uart/uart.v @@ -43,7 +43,7 @@ // //////////////////////////////////////////////////////////////////////////////// -`define IP_UUID _d1961caf8b8d4ca092806671a99095c2 +`define IP_UUID _8d7ceb45e0e64e208e634a02f6a59365 `define IP_NAME_CONCAT(a,b) a``b `define IP_MODULE_NAME(name) `IP_NAME_CONCAT(name,`IP_UUID) module uart ( @@ -69,7 +69,7 @@ input [7:0] tx_data .ENABLE_PARITY (1'b0), .FIX_BAUDRATE (1'b1), .PARITY_MODE (1'b0), -.BOOTUP_CHECK (1'b1) +.BOOTUP_CHECK (1'b0) ) u_top_uart( .tx_o ( tx_o ), .rx_i ( rx_i ), diff --git a/hw/efinix_fpga/ip/uart/uart_define.vh b/hw/efinix_fpga/ip/uart/uart_define.vh index 40752e0..a1de19d 100644 --- a/hw/efinix_fpga/ip/uart/uart_define.vh +++ b/hw/efinix_fpga/ip/uart/uart_define.vh @@ -49,4 +49,4 @@ localparam BAUD = 115200; localparam ENABLE_PARITY = 1'b0; localparam FIX_BAUDRATE = 1'b1; localparam PARITY_MODE = 1'b0; -localparam BOOTUP_CHECK = 1'b1; +localparam BOOTUP_CHECK = 1'b0; diff --git a/hw/efinix_fpga/simulation/spi_controller b/hw/efinix_fpga/simulation/spi_controller deleted file mode 100755 index c2ed4e5..0000000 --- a/hw/efinix_fpga/simulation/spi_controller +++ /dev/null @@ -1,448 +0,0 @@ -#! /usr/bin/vvp -:ivl_version "12.0 (stable)"; -:ivl_delay_selection "TYPICAL"; -:vpi_time_precision - 9; -:vpi_module "/usr/lib64/ivl/system.vpi"; -:vpi_module "/usr/lib64/ivl/vhdl_sys.vpi"; -:vpi_module "/usr/lib64/ivl/vhdl_textio.vpi"; -:vpi_module "/usr/lib64/ivl/v2005_math.vpi"; -:vpi_module "/usr/lib64/ivl/va_math.vpi"; -:vpi_module "/usr/lib64/ivl/v2009.vpi"; -S_0x55defa4f97e0 .scope package, "$unit" "$unit" 2 1; - .timescale 0 0; -S_0x55defa4f9970 .scope module, "sim" "sim" 3 1; - .timescale -8 -9; -v0x55defa5217a0_0 .var "_spi_device_data", 7 0; -v0x55defa5218a0_0 .var "clk_50", 0 0; -v0x55defa521960_0 .var "data", 7 0; -v0x55defa521a20_0 .var "i_addr", 1 0; -v0x55defa521ae0_0 .var "i_clk", 0 0; -v0x55defa521bd0_0 .var "i_cs", 0 0; -v0x55defa521c70_0 .var "i_data", 7 0; -v0x55defa521d10_0 .var "i_rst", 0 0; -v0x55defa521db0_0 .var "i_rwb", 0 0; -v0x55defa521e50_0 .var "i_spi_miso", 0 0; -v0x55defa521f20_0 .net "o_data", 7 0, v0x55defa520590_0; 1 drivers -v0x55defa521ff0_0 .net "o_spi_clk", 0 0, L_0x55defa4e9b80; 1 drivers -v0x55defa5220c0_0 .net "o_spi_cs", 0 0, L_0x55defa4e84f0; 1 drivers -v0x55defa522190_0 .net "o_spi_mosi", 0 0, L_0x55defa4e09c0; 1 drivers -E_0x55defa4f0300 .event edge, v0x55defa520670_0; -S_0x55defa4b6270 .scope module, "dut" "spi_controller" 3 22, 4 1 0, S_0x55defa4f9970; - .timescale 0 0; - .port_info 0 /INPUT 1 "i_clk"; - .port_info 1 /INPUT 1 "i_rst"; - .port_info 2 /INPUT 1 "i_cs"; - .port_info 3 /INPUT 1 "i_rwb"; - .port_info 4 /INPUT 2 "i_addr"; - .port_info 5 /INPUT 8 "i_data"; - .port_info 6 /OUTPUT 8 "o_data"; - .port_info 7 /OUTPUT 1 "o_spi_cs"; - .port_info 8 /OUTPUT 1 "o_spi_clk"; - .port_info 9 /OUTPUT 1 "o_spi_mosi"; - .port_info 10 /INPUT 1 "i_spi_miso"; -L_0x55defa4e84f0 .functor NOT 1, L_0x55defa522260, C4<0>, C4<0>, C4<0>; -L_0x55defa4e9b80 .functor BUFZ 1, v0x55defa520dd0_0, C4<0>, C4<0>, C4<0>; -L_0x55defa4e09c0 .functor BUFZ 1, v0x55defa520d10_0, C4<0>, C4<0>, C4<0>; -v0x55defa4e8690_0 .net *"_ivl_1", 0 0, L_0x55defa522260; 1 drivers -v0x55defa4e9d20_0 .var "active", 0 0; -v0x55defa4e0b20_0 .var "count", 2 0; -v0x55defa4e11c0_0 .net "i_addr", 1 0, v0x55defa521a20_0; 1 drivers -v0x55defa4e14a0_0 .net "i_clk", 0 0, v0x55defa521ae0_0; 1 drivers -v0x55defa4dfca0_0 .net "i_cs", 0 0, v0x55defa521bd0_0; 1 drivers -v0x55defa4e0660_0 .net "i_data", 7 0, v0x55defa521c70_0; 1 drivers -v0x55defa520350_0 .net "i_rst", 0 0, v0x55defa521d10_0; 1 drivers -v0x55defa520410_0 .net "i_rwb", 0 0, v0x55defa521db0_0; 1 drivers -v0x55defa5204d0_0 .net "i_spi_miso", 0 0, v0x55defa521e50_0; 1 drivers -v0x55defa520590_0 .var "o_data", 7 0; -v0x55defa520670_0 .net "o_spi_clk", 0 0, L_0x55defa4e9b80; alias, 1 drivers -v0x55defa520730_0 .net "o_spi_cs", 0 0, L_0x55defa4e84f0; alias, 1 drivers -v0x55defa5207f0_0 .net "o_spi_mosi", 0 0, L_0x55defa4e09c0; alias, 1 drivers -v0x55defa5208b0_0 .var "r_baud_rate", 7 0; -v0x55defa520990_0 .var "r_clock_counter", 8 0; -v0x55defa520a70_0 .var "r_control", 7 0; -v0x55defa520b50_0 .var "r_input_data", 7 0; -v0x55defa520c30_0 .var "r_output_data", 7 0; -v0x55defa520d10_0 .var "r_spi_mosi", 0 0; -v0x55defa520dd0_0 .var "spi_clk", 0 0; -E_0x55defa4f2fe0/0 .event anyedge, v0x55defa4e11c0_0, v0x55defa5208b0_0, v0x55defa520b50_0, v0x55defa4e9d20_0; -E_0x55defa4f2fe0/1 .event anyedge, v0x55defa520a70_0; -E_0x55defa4f2fe0 .event/or E_0x55defa4f2fe0/0, E_0x55defa4f2fe0/1; -E_0x55defa4f1160 .event negedge, v0x55defa4e14a0_0; -L_0x55defa522260 .part v0x55defa520a70_0, 0, 1; -S_0x55defa521050 .scope task, "read_reg" "read_reg" 3 40, 3 40 0, S_0x55defa4f9970; - .timescale -8 -9; -v0x55defa521220_0 .var "_addr", 2 0; -v0x55defa521320_0 .var "_data", 7 0; -E_0x55defa4da3a0 .event posedge, v0x55defa4e14a0_0; -TD_sim.read_reg ; - %wait E_0x55defa4f1160; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %load/vec4 v0x55defa521220_0; - %pad/u 2; - %assign/vec4 v0x55defa521a20_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %pushi/vec4 255, 0, 8; - %assign/vec4 v0x55defa521c70_0, 0; - %wait E_0x55defa4da3a0; - %load/vec4 v0x55defa521f20_0; - %assign/vec4 v0x55defa521320_0, 0; - %wait E_0x55defa4f1160; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %end; -S_0x55defa521400 .scope task, "write_reg" "write_reg" 3 27, 3 27 0, S_0x55defa4f9970; - .timescale -8 -9; -v0x55defa5215e0_0 .var "_addr", 2 0; -v0x55defa5216c0_0 .var "_data", 7 0; -TD_sim.write_reg ; - %wait E_0x55defa4f1160; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %load/vec4 v0x55defa5215e0_0; - %pad/u 2; - %assign/vec4 v0x55defa521a20_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %pushi/vec4 255, 0, 8; - %assign/vec4 v0x55defa521c70_0, 0; - %wait E_0x55defa4da3a0; - %load/vec4 v0x55defa5216c0_0; - %assign/vec4 v0x55defa521c70_0, 0; - %wait E_0x55defa4f1160; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %end; - .scope S_0x55defa4b6270; -T_2 ; - %wait E_0x55defa4f1160; - %load/vec4 v0x55defa520350_0; - %flag_set/vec4 8; - %jmp/0xz T_2.0, 8; - %pushi/vec4 1, 0, 8; - %assign/vec4 v0x55defa5208b0_0, 0; - %pushi/vec4 0, 0, 8; - %assign/vec4 v0x55defa520b50_0, 0; - %pushi/vec4 0, 0, 8; - %assign/vec4 v0x55defa520c30_0, 0; - %pushi/vec4 0, 0, 8; - %assign/vec4 v0x55defa520a70_0, 0; - %pushi/vec4 0, 0, 9; - %assign/vec4 v0x55defa520990_0, 0; - %pushi/vec4 0, 0, 3; - %assign/vec4 v0x55defa4e0b20_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa520dd0_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa4e9d20_0, 0; - %jmp T_2.1; -T_2.0 ; - %load/vec4 v0x55defa520410_0; - %inv; - %load/vec4 v0x55defa4dfca0_0; - %and; - %flag_set/vec4 8; - %jmp/0xz T_2.2, 8; - %load/vec4 v0x55defa4e11c0_0; - %dup/vec4; - %pushi/vec4 0, 0, 2; - %cmp/u; - %jmp/1 T_2.4, 6; - %dup/vec4; - %pushi/vec4 1, 0, 2; - %cmp/u; - %jmp/1 T_2.5, 6; - %dup/vec4; - %pushi/vec4 2, 0, 2; - %cmp/u; - %jmp/1 T_2.6, 6; - %dup/vec4; - %pushi/vec4 3, 0, 2; - %cmp/u; - %jmp/1 T_2.7, 6; - %vpi_call/w 4 52 "$warning", "value is unhandled for priority or unique case statement" {0 0 0}; - %jmp T_2.8; -T_2.4 ; - %load/vec4 v0x55defa4e0660_0; - %assign/vec4 v0x55defa5208b0_0, 0; - %jmp T_2.8; -T_2.5 ; - %jmp T_2.8; -T_2.6 ; - %load/vec4 v0x55defa4e0660_0; - %assign/vec4 v0x55defa520c30_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa4e9d20_0, 0; - %jmp T_2.8; -T_2.7 ; - %load/vec4 v0x55defa4e0660_0; - %assign/vec4 v0x55defa520a70_0, 0; - %jmp T_2.8; -T_2.8 ; - %pop/vec4 1; -T_2.2 ; - %load/vec4 v0x55defa4e9d20_0; - %flag_set/vec4 8; - %jmp/0xz T_2.9, 8; - %load/vec4 v0x55defa520c30_0; - %parti/s 1, 7, 4; - %assign/vec4 v0x55defa520d10_0, 0; - %load/vec4 v0x55defa520990_0; - %addi 1, 0, 9; - %assign/vec4 v0x55defa520990_0, 0; - %load/vec4 v0x55defa5208b0_0; - %pad/u 9; - %load/vec4 v0x55defa520990_0; - %cmp/u; - %flag_or 5, 4; - %jmp/0xz T_2.11, 5; - %pushi/vec4 0, 0, 9; - %assign/vec4 v0x55defa520990_0, 0; - %load/vec4 v0x55defa520dd0_0; - %inv; - %assign/vec4 v0x55defa520dd0_0, 0; - %load/vec4 v0x55defa520dd0_0; - %cmpi/e 0, 0, 1; - %jmp/0xz T_2.13, 4; - %load/vec4 v0x55defa520c30_0; - %ix/load 4, 1, 0; - %flag_set/imm 4, 0; - %shiftl 4; - %assign/vec4 v0x55defa520c30_0, 0; - %load/vec4 v0x55defa4e0b20_0; - %addi 1, 0, 3; - %assign/vec4 v0x55defa4e0b20_0, 0; -T_2.13 ; - %load/vec4 v0x55defa520dd0_0; - %cmpi/e 1, 0, 1; - %jmp/0xz T_2.15, 4; - %load/vec4 v0x55defa520b50_0; - %parti/s 7, 0, 2; - %load/vec4 v0x55defa5204d0_0; - %concat/vec4; draw_concat_vec4 - %assign/vec4 v0x55defa520b50_0, 0; - %load/vec4 v0x55defa4e0b20_0; - %cmpi/e 0, 0, 3; - %jmp/0xz T_2.17, 4; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa4e9d20_0, 0; -T_2.17 ; -T_2.15 ; -T_2.11 ; -T_2.9 ; -T_2.1 ; - %jmp T_2; - .thread T_2; - .scope S_0x55defa4b6270; -T_3 ; -Ewait_0 .event/or E_0x55defa4f2fe0, E_0x0; - %wait Ewait_0; - %load/vec4 v0x55defa4e11c0_0; - %dup/vec4; - %pushi/vec4 0, 0, 2; - %cmp/u; - %jmp/1 T_3.0, 6; - %dup/vec4; - %pushi/vec4 1, 0, 2; - %cmp/u; - %jmp/1 T_3.1, 6; - %dup/vec4; - %pushi/vec4 2, 0, 2; - %cmp/u; - %jmp/1 T_3.2, 6; - %dup/vec4; - %pushi/vec4 3, 0, 2; - %cmp/u; - %jmp/1 T_3.3, 6; - %vpi_call/w 4 88 "$warning", "value is unhandled for priority or unique case statement" {0 0 0}; - %jmp T_3.4; -T_3.0 ; - %load/vec4 v0x55defa5208b0_0; - %store/vec4 v0x55defa520590_0, 0, 8; - %jmp T_3.4; -T_3.1 ; - %load/vec4 v0x55defa520b50_0; - %store/vec4 v0x55defa520590_0, 0, 8; - %jmp T_3.4; -T_3.2 ; - %jmp T_3.4; -T_3.3 ; - %load/vec4 v0x55defa4e9d20_0; - %load/vec4 v0x55defa520a70_0; - %parti/s 7, 0, 2; - %concat/vec4; draw_concat_vec4 - %store/vec4 v0x55defa520590_0, 0, 8; - %jmp T_3.4; -T_3.4 ; - %pop/vec4 1; - %jmp T_3; - .thread T_3, $push; - .scope S_0x55defa4f9970; -T_4 ; - %delay 10, 0; - %load/vec4 v0x55defa5218a0_0; - %pushi/vec4 0, 0, 1; - %cmp/e; - %flag_get/vec4 6; - %store/vec4 v0x55defa5218a0_0, 0, 1; - %jmp T_4; - .thread T_4; - .scope S_0x55defa4f9970; -T_5 ; - %delay 1000, 0; - %load/vec4 v0x55defa521ae0_0; - %pushi/vec4 0, 0, 1; - %cmp/e; - %flag_get/vec4 6; - %store/vec4 v0x55defa521ae0_0, 0, 1; - %jmp T_5; - .thread T_5; - .scope S_0x55defa4f9970; -T_6 ; - %vpi_call/w 3 55 "$dumpfile", "spi_controller.vcd" {0 0 0}; - %vpi_call/w 3 56 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x55defa4f9970 {0 0 0}; - %end; - .thread T_6; - .scope S_0x55defa4f9970; -T_7 ; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521d10_0, 0; - %pushi/vec4 5, 0, 32; -T_7.0 %dup/vec4; - %pushi/vec4 0, 0, 32; - %cmp/s; - %jmp/1xz T_7.1, 5; - %jmp/1 T_7.1, 4; - %pushi/vec4 1, 0, 32; - %sub; - %wait E_0x55defa4da3a0; - %jmp T_7.0; -T_7.1 ; - %pop/vec4 1; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %pushi/vec4 0, 0, 2; - %assign/vec4 v0x55defa521a20_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521d10_0, 0; - %pushi/vec4 5, 0, 32; -T_7.2 %dup/vec4; - %pushi/vec4 0, 0, 32; - %cmp/s; - %jmp/1xz T_7.3, 5; - %jmp/1 T_7.3, 4; - %pushi/vec4 1, 0, 32; - %sub; - %wait E_0x55defa4da3a0; - %jmp T_7.2; -T_7.3 ; - %pop/vec4 1; - %pushi/vec4 3, 0, 3; - %store/vec4 v0x55defa5215e0_0, 0, 3; - %pushi/vec4 1, 0, 8; - %store/vec4 v0x55defa5216c0_0, 0, 8; - %fork TD_sim.write_reg, S_0x55defa521400; - %join; - %pushi/vec4 2, 0, 3; - %store/vec4 v0x55defa5215e0_0, 0, 3; - %pushi/vec4 170, 0, 8; - %store/vec4 v0x55defa5216c0_0, 0, 8; - %fork TD_sim.write_reg, S_0x55defa521400; - %join; - %pushi/vec4 128, 0, 8; - %store/vec4 v0x55defa521960_0, 0, 8; -T_7.4 ; - %load/vec4 v0x55defa521960_0; - %pad/u 32; - %pushi/vec4 128, 0, 32; - %and; - %or/r; - %flag_set/vec4 8; - %jmp/0xz T_7.5, 8; - %pushi/vec4 3, 0, 3; - %store/vec4 v0x55defa521220_0, 0, 3; - %fork TD_sim.read_reg, S_0x55defa521050; - %join; - %load/vec4 v0x55defa521320_0; - %store/vec4 v0x55defa521960_0, 0, 8; - %jmp T_7.4; -T_7.5 ; - %pushi/vec4 3, 0, 3; - %store/vec4 v0x55defa5215e0_0, 0, 3; - %pushi/vec4 0, 0, 8; - %store/vec4 v0x55defa5216c0_0, 0, 8; - %fork TD_sim.write_reg, S_0x55defa521400; - %join; - %pushi/vec4 1, 0, 3; - %store/vec4 v0x55defa521220_0, 0, 3; - %fork TD_sim.read_reg, S_0x55defa521050; - %join; - %load/vec4 v0x55defa521320_0; - %store/vec4 v0x55defa521960_0, 0, 8; - %load/vec4 v0x55defa521960_0; - %cmpi/e 85, 0, 8; - %jmp/0xz T_7.6, 4; - %jmp T_7.7; -T_7.6 ; - %vpi_call/w 3 79 "$error" {0 0 0}; -T_7.7 ; - %pushi/vec4 50, 0, 32; -T_7.8 %dup/vec4; - %pushi/vec4 0, 0, 32; - %cmp/s; - %jmp/1xz T_7.9, 5; - %jmp/1 T_7.9, 4; - %pushi/vec4 1, 0, 32; - %sub; - %wait E_0x55defa4da3a0; - %jmp T_7.8; -T_7.9 ; - %pop/vec4 1; - %vpi_call/w 3 83 "$finish" {0 0 0}; - %end; - .thread T_7; - .scope S_0x55defa4f9970; -T_8 ; - %pushi/vec4 85, 0, 8; - %assign/vec4 v0x55defa5217a0_0, 0; - %end; - .thread T_8; - .scope S_0x55defa4f9970; -T_9 ; - %wait E_0x55defa4f0300; - %load/vec4 v0x55defa5220c0_0; - %cmpi/e 0, 0, 1; - %jmp/0xz T_9.0, 4; - %load/vec4 v0x55defa521ff0_0; - %cmpi/e 1, 0, 1; - %jmp/0xz T_9.2, 4; - %load/vec4 v0x55defa5217a0_0; - %parti/s 1, 7, 4; - %assign/vec4 v0x55defa521e50_0, 0; -T_9.2 ; - %load/vec4 v0x55defa521ff0_0; - %cmpi/e 0, 0, 1; - %jmp/0xz T_9.4, 4; - %load/vec4 v0x55defa5217a0_0; - %ix/load 4, 1, 0; - %flag_set/imm 4, 0; - %shiftl 4; - %assign/vec4 v0x55defa5217a0_0, 0; -T_9.4 ; -T_9.0 ; - %jmp T_9; - .thread T_9; -# The file index is used to find the file name in the following table. -:file_names 5; - "N/A"; - ""; - "-"; - "spi_controller_tb.sv"; - "../spi_controller.sv"; diff --git a/hw/efinix_fpga/simulation/spi_controller_tb.sv b/hw/efinix_fpga/simulation/spi_controller_tb.sv index daeddd3..ad20da4 100644 --- a/hw/efinix_fpga/simulation/spi_controller_tb.sv +++ b/hw/efinix_fpga/simulation/spi_controller_tb.sv @@ -69,7 +69,7 @@ initial begin repeat(5) @(posedge i_clk); write_reg(3, 1); - write_reg(2, 8'hAA); + write_reg(2, 8'hFF); data = (1 << 7); while(data & (1 << 7)) begin read_reg(3, data); @@ -99,4 +99,4 @@ always @(edge o_spi_clk) begin end end -endmodule \ No newline at end of file +endmodule diff --git a/hw/efinix_fpga/super6502.peri.xml b/hw/efinix_fpga/super6502.peri.xml index c44660e..d32a564 100644 --- a/hw/efinix_fpga/super6502.peri.xml +++ b/hw/efinix_fpga/super6502.peri.xml @@ -1,5 +1,5 @@ - + @@ -306,21 +306,17 @@ - - - - - - - - - - - - + + + + + + + + diff --git a/hw/efinix_fpga/super6502.sv b/hw/efinix_fpga/super6502.sv index c0d8457..abe90d8 100644 --- a/hw/efinix_fpga/super6502.sv +++ b/hw/efinix_fpga/super6502.sv @@ -41,30 +41,12 @@ module super6502 output uart_tx, output sd_cs, - output sd_clk, - - input sd_cmd_IN, - output sd_cmd_OUT, - output sd_cmd_OE, - - input sd_data_IN, - output sd_data_OUT, - output sd_data_OE + output spi_clk, + output spi_mosi, + + input spi_miso ); -assign sd_cs = '1; - -logic o_sd_cmd, i_sd_cmd; -logic o_sd_data, i_sd_data; - -assign i_sd_cmd = sd_cmd_IN; -assign sd_cmd_OUT = '0; -assign sd_cmd_OE = ~o_sd_cmd; - -assign i_sd_data = sd_data_IN; -assign sd_data_OUT = '0; -assign sd_data_OE = ~o_sd_data; - assign pll_cpu_reset = '1; assign o_pll_reset = '1; @@ -97,7 +79,7 @@ logic w_timer_cs; logic w_multiplier_cs; logic w_divider_cs; logic w_uart_cs; -logic w_sdcard_cs; +logic w_spi_cs; addr_decode u_addr_decode( .i_addr(cpu_addr), @@ -107,7 +89,7 @@ addr_decode u_addr_decode( .o_multiplier_cs(w_multiplier_cs), .o_divider_cs(w_divider_cs), .o_uart_cs(w_uart_cs), - .o_sdcard_cs(w_sdcard_cs), + .o_spi_cs(w_spi_cs), .o_sdram_cs(w_sdram_cs) ); @@ -117,7 +99,7 @@ logic [7:0] w_timer_data_out; logic [7:0] w_multiplier_data_out; logic [7:0] w_divider_data_out; logic [7:0] w_uart_data_out; -logic [7:0] w_sdcard_data_out; +logic [7:0] w_spi_data_out; logic [7:0] w_sdram_data_out; always_comb begin @@ -133,8 +115,8 @@ always_comb begin cpu_data_out = w_divider_data_out; else if (w_uart_cs) cpu_data_out = w_uart_data_out; - else if (w_sdcard_cs) - cpu_data_out = w_sdcard_data_out; + else if (w_spi_cs) + cpu_data_out = w_spi_data_out; else if (w_sdram_cs) cpu_data_out = w_sdram_data_out; else @@ -206,28 +188,19 @@ uart_wrapper u_uart( .irqb(w_uart_irqb) ); -logic sd_clk; -always @(posedge clk_2) begin - sd_clk <= ~sd_clk; -end +spi_controller spi_controller( + .i_clk(clk_2), + .i_rst(~cpu_resb), + .i_cs(w_spi_cs), + .i_rwb(cpu_rwb), + .i_addr(cpu_addr[1:0]), + .i_data(cpu_data_in), + .o_data(w_spi_data_out), - -sd_controller sd_controller( - .clk(clk_2), - .sd_clk(sd_clk), - .rst(rst), - .addr(cpu_addr[2:0]), - .data(cpu_data_in), - .cs(w_sdcard_cs), - .rw(cpu_rwb), - - .i_sd_cmd(i_sd_cmd), - .o_sd_cmd(o_sd_cmd), - - .i_sd_data(i_sd_data), - .o_sd_data(o_sd_data), - - .data_out(w_sdcard_data_out) + .o_spi_cs(sd_cs), + .o_spi_clk(spi_clk), + .o_spi_mosi(spi_mosi), + .i_spi_miso(spi_miso) ); diff --git a/hw/efinix_fpga/super6502.xml b/hw/efinix_fpga/super6502.xml index 3843189..91bbcc4 100644 --- a/hw/efinix_fpga/super6502.xml +++ b/hw/efinix_fpga/super6502.xml @@ -1,5 +1,5 @@ - + @@ -19,6 +19,7 @@ + @@ -62,11 +63,11 @@ + + - - diff --git a/sw/bootloader/Makefile b/sw/bootloader/Makefile index ac2d520..7a23090 100644 --- a/sw/bootloader/Makefile +++ b/sw/bootloader/Makefile @@ -15,7 +15,7 @@ LISTS=lists TESTS=tests SRCS=$(wildcard *.s) $(wildcard *.c) -SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*) $(wildcard filesystem/*), $(wildcard **/*.c)) +SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*) $(wildcard filesystem/*) devices/sd_print.c, $(wildcard **/*.c)) OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) diff --git a/sw/bootloader/devices/io.inc65 b/sw/bootloader/devices/io.inc65 index 9e797f5..42b0910 100644 --- a/sw/bootloader/devices/io.inc65 +++ b/sw/bootloader/devices/io.inc65 @@ -6,7 +6,8 @@ UART_STATUS = UART + 1 LED = $efff SW = LED -SD_ARG = $efd8 -SD_CMD = $efdc -SD_DATA = $efdd - +SPI_BAUD = $efd8 +SPI_INPUT = $efd9 +SPI_OUTPUT = $efda +SPI_CTRL = $efdb +SPI_STATUS = SPI_CTRL \ No newline at end of file diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 4e548ba..7193233 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -1,89 +1,455 @@ -#include #include -#include "devices/sd_card.h" +#include "sd_card.h" +#include "sd_print.h" +#include "spi.h" -void sd_init() { - uint32_t resp; - uint8_t attempts, i; +/******************************************************************************* + Initialize SD card +*******************************************************************************/ +uint8_t SD_init() +{ + uint16_t i; - cputs("In sd_init\n"); + uint8_t res[5], cmdAttempts = 0; - sd_card_command(0, 0); + SD_powerUpSeq(); - cprintf("Sent Reset\n"); + while((res[0] = SD_goIdleState()) != SD_IN_IDLE_STATE) + { + cmdAttempts++; + if(cmdAttempts == CMD0_MAX_ATTEMPTS) + { + cputs("Go IDLE\r\n"); + return SD_ERROR; + } + } - sd_card_command(0x000001aa, 8); - sd_card_resp(&resp); - cprintf("CMD8: %lx\n", resp); + for (i = 0; i < 1000; i++); - attempts = 0; - do { - if (attempts > 100) { - cprintf("SD Timed out"); - return; - } - sd_card_command(0, 55); - sd_card_resp(&resp); - sd_card_command(0x40180000, 41); - sd_card_resp(&resp); - cprintf("CMD41: %lx\n", resp); + SD_sendIfCond(res); + if(res[0] != SD_IN_IDLE_STATE) + { + cputs("IF Cond\r\n"); + return SD_ERROR; + } - //10ms loop? - for (i = 0; i < 255; i++); + if(res[4] != 0xAA) + { + return SD_ERROR; + } - attempts++; - } while (resp != 0); + cmdAttempts = 0; + do + { + if(cmdAttempts == CMD55_MAX_ATTEMPTS) + { + cputs("op_cond error\r\n"); + return SD_ERROR; + } - sd_card_command(0, 2); - sd_card_resp(&resp); - cprintf("CMD2: %lx\n", resp); + res[0] = SD_sendApp(); + if(SD_R1_NO_ERROR(res[0])) + { + res[0] = SD_sendOpCond(); + } + + for (i = 0; i < 1000; i++); + + cmdAttempts++; + } + while(res[0] != SD_READY); + + for (i = 0; i < 1000; i++); + + SD_readOCR(res); + + return SD_SUCCESS; } -uint16_t sd_get_rca() { - uint32_t resp; +/******************************************************************************* + Run power up sequence +*******************************************************************************/ +void SD_powerUpSeq() +{ + uint16_t i; + uint8_t j; - sd_card_command(0, 3); - resp = 0; - sd_card_resp(&resp); + // make sure card is deselected + spi_deselect(0); - //cprintf("CMD3: %lx\n", resp); + // give SD card time to power up + for (i = 0; i < 1000; i++); - return resp >> 16; + + // select SD card + spi_exchange(0xFF); + spi_deselect(0); + + // send 80 clock cycles to synchronize + for(j = 0; j < SD_INIT_CYCLES; j++) + spi_exchange(0xFF); } -uint16_t sd_select_card(uint16_t rca) { - uint32_t resp; +/******************************************************************************* + Send command to SD card +*******************************************************************************/ +void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) +{ + // transmit command to sd card + spi_exchange(cmd|0x40); - sd_card_command((uint32_t)rca << 16, 7); - sd_card_resp(&resp); + // transmit argument + spi_exchange((uint8_t)(arg >> 24)); + spi_exchange((uint8_t)(arg >> 16)); + spi_exchange((uint8_t)(arg >> 8)); + spi_exchange((uint8_t)(arg)); - return (uint16_t) resp; + // transmit crc + spi_exchange(crc|0x01); } -uint16_t sd_get_status(uint16_t rca) { - uint32_t resp; +/******************************************************************************* + Read R1 from SD card +*******************************************************************************/ +uint8_t SD_readRes1() +{ + uint8_t i = 0, res1; - sd_card_command((uint32_t)rca << 16, 13); - sd_card_resp(&resp); + // keep polling until actual data received + while((res1 = spi_exchange(0xFF)) == 0xFF) + { + i++; - return (uint16_t) resp; + // if no data received for 8 bytes, break + if(i > 8) break; + } + + return res1; } -void sd_readblock(uint32_t addr, void* buf) { - uint32_t resp; - int i; +/******************************************************************************* + Read R2 from SD card +*******************************************************************************/ +void SD_readRes2(uint8_t *res) +{ + // read response 1 in R2 + res[0] = SD_readRes1(); - sd_card_command(addr, 17); - sd_card_resp(&resp); - //cprintf("CMD17: %lx\n", resp); - - sd_card_wait_for_data(); - - //cprintf("Read data: \n"); - for (i = 0; i < 512; i++){ - ((uint8_t*)buf)[i] = sd_card_read_byte(); - } - - //cprintf("\n"); + // read final byte of response + res[1] = spi_exchange(0xFF); +} + +/******************************************************************************* + Read R3 from SD card +*******************************************************************************/ +void SD_readRes3(uint8_t *res) +{ + // read response 1 in R3 + res[0] = SD_readRes1(); + + // if error reading R1, return + if(res[0] > 1) return; + + // read remaining bytes + SD_readBytes(res + 1, R3_BYTES); +} + +/******************************************************************************* + Read R7 from SD card +*******************************************************************************/ +void SD_readRes7(uint8_t *res) +{ + // read response 1 in R7 + res[0] = SD_readRes1(); + + // if error reading R1, return + if(res[0] > 1) return; + + // read remaining bytes + SD_readBytes(res + 1, R7_BYTES); +} + +/******************************************************************************* + Read specified number of bytes from SD card +*******************************************************************************/ +void SD_readBytes(uint8_t *res, uint8_t n) +{ + while(n--) *res++ = spi_exchange(0xFF); +} + +/******************************************************************************* + Command Idle State (CMD0) +*******************************************************************************/ +uint8_t SD_goIdleState() +{ + uint8_t res1; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(CMD0, CMD0_ARG, CMD0_CRC); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; +} + +/******************************************************************************* + Send Interface Conditions (CMD8) +*******************************************************************************/ +void SD_sendIfCond(uint8_t *res) +{ + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD8 + SD_command(CMD8, CMD8_ARG, CMD8_CRC); + + // read response + SD_readRes7(res); + //SD_readBytes(res + 1, R7_BYTES); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); +} + +/******************************************************************************* + Read Status +*******************************************************************************/ +void SD_sendStatus(uint8_t *res) +{ + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD13 + SD_command(CMD13, CMD13_ARG, CMD13_CRC); + + // read response + SD_readRes2(res); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); +} + +/******************************************************************************* + Read single 512 byte block + token = 0xFE - Successful read + token = 0x0X - Data error + token = 0xFF - timeout +*******************************************************************************/ +uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) +{ + uint8_t res1, read; + uint16_t readAttempts; + uint16_t i; + + /* + + // set token to none + *token = 0xFF; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD17 + SD_command(CMD17, addr, CMD17_CRC); + + // read R1 + res1 = SD_readRes1(); + + // if response received from card + if(res1 != 0xFF) + { + // wait for a response token (timeout = 100ms) + readAttempts = 0; + while(++readAttempts != SD_MAX_READ_ATTEMPTS) + if((read = spi_exchange(0xFF)) != 0xFF) break; + + // if response token is 0xFE + if(read == SD_START_TOKEN) + { + // read 512 byte block + for(i = 0; i < SD_BLOCK_LEN; i++) *buf++ = spi_exchange(0xFF); + + // read 16-bit CRC + spi_exchange(0xFF); + spi_exchange(0xFF); + } + + // set token to card response + *token = read; + } + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + */ + + return res1; +} + +#define SD_MAX_WRITE_ATTEMPTS 3907 + +/******************************************************************************* +Write single 512 byte block +token = 0x00 - busy timeout +token = 0x05 - data accepted +token = 0xFF - response timeout +*******************************************************************************/ +uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) +{ + uint16_t readAttempts; + uint8_t res1, read; + uint16_t i; + + /* + + // set token to none + *token = 0xFF; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD24 + SD_command(CMD24, addr, CMD24_CRC); + + // read response + res1 = SD_readRes1(); + + // if no error + if(res1 == SD_READY) + { + // send start token + spi_exchange(SD_START_TOKEN); + + // write buffer to card + for(i = 0; i < SD_BLOCK_LEN; i++) spi_exchange(buf[i]); + + // wait for a response (timeout = 250ms) + readAttempts = 0; + while(++readAttempts != SD_MAX_WRITE_ATTEMPTS) + if((read = spi_exchange(0xFF)) != 0xFF) { *token = 0xFF; break; } + + // if data accepted + if((read & 0x1F) == 0x05) + { + // set token to data accepted + *token = 0x05; + + // wait for write to finish (timeout = 250ms) + readAttempts = 0; + while(spi_exchange(0xFF) == 0x00) + if(++readAttempts == SD_MAX_WRITE_ATTEMPTS) { *token = 0x00; break; } + } + } + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + */ + + return res1; +} + +/******************************************************************************* + Reads OCR from SD Card +*******************************************************************************/ +void SD_readOCR(uint8_t *res) +{ + uint8_t tmp; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + tmp = spi_exchange(0xFF); + + if(tmp != 0xFF) while(spi_exchange(0xFF) != 0xFF) ; + + // send CMD58 + SD_command(CMD58, CMD58_ARG, CMD58_CRC); + + // read response + SD_readRes3(res); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); +} + +/******************************************************************************* + Send application command (CMD55) +*******************************************************************************/ +uint8_t SD_sendApp() +{ + uint8_t res1; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(CMD55, CMD55_ARG, CMD55_CRC); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; +} + +/******************************************************************************* + Send operating condition (ACMD41) +*******************************************************************************/ +uint8_t SD_sendOpCond() +{ + uint8_t res1; + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(ACMD41, ACMD41_ARG, ACMD41_CRC); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; } diff --git a/sw/bootloader/devices/sd_card.h b/sw/bootloader/devices/sd_card.h index 7e3cb00..6488e8b 100644 --- a/sw/bootloader/devices/sd_card.h +++ b/sw/bootloader/devices/sd_card.h @@ -3,16 +3,76 @@ #include -void sd_init(); -uint16_t sd_get_rca(); -uint16_t sd_select_card(uint16_t rca); -uint16_t sd_get_status(uint16_t rca); -void sd_readblock(uint32_t addr, void* buf); +// command definitions +#define CMD0 0 +#define CMD0_ARG 0x00000000 +#define CMD0_CRC 0x94 +#define CMD8 8 +#define CMD8_ARG 0x0000001AA +#define CMD8_CRC 0x86 +#define CMD9 9 +#define CMD9_ARG 0x00000000 +#define CMD9_CRC 0x00 +#define CMD10 9 +#define CMD10_ARG 0x00000000 +#define CMD10_CRC 0x00 +#define CMD13 13 +#define CMD13_ARG 0x00000000 +#define CMD13_CRC 0x00 +#define CMD17 17 +#define CMD17_CRC 0x00 +#define CMD24 24 +#define CMD24_CRC 0x00 +#define CMD55 55 +#define CMD55_ARG 0x00000000 +#define CMD55_CRC 0x00 +#define CMD58 58 +#define CMD58_ARG 0x00000000 +#define CMD58_CRC 0x00 +#define ACMD41 41 +#define ACMD41_ARG 0x40000000 +#define ACMD41_CRC 0x00 -void sd_card_command(uint32_t arg, uint8_t cmd); +#define SD_IN_IDLE_STATE 0x01 +#define SD_READY 0x00 +#define SD_R1_NO_ERROR(X) X < 0x02 -void sd_card_resp(uint32_t* resp); -uint8_t sd_card_read_byte(); -void sd_card_wait_for_data(); +#define R3_BYTES 4 +#define R7_BYTES 4 -#endif +#define CMD0_MAX_ATTEMPTS 255 +#define CMD55_MAX_ATTEMPTS 255 +#define SD_ERROR 1 +#define SD_SUCCESS 0 +#define SD_MAX_READ_ATTEMPTS 1563 +#define SD_READ_START_TOKEN 0xFE +#define SD_INIT_CYCLES 80 + +#define SD_START_TOKEN 0xFE +#define SD_ERROR_TOKEN 0x00 + +#define SD_DATA_ACCEPTED 0x05 +#define SD_DATA_REJECTED_CRC 0x0B +#define SD_DATA_REJECTED_WRITE 0x0D + +#define SD_BLOCK_LEN 512 + +// SD functions +uint8_t SD_init(); +void SD_powerUpSeq(); +void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc); +uint8_t SD_readRes1(); +void SD_readRes2(uint8_t *res); +void SD_readRes3(uint8_t *res); +void SD_readRes7(uint8_t *res); +void SD_readBytes(uint8_t *res, uint8_t n); +uint8_t SD_goIdleState(); +void SD_sendIfCond(uint8_t *res); +void SD_sendStatus(uint8_t *res); +void SD_readOCR(uint8_t *res); +uint8_t SD_sendApp(); +uint8_t SD_sendOpCond(); +uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *error); +uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *res); + +#endif \ No newline at end of file diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s deleted file mode 100644 index fe4f4e2..0000000 --- a/sw/bootloader/devices/sd_card_asm.s +++ /dev/null @@ -1,66 +0,0 @@ -.include "io.inc65" - -.importzp sp, sreg, ptr1 - -.export _sd_card_command -.export _sd_card_resp -.export _sd_card_read_byte -.export _sd_card_wait_for_data - -.autoimport on - -.code - -; Send sd card command. -; command is in A register, the args are on the stack -; I think the order is high byte first? -_sd_card_command: - pha - - jsr popeax - sta SD_ARG - stx SD_ARG+1 - lda sreg - sta SD_ARG+2 - lda sreg+1 - sta SD_ARG+3 - - pla - sta SD_CMD - rts - -; void sd_card_resp(uint32_t* resp); -_sd_card_resp: - phy - sta ptr1 ; store pointer - stx ptr1+1 -@1: lda SD_CMD ; wait for status flag - and #$01 - beq @1 - lda SD_ARG - ldy #$0 - sta (ptr1),y - lda SD_ARG+1 - iny - sta (ptr1),y - lda SD_ARG+2 - iny - sta (ptr1),y - lda SD_ARG+3 - iny - sta (ptr1),y - ply - rts - -_sd_card_read_byte: - lda SD_DATA - ldx #$00 - rts - -_sd_card_wait_for_data: - pha -@1: lda SD_CMD ; wait for status flag - and #$02 - beq @1 - pla - rts \ No newline at end of file diff --git a/sw/bootloader/devices/sd_print.c b/sw/bootloader/devices/sd_print.c new file mode 100644 index 0000000..4e8ead5 --- /dev/null +++ b/sw/bootloader/devices/sd_print.c @@ -0,0 +1,176 @@ +#include + +#include "sd_print.h" +#include "sd_card.h" + +void SD_printR1(uint8_t res) +{ + if(res == 0xFF) + { cputs("\tNo response\r\n"); return; } + if(res & 0x80) + { cputs("\tError: MSB = 1\r\n"); return; } + if(res == 0) + { cputs("\tCard Ready\r\n"); return; } + if(PARAM_ERROR(res)) + cputs("\tParameter Error\r\n"); + if(ADDR_ERROR(res)) + cputs("\tAddress Error\r\n"); + if(ERASE_SEQ_ERROR(res)) + cputs("\tErase Sequence Error\r\n"); + if(CRC_ERROR(res)) + cputs("\tCRC Error\r\n"); + if(ILLEGAL_CMD(res)) + cputs("\tIllegal Command\r\n"); + if(ERASE_RESET(res)) + cputs("\tErase Reset Error\r\n"); + if(IN_IDLE(res)) + cputs("\tIn Idle State\r\n"); +} + +void SD_printR2(uint8_t *res) +{ + SD_printR1(res[0]); + + if(res[0] == 0xFF) return; + + if(res[1] == 0x00) + cputs("\tNo R2 Error\r\n"); + if(OUT_OF_RANGE(res[1])) + cputs("\tOut of Range\r\n"); + if(ERASE_PARAM(res[1])) + cputs("\tErase Parameter\r\n"); + if(WP_VIOLATION(res[1])) + cputs("\tWP Violation\r\n"); + if(CARD_ECC_FAILED(res[1])) + cputs("\tECC Failed\r\n"); + if(CC_ERROR(res[1])) + cputs("\tCC Error\r\n"); + if(ERROR(res[1])) + cputs("\tError\r\n"); + if(WP_ERASE_SKIP(res[1])) + cputs("\tWP Erase Skip\r\n"); + if(CARD_LOCKED(res[1])) + cputs("\tCard Locked\r\n"); +} + +void SD_printR3(uint8_t *res) +{ + SD_printR1(res[0]); + + if(res[0] > 1) return; + + cputs("\tCard Power Up Status: "); + if(POWER_UP_STATUS(res[1])) + { + cputs("READY\r\n"); + cputs("\tCCS Status: "); + if(CCS_VAL(res[1])){ cputs("1\r\n"); } + else cputs("0\r\n"); + } + else + { + cputs("BUSY\r\n"); + } + + cputs("\tVDD Window: "); + if(VDD_2728(res[3])) cputs("2.7-2.8, "); + if(VDD_2829(res[2])) cputs("2.8-2.9, "); + if(VDD_2930(res[2])) cputs("2.9-3.0, "); + if(VDD_3031(res[2])) cputs("3.0-3.1, "); + if(VDD_3132(res[2])) cputs("3.1-3.2, "); + if(VDD_3233(res[2])) cputs("3.2-3.3, "); + if(VDD_3334(res[2])) cputs("3.3-3.4, "); + if(VDD_3435(res[2])) cputs("3.4-3.5, "); + if(VDD_3536(res[2])) cputs("3.5-3.6"); + cputs("\r\n"); +} + +void SD_printR7(uint8_t *res) +{ + SD_printR1(res[0]); + + if(res[0] > 1) return; + + cputs("\tCommand Version: "); + cprintf("%x", CMD_VER(res[1])); + cputs("\r\n"); + + cputs("\tVoltage Accepted: "); + if(VOL_ACC(res[3]) == VOLTAGE_ACC_27_33) { + cputs("2.7-3.6V\r\n"); + } else if(VOL_ACC(res[3]) == VOLTAGE_ACC_LOW) { + cputs("LOW VOLTAGE\r\n"); + } else if(VOL_ACC(res[3]) == VOLTAGE_ACC_RES1) { + cputs("RESERVED\r\n"); + } else if(VOL_ACC(res[3]) == VOLTAGE_ACC_RES2) { + cputs("RESERVED\r\n"); + } else { + cputs("NOT DEFINED\r\n"); + } + + cputs("\tEcho: "); + cprintf("%x", res[4]); + cputs("\r\n"); +} + +void SD_printCSD(uint8_t *buf) +{ + cputs("CSD:\r\n"); + + cputs("\tCSD Structure: "); + cprintf("%x", (buf[0] & 0b11000000) >> 6); + cputs("\r\n"); + + cputs("\tTAAC: "); + cprintf("%x", buf[1]); + cputs("\r\n"); + + cputs("\tNSAC: "); + cprintf("%x", buf[2]); + cputs("\r\n"); + + cputs("\tTRAN_SPEED: "); + cprintf("%x", buf[3]); + cputs("\r\n"); + + cputs("\tDevice Size: "); + cprintf("%x", buf[7] & 0b00111111); + cprintf("%x", buf[8]); + cprintf("%x", buf[9]); + cputs("\r\n"); +} + +void SD_printBuf(uint8_t *buf) +{ + uint8_t colCount = 0; + uint16_t i; + for(i = 0; i < SD_BLOCK_LEN; i++) + { + cprintf("%x", *buf++); + if(colCount == 19) + { + cputs("\r\n"); + colCount = 0; + } + else + { + cputc(' '); + colCount++; + } + } + cputs("\r\n"); +} + +void SD_printDataErrToken(uint8_t token) +{ + if(token & 0xF0) + cputs("\tNot Error token\r\n"); + if(SD_TOKEN_OOR(token)) + cputs("\tData out of range\r\n"); + if(SD_TOKEN_CECC(token)) + cputs("\tCard ECC failed\r\n"); + if(SD_TOKEN_CC(token)) + cputs("\tCC Error\r\n"); + if(SD_TOKEN_ERROR(token)) + cputs("\tError\r\n"); +} diff --git a/sw/bootloader/devices/sd_print.h b/sw/bootloader/devices/sd_print.h new file mode 100644 index 0000000..fd42418 --- /dev/null +++ b/sw/bootloader/devices/sd_print.h @@ -0,0 +1,61 @@ +#ifndef SD_PRINT_H +#define SD_PRINT_H + + +#include + + +/* R1 MACROS */ +#define PARAM_ERROR(X) X & 0b01000000 +#define ADDR_ERROR(X) X & 0b00100000 +#define ERASE_SEQ_ERROR(X) X & 0b00010000 +#define CRC_ERROR(X) X & 0b00001000 +#define ILLEGAL_CMD(X) X & 0b00000100 +#define ERASE_RESET(X) X & 0b00000010 +#define IN_IDLE(X) X & 0b00000001 + +/* R2 MACROS */ +#define OUT_OF_RANGE(X) X & 0b10000000 +#define ERASE_PARAM(X) X & 0b01000000 +#define WP_VIOLATION(X) X & 0b00100000 +#define CARD_ECC_FAILED(X) X & 0b00010000 +#define CC_ERROR(X) X & 0b00001000 +#define ERROR(X) X & 0b00000100 +#define WP_ERASE_SKIP(X) X & 0b00000010 +#define CARD_LOCKED(X) X & 0b00000001 + +/* R3 MACROS */ +#define POWER_UP_STATUS(X) X & 0x40 +#define CCS_VAL(X) X & 0x40 +#define VDD_2728(X) X & 0b10000000 +#define VDD_2829(X) X & 0b00000001 +#define VDD_2930(X) X & 0b00000010 +#define VDD_3031(X) X & 0b00000100 +#define VDD_3132(X) X & 0b00001000 +#define VDD_3233(X) X & 0b00010000 +#define VDD_3334(X) X & 0b00100000 +#define VDD_3435(X) X & 0b01000000 +#define VDD_3536(X) X & 0b10000000 + +/* R7 MACROS */ +#define CMD_VER(X) ((X >> 4) & 0xF0) +#define VOL_ACC(X) (X & 0x1F) +#define VOLTAGE_ACC_27_33 0b00000001 +#define VOLTAGE_ACC_LOW 0b00000010 +#define VOLTAGE_ACC_RES1 0b00000100 +#define VOLTAGE_ACC_RES2 0b00001000 + +/* DATA ERROR TOKEN */ +#define SD_TOKEN_OOR(X) X & 0b00001000 +#define SD_TOKEN_CECC(X) X & 0b00000100 +#define SD_TOKEN_CC(X) X & 0b00000010 +#define SD_TOKEN_ERROR(X) X & 0b00000001 + +void SD_printR1(uint8_t res); +void SD_printR2(uint8_t *res); +void SD_printR3(uint8_t *res); +void SD_printR7(uint8_t *res); +void SD_printBuf(uint8_t *buf); +void SD_printDataErrToken(uint8_t token); + +#endif \ No newline at end of file diff --git a/sw/bootloader/devices/spi.h b/sw/bootloader/devices/spi.h new file mode 100644 index 0000000..61816d0 --- /dev/null +++ b/sw/bootloader/devices/spi.h @@ -0,0 +1,12 @@ +#ifndef _SPI_H +#define _SPI_H + +#include + +void spi_select(uint8_t id); +void spi_deselect(uint8_t id); +uint8_t spi_read(); +void spi_write(uint8_t data); +uint8_t spi_exchange(uint8_t data); + +#endif \ No newline at end of file diff --git a/sw/bootloader/devices/spi.s b/sw/bootloader/devices/spi.s new file mode 100644 index 0000000..5595a9a --- /dev/null +++ b/sw/bootloader/devices/spi.s @@ -0,0 +1,39 @@ +.include "io.inc65" + +.importzp zp, sreg + +.export _spi_select, _spi_deselect +.export _spi_read, _spi_write, _spi_exchange + +.autoimport on + +.code + +; void spi_select(uint8_t id) +; Select a (the) slave by pulling its CS line down +; TODO allow active high or active low CS +; TODO allow more than one slave +_spi_select: + lda #$1 ; Ignore whatever id is, 1 is the only option + sta SPI_CTRL + rts + +; void spi_deslect(uint8_t id) +; Deslect a slave by pulling its CS line up +; TODO allow active high or active low CS +_spi_deselect: + stz SPI_CTRL + rts + +; uint8_t spi_read() +_spi_read: + lda #$0 +; void spi_write(uint8_t data) +_spi_write: +; uint8_t spi_exchange(uint8_t data) +_spi_exchange: + sta SPI_OUTPUT +@1: lda SPI_CTRL + bmi @1 + lda SPI_INPUT + rts diff --git a/sw/bootloader/main.c b/sw/bootloader/main.c index 97290d3..bd4f1b3 100644 --- a/sw/bootloader/main.c +++ b/sw/bootloader/main.c @@ -6,6 +6,7 @@ #include "devices/board_io.h" #include "devices/uart.h" #include "devices/sd_card.h" +#include "devices/sd_print.h" #include "filesystem/fat.h" #define KERNEL_LOAD_ADDR 0xD000 @@ -13,40 +14,68 @@ uint8_t buf[512]; int main() { - uint16_t rca; - clrscr(); - cputs("Starting sd_init\n"); - cprintf("And testing cprintf\n"); + // array to hold responses + uint8_t res[5], token; + uint32_t addr = 0x00000000; + uint16_t i; - sd_init(); + cputs("Start\r\n"); - cprintf("finish sd_init\n"); + // initialize sd card + if(SD_init() != SD_SUCCESS) + { + cputs("Error init SD CARD\r\n"); + } + else + { + cputs("SD Card init\r\n"); - rca = sd_get_rca(); - cprintf("rca: %x\n", rca); + // read sector 0 + // cputs("\r\nReading sector: 0x"); + // ((uint8_t)(addr >> 24)); + // cprintf("%x", (uint8_t)(addr >> 16)); + // cprintf("%x", (uint8_t)(addr >> 8)); + // cprintf("%x", (uint8_t)addr); + // res[0] = SD_readSingleBlock(addr, buf, &token); + // cputs("\r\nResponse:\r\n"); + // //SD_printR1(res[0]); - sd_select_card(rca); + // if no error, print buffer + // if((res[0] == 0x00) && (token == SD_START_TOKEN)) + // SD_printBuf(buf); + // else if error token received, print + // else if(!(token & 0xF0)) + // { + // cputs("Ercputsror token:\r\n"); + // SD_printDataErrToken(token); + // } - /* - fat_init(); + // update address to 0x00000100 + // addr = 0x00000100; - filename = (char*)malloc(FAT_MAX_FILE_NAME); + // // fill buffer with 0x55 + // for(i = 0; i < 512; i++) buf[i] = 0x55; - cluster = fat_parse_path_to_cluster("/kernel.bin"); - for (kernel_load = (uint8_t*)KERNEL_LOAD_ADDR; cluster < FAT_CLUSTERMASK; kernel_load+=(8*512)) { - cprintf("cluster: %lx\n", cluster); - cprintf("Writing to %p\n", kernel_load); - fat_read_cluster(cluster, kernel_load); - cluster = fat_get_chain_value(cluster); - } + // cputs("Writing 0x55 to sector: 0x"); + // cprintf("%x", (uint8_t)(addr >> 24)); + // cprintf("%x", (uint8_t)(addr >> 16)); + // cprintf("%x", (uint8_t)(addr >> 8)); + // cprintf("%x", (uint8_t)addr); - */ + // // write data to sector + // res[0] = SD_writeSingleBlock(addr, buf, &token); - cprintf("Done!\n"); + // cputs("\r\nResponse:\r\n"); + // //SD_printR1(res[0]); - for(;;); + // // if no errors writing + // if(res[0] == 0x00) + // { + // if(token == SD_DATA_ACCEPTED) + // cputs("Write successful\r\n"); + // } + } - cprintf("Reset vector: %x\n", *((uint16_t*)0xfffc)); + while(1) ; - return 0; }