From 81792f599bbc42f998bf1c602712bb6f6213c2cd Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Fri, 31 Dec 2021 18:09:54 +1100 Subject: [PATCH] arty a7: Connect SD card interface to microSD socket on LCD touchscreen board If the generic USE_LCD is false, the first SD card controller (mmcblk0 in Linux) is connected to pmod HA; if USE_LCD is true, it is connected to the SD card slot on the touchscreen/LCD panel. Signed-off-by: Paul Mackerras --- fpga/arty_a7.xdc | 28 +++++++---- fpga/top-arty.vhdl | 117 +++++++++++++++++++++++++++++++-------------- 2 files changed, 100 insertions(+), 45 deletions(-) diff --git a/fpga/arty_a7.xdc b/fpga/arty_a7.xdc index 6490f5d..2c42303 100644 --- a/fpga/arty_a7.xdc +++ b/fpga/arty_a7.xdc @@ -82,14 +82,14 @@ set_property IOB true [get_cells -hierarchical -filter {NAME =~*/spi_rxtx/input_ #set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { pmod_ja_10 }]; # connection to Digilent PmodSD on JA -set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { sdcard_data[3] }]; -set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { sdcard_cmd }]; -set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { sdcard_data[0] }]; -set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 SLEW FAST } [get_ports { sdcard_clk }]; -set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { sdcard_data[1] }]; -set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { sdcard_data[2] }]; -set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { sdcard_cd }]; -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { sdcard_wp }]; +set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ja_sdcard_data[3] }]; +set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ja_sdcard_cmd }]; +set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ja_sdcard_data[0] }]; +set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 SLEW FAST } [get_ports { ja_sdcard_clk }]; +set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ja_sdcard_data[1] }]; +set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ja_sdcard_data[2] }]; +set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { ja_sdcard_cd }]; +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { ja_sdcard_wp }]; # Put registers into IOBs to improve timing set_property IOB true [get_cells -hierarchical -filter {NAME =~*.litesdcard/sdpads_data_i_reg*}] @@ -198,6 +198,18 @@ set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { a4_n }]; set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { a5_p }]; set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { a5_n }]; +################################################################################ +# connection to micro SD card socket on touchscreen board +################################################################################ +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ts_sdcard_data[3] }]; +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ts_sdcard_cmd }]; +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ts_sdcard_data[0] }]; +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 SLEW FAST } [get_ports { ts_sdcard_clk }]; +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ts_sdcard_data[1] }]; +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 SLEW FAST PULLUP TRUE } [get_ports { ts_sdcard_data[2] }]; +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 PULLUP TRUE } [get_ports { ts_sdcard_cd }]; +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { ts_sdcard_wp }]; + ################################################################################ # Arduino/chipKIT shield connector ################################################################################ diff --git a/fpga/top-arty.vhdl b/fpga/top-arty.vhdl index 61fa274..3d5f3f3 100644 --- a/fpga/top-arty.vhdl +++ b/fpga/top-arty.vhdl @@ -125,11 +125,17 @@ entity toplevel is eth_col : in std_ulogic; eth_crs : in std_ulogic; - -- SD card - sdcard_data : inout std_ulogic_vector(3 downto 0); - sdcard_cmd : inout std_ulogic; - sdcard_clk : out std_ulogic; - sdcard_cd : in std_ulogic; + -- SD card pmod on JA + ja_sdcard_data : inout std_ulogic_vector(3 downto 0); + ja_sdcard_cmd : inout std_ulogic; + ja_sdcard_clk : out std_ulogic; + ja_sdcard_cd : in std_ulogic; + + -- SD card slot on touchscreen/LCD board + ts_sdcard_data : inout std_ulogic_vector(3 downto 0); + ts_sdcard_cmd : inout std_ulogic; + ts_sdcard_clk : out std_ulogic; + ts_sdcard_cd : in std_ulogic; -- Second SD card sdcard2_data : inout std_ulogic_vector(3 downto 0); @@ -722,38 +728,75 @@ begin signal sdc1_activity : std_ulogic := '0'; begin - litesdcard : litesdcard_core - port map ( - clk => system_clk, - rst => periph_rst, - wb_ctrl_adr => wb_sdcard_adr, - wb_ctrl_dat_w => wb_ext_io_in.dat, - wb_ctrl_dat_r => wb_sdcard_out.dat, - wb_ctrl_sel => wb_ext_io_in.sel, - wb_ctrl_cyc => wb_sdcard_cyc, - wb_ctrl_stb => wb_ext_io_in.stb, - wb_ctrl_ack => wb_sdcard_out.ack, - wb_ctrl_we => wb_ext_io_in.we, - wb_ctrl_cti => "000", - wb_ctrl_bte => "00", - wb_ctrl_err => open, - wb_dma_adr => wb_sddma1_nr.adr, - wb_dma_dat_w => wb_sddma1_nr.dat, - wb_dma_dat_r => wb_sddma_ir.dat, - wb_dma_sel => wb_sddma1_nr.sel, - wb_dma_cyc => wb_sddma1_nr.cyc, - wb_dma_stb => wb_sddma1_nr.stb, - wb_dma_ack => wb_sddma1_ack, - wb_dma_we => wb_sddma1_nr.we, - wb_dma_cti => open, - wb_dma_bte => open, - wb_dma_err => '0', - sdcard_data => sdcard_data, - sdcard_cmd => sdcard_cmd, - sdcard_clk => sdcard_clk, - sdcard_cd => sdcard_cd, - irq => ext_irq_sdcard - ); + sdcard_ja: if not USE_LCD generate + litesdcard : litesdcard_core + port map ( + clk => system_clk, + rst => periph_rst, + wb_ctrl_adr => wb_sdcard_adr, + wb_ctrl_dat_w => wb_ext_io_in.dat, + wb_ctrl_dat_r => wb_sdcard_out.dat, + wb_ctrl_sel => wb_ext_io_in.sel, + wb_ctrl_cyc => wb_sdcard_cyc, + wb_ctrl_stb => wb_ext_io_in.stb, + wb_ctrl_ack => wb_sdcard_out.ack, + wb_ctrl_we => wb_ext_io_in.we, + wb_ctrl_cti => "000", + wb_ctrl_bte => "00", + wb_ctrl_err => open, + wb_dma_adr => wb_sddma1_nr.adr, + wb_dma_dat_w => wb_sddma1_nr.dat, + wb_dma_dat_r => wb_sddma_ir.dat, + wb_dma_sel => wb_sddma1_nr.sel, + wb_dma_cyc => wb_sddma1_nr.cyc, + wb_dma_stb => wb_sddma1_nr.stb, + wb_dma_ack => wb_sddma1_ack, + wb_dma_we => wb_sddma1_nr.we, + wb_dma_cti => open, + wb_dma_bte => open, + wb_dma_err => '0', + sdcard_data => ja_sdcard_data, + sdcard_cmd => ja_sdcard_cmd, + sdcard_clk => ja_sdcard_clk, + sdcard_cd => ja_sdcard_cd, + irq => ext_irq_sdcard + ); + end generate; + + sdcard_ts: if USE_LCD generate + litesdcard : litesdcard_core + port map ( + clk => system_clk, + rst => periph_rst, + wb_ctrl_adr => wb_sdcard_adr, + wb_ctrl_dat_w => wb_ext_io_in.dat, + wb_ctrl_dat_r => wb_sdcard_out.dat, + wb_ctrl_sel => wb_ext_io_in.sel, + wb_ctrl_cyc => wb_sdcard_cyc, + wb_ctrl_stb => wb_ext_io_in.stb, + wb_ctrl_ack => wb_sdcard_out.ack, + wb_ctrl_we => wb_ext_io_in.we, + wb_ctrl_cti => "000", + wb_ctrl_bte => "00", + wb_ctrl_err => open, + wb_dma_adr => wb_sddma1_nr.adr, + wb_dma_dat_w => wb_sddma1_nr.dat, + wb_dma_dat_r => wb_sddma_ir.dat, + wb_dma_sel => wb_sddma1_nr.sel, + wb_dma_cyc => wb_sddma1_nr.cyc, + wb_dma_stb => wb_sddma1_nr.stb, + wb_dma_ack => wb_sddma1_ack, + wb_dma_we => wb_sddma1_nr.we, + wb_dma_cti => open, + wb_dma_bte => open, + wb_dma_err => '0', + sdcard_data => ts_sdcard_data, + sdcard_cmd => ts_sdcard_cmd, + sdcard_clk => ts_sdcard_clk, + sdcard_cd => ts_sdcard_cd, + irq => ext_irq_sdcard + ); + end generate; litesdcard2 : litesdcard_core port map (