mirror of
https://github.com/antonblanchard/microwatt.git
synced 2026-04-25 20:11:34 +00:00
This adds an SPI flash controller which supports direct memory-mapped access to the flash along with a manual mode to send commands. The direct mode can be set via generic to default to single wire or quad mode. The controller supports normal, dual and quad accesses with configurable commands, clock divider, dummy clocks etc... The SPI clock can be an even divider of sys_clk starting at 2 (so max 50Mhz with our typical Arty designs). A flash offset is carried via generics to syscon to tell SW about which portion of the flash is reserved for the FPGA bitfile. There is currently no plumbing to make the CPU reset past that address (TBD). Note: Operating at 50Mhz has proven unreliable without adding some delay to the sampling of the input data. I'm working in improving this, in the meantime, I'm leaving the default set at 25 Mhz. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
325 lines
12 KiB
Tcl
325 lines
12 KiB
Tcl
################################################################################
|
|
# clkin, reset, uart pins...
|
|
################################################################################
|
|
|
|
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports ext_clk]
|
|
|
|
set_property -dict {PACKAGE_PIN G4 IOSTANDARD LVCMOS15} [get_ports ext_rst]
|
|
|
|
set_property -dict {PACKAGE_PIN AA19 IOSTANDARD LVCMOS33} [get_ports uart_main_tx]
|
|
set_property -dict {PACKAGE_PIN V18 IOSTANDARD LVCMOS33} [get_ports uart_main_rx]
|
|
|
|
################################################################################
|
|
# Pmod Header JC: UART (bottom)
|
|
################################################################################
|
|
|
|
#set_property -dict { PACKAGE_PIN Y21 IOSTANDARD LVCMOS33 } [get_ports { uart_pmod_cts_n }];
|
|
#set_property -dict { PACKAGE_PIN AA21 IOSTANDARD LVCMOS33 } [get_ports { uart_pmod_tx }];
|
|
#set_property -dict { PACKAGE_PIN AA20 IOSTANDARD LVCMOS33 } [get_ports { uart_pmod_rx }];
|
|
#set_property -dict { PACKAGE_PIN AA18 IOSTANDARD LVCMOS33 } [get_ports { uart_pmod_rts_n }];
|
|
|
|
################################################################################
|
|
# LEDs
|
|
################################################################################
|
|
|
|
set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { led0 }];
|
|
set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led1 }];
|
|
|
|
################################################################################
|
|
# SPI Flash
|
|
################################################################################
|
|
|
|
set_property -dict { PACKAGE_PIN T19 IOSTANDARD LVCMOS33 } [get_ports { spi_flash_cs_n }];
|
|
set_property -dict { PACKAGE_PIN P22 IOSTANDARD LVCMOS33 } [get_ports { spi_flash_mosi }];
|
|
set_property -dict { PACKAGE_PIN R22 IOSTANDARD LVCMOS33 } [get_ports { spi_flash_miso }];
|
|
set_property -dict { PACKAGE_PIN P21 IOSTANDARD LVCMOS33 } [get_ports { spi_flash_wp_n }];
|
|
set_property -dict { PACKAGE_PIN R21 IOSTANDARD LVCMOS33 } [get_ports { spi_flash_hold_n }];
|
|
|
|
################################################################################
|
|
# DRAM (generated by LiteX)
|
|
################################################################################
|
|
|
|
# ddram:0.a
|
|
set_property LOC M2 [get_ports {ddram_a[0]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[0]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[0]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC M5 [get_ports {ddram_a[1]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[1]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[1]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC M3 [get_ports {ddram_a[2]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[2]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[2]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC M1 [get_ports {ddram_a[3]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[3]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[3]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC L6 [get_ports {ddram_a[4]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[4]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[4]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC P1 [get_ports {ddram_a[5]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[5]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[5]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC N3 [get_ports {ddram_a[6]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[6]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[6]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC N2 [get_ports {ddram_a[7]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[7]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[7]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC M6 [get_ports {ddram_a[8]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[8]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[8]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC R1 [get_ports {ddram_a[9]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[9]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[9]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC L5 [get_ports {ddram_a[10]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[10]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[10]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC N5 [get_ports {ddram_a[11]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[11]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[11]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC N4 [get_ports {ddram_a[12]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[12]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[12]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC P2 [get_ports {ddram_a[13]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[13]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[13]}]
|
|
|
|
# ddram:0.a
|
|
set_property LOC P6 [get_ports {ddram_a[14]}]
|
|
set_property SLEW FAST [get_ports {ddram_a[14]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_a[14]}]
|
|
|
|
# ddram:0.ba
|
|
set_property LOC L3 [get_ports {ddram_ba[0]}]
|
|
set_property SLEW FAST [get_ports {ddram_ba[0]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_ba[0]}]
|
|
|
|
# ddram:0.ba
|
|
set_property LOC K6 [get_ports {ddram_ba[1]}]
|
|
set_property SLEW FAST [get_ports {ddram_ba[1]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_ba[1]}]
|
|
|
|
# ddram:0.ba
|
|
set_property LOC L4 [get_ports {ddram_ba[2]}]
|
|
set_property SLEW FAST [get_ports {ddram_ba[2]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_ba[2]}]
|
|
|
|
# ddram:0.ras_n
|
|
set_property LOC J4 [get_ports {ddram_ras_n}]
|
|
set_property SLEW FAST [get_ports {ddram_ras_n}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_ras_n}]
|
|
|
|
# ddram:0.cas_n
|
|
set_property LOC K3 [get_ports {ddram_cas_n}]
|
|
set_property SLEW FAST [get_ports {ddram_cas_n}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_cas_n}]
|
|
|
|
# ddram:0.we_n
|
|
set_property LOC L1 [get_ports {ddram_we_n}]
|
|
set_property SLEW FAST [get_ports {ddram_we_n}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_we_n}]
|
|
|
|
# ddram:0.dm
|
|
set_property LOC G3 [get_ports {ddram_dm[0]}]
|
|
set_property SLEW FAST [get_ports {ddram_dm[0]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dm[0]}]
|
|
|
|
# ddram:0.dm
|
|
set_property LOC F1 [get_ports {ddram_dm[1]}]
|
|
set_property SLEW FAST [get_ports {ddram_dm[1]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dm[1]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC G2 [get_ports {ddram_dq[0]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[0]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[0]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[0]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC H4 [get_ports {ddram_dq[1]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[1]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[1]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[1]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC H5 [get_ports {ddram_dq[2]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[2]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[2]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[2]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC J1 [get_ports {ddram_dq[3]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[3]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[3]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[3]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC K1 [get_ports {ddram_dq[4]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[4]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[4]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[4]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC H3 [get_ports {ddram_dq[5]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[5]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[5]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[5]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC H2 [get_ports {ddram_dq[6]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[6]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[6]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[6]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC J5 [get_ports {ddram_dq[7]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[7]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[7]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[7]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC E3 [get_ports {ddram_dq[8]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[8]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[8]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[8]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC B2 [get_ports {ddram_dq[9]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[9]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[9]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[9]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC F3 [get_ports {ddram_dq[10]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[10]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[10]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[10]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC D2 [get_ports {ddram_dq[11]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[11]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[11]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[11]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC C2 [get_ports {ddram_dq[12]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[12]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[12]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[12]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC A1 [get_ports {ddram_dq[13]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[13]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[13]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[13]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC E2 [get_ports {ddram_dq[14]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[14]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[14]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[14]}]
|
|
|
|
# ddram:0.dq
|
|
set_property LOC B1 [get_ports {ddram_dq[15]}]
|
|
set_property SLEW FAST [get_ports {ddram_dq[15]}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_dq[15]}]
|
|
set_property IN_TERM UNTUNED_SPLIT_50 [get_ports {ddram_dq[15]}]
|
|
|
|
# ddram:0.dqs_p
|
|
set_property LOC K2 [get_ports {ddram_dqs_p[0]}]
|
|
set_property SLEW FAST [get_ports {ddram_dqs_p[0]}]
|
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddram_dqs_p[0]}]
|
|
|
|
# ddram:0.dqs_p
|
|
set_property LOC E1 [get_ports {ddram_dqs_p[1]}]
|
|
set_property SLEW FAST [get_ports {ddram_dqs_p[1]}]
|
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddram_dqs_p[1]}]
|
|
|
|
# ddram:0.dqs_n
|
|
set_property LOC J2 [get_ports {ddram_dqs_n[0]}]
|
|
set_property SLEW FAST [get_ports {ddram_dqs_n[0]}]
|
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddram_dqs_n[0]}]
|
|
|
|
# ddram:0.dqs_n
|
|
set_property LOC D1 [get_ports {ddram_dqs_n[1]}]
|
|
set_property SLEW FAST [get_ports {ddram_dqs_n[1]}]
|
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddram_dqs_n[1]}]
|
|
|
|
# ddram:0.clk_p
|
|
set_property LOC P5 [get_ports {ddram_clk_p}]
|
|
set_property SLEW FAST [get_ports {ddram_clk_p}]
|
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddram_clk_p}]
|
|
|
|
# ddram:0.clk_n
|
|
set_property LOC P4 [get_ports {ddram_clk_n}]
|
|
set_property SLEW FAST [get_ports {ddram_clk_n}]
|
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddram_clk_n}]
|
|
|
|
# ddram:0.cke
|
|
set_property LOC J6 [get_ports {ddram_cke}]
|
|
set_property SLEW FAST [get_ports {ddram_cke}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_cke}]
|
|
|
|
# ddram:0.odt
|
|
set_property LOC K4 [get_ports {ddram_odt}]
|
|
set_property SLEW FAST [get_ports {ddram_odt}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_odt}]
|
|
|
|
# ddram:0.reset_n
|
|
set_property LOC G1 [get_ports {ddram_reset_n}]
|
|
set_property SLEW FAST [get_ports {ddram_reset_n}]
|
|
set_property IOSTANDARD SSTL15 [get_ports {ddram_reset_n}]
|
|
|
|
################################################################################
|
|
# Design constraints and bitsteam attributes
|
|
################################################################################
|
|
|
|
#Internal VREF
|
|
set_property INTERNAL_VREF 0.750 [get_iobanks 35]
|
|
|
|
set_property CONFIG_VOLTAGE 3.3 [current_design]
|
|
set_property CFGBVS VCCO [current_design]
|
|
|
|
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
|
|
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
|
|
set_property CONFIG_MODE SPIx4 [current_design]
|
|
|
|
################################################################################
|
|
# Clock constraints
|
|
################################################################################
|
|
|
|
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { ext_clk }];
|
|
|
|
################################################################################
|
|
# False path constraints (from LiteX as they relate to LiteDRAM)
|
|
################################################################################
|
|
|
|
set_false_path -quiet -to [get_pins -filter {REF_PIN_NAME == PRE} -of_objects [get_cells -hierarchical -filter {ars_ff1 == TRUE || ars_ff2 == TRUE}]]
|
|
|
|
set_max_delay 2 -quiet -from [get_pins -filter {REF_PIN_NAME == C} -of_objects [get_cells -hierarchical -filter {ars_ff1 == TRUE}]] -to [get_pins -filter {REF_PIN_NAME == D} -of_objects [get_cells -hierarchical -filter {ars_ff2 == TRUE}]]
|