# 573in1 - Copyright (C) 2022-2024 spicyjpeg # # 573in1 is free software: you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # 573in1 is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # 573in1. If not, see . CONFIG PART = "XCS40XL-PQ208-4"; CONFIG PROHIBIT = "P77"; # /INIT CONFIG PROHIBIT = "P153"; # DIN CONFIG PROHIBIT = "P154"; # DOUT ## Floorplan constraints SET "DRAMArbiter.apbWDataReg" RLOC_ORIGIN = "R1C1"; SET "DRAMArbiter.mainRDataReg" RLOC_ORIGIN = "R1C2"; SET "DRAMArbiter.auxRDataReg" RLOC_ORIGIN = "R1C3"; SET "MP3Descrambler.key1Reg" RLOC_ORIGIN = "R1C4"; SET "MP3Descrambler.key2Reg" RLOC_ORIGIN = "R1C5"; SET "MP3Descrambler.derivedKeyMux" RLOC_ORIGIN = "R1C6"; SET "MP3Descrambler.swapper" RLOC_ORIGIN = "R1C7"; SET "MP3Descrambler.key3Reg" RLOC_ORIGIN = "R9C8"; SET "MP3Descrambler.xorMux" RLOC_ORIGIN = "R1C8"; SET "MP3Descrambler.byteSwapMux" RLOC_ORIGIN = "R1C9"; SET "MP3DataFeeder.baudRateGen" RLOC_ORIGIN = "R9C9"; SET "MP3DataFeeder.shiftReg" RLOC_ORIGIN = "R1C10"; SET "MP3DataFeeder.counter" RLOC_ORIGIN = "R9C10"; SET "MP3StateMachine.startAddrHReg" RLOC_ORIGIN = "R1C11"; SET "MP3StateMachine.startAddrLReg" RLOC_ORIGIN = "R6C11"; SET "MP3StateMachine.endAddrHReg" RLOC_ORIGIN = "R1C12"; SET "MP3StateMachine.endAddrLReg" RLOC_ORIGIN = "R6C12"; SET "DRAMArbiter.auxRAddrReg" RLOC_ORIGIN = "R1C13"; SET "DRAMArbiter.mainRAddrReg" RLOC_ORIGIN = "R1C14"; SET "DRAMArbiter.apbRAddrMux" RLOC_ORIGIN = "R1C15"; SET "DRAMArbiter.mainWAddrReg" RLOC_ORIGIN = "R1C16"; SET "DRAMArbiter.apbAddrMux" RLOC_ORIGIN = "R1C17"; SET "DRAMController.dramAddrMux" RLOC_ORIGIN = "R1C18"; SET "DRAMController.stateCounter" RLOC_ORIGIN = "R1C19"; SET "DRAMController.refreshTimer" RLOC_ORIGIN = "R1C20"; SET "MP3StateMachine.frameCountReg" RLOC_ORIGIN = "R2C25"; SET "MP3StateMachine.sampleDeltaReg" RLOC_ORIGIN = "R2C26"; SET "MP3StateMachine.sampleCountHReg" RLOC_ORIGIN = "R2C27"; SET "MP3StateMachine.sampleCountLReg" RLOC_ORIGIN = "R1C28"; SET "UARTTransmitter.counter" RLOC_ORIGIN = "R10C1"; SET "UARTTransmitter.fifo" RLOC_ORIGIN = "R13C1"; SET "UARTTransmitter.shiftReg" RLOC_ORIGIN = "R12C2"; SET "UARTReceiver.shiftReg" RLOC_ORIGIN = "R12C3"; SET "UARTReceiver.counter" RLOC_ORIGIN = "R10C4"; SET "UARTReceiver.fifo" RLOC_ORIGIN = "R13C4"; SET "BaudRateGenerator.divider" RLOC_ORIGIN = "R11C5"; ## System clocks TIMESPEC "TS_clkMain" = PERIOD "clkMain" 29.4500 MHz HIGH 50 %; TIMESPEC "TS_clkUART" = PERIOD "clkUART" 19.6608 MHz HIGH 50 %; NET "clkInMain" LOC = "P160"; NET "clkMain" TNM_NET = "clkMain"; NET "clkInUART" LOC = "P207"; NET "clkUART" TNM_NET = "clkUART"; ## Host interface # Bus timings are slightly overconstrained to reduce the chance of metastability # caused by the 573's bus running faster (33.8688 MHz). TIMESPEC "TS_hostAddr" = FROM "hostAddr" TO "FFS" "TS_clkMain" * 1.2; TIMESPEC "TS_hostWData" = FROM "hostData" TO "FFS" "TS_clkMain" * 1.2; TIMESPEC "TS_hostRData" = FROM "FFS" TO "hostData" "TS_clkMain" * 1.2; NET "nHostCS" LOC = "P142"; NET "nHostCS" TNM_NET = "hostControl"; NET "nHostRead" LOC = "P146"; NET "nHostRead" TNM_NET = "hostControl"; NET "nHostWrite" LOC = "P145"; NET "nHostWrite" TNM_NET = "hostControl"; NET "hostAddr[0]" LOC = "P117"; NET "hostAddr[0]" TNM_NET = "hostAddr"; NET "hostAddr[1]" LOC = "P116"; NET "hostAddr[1]" TNM_NET = "hostAddr"; NET "hostAddr[2]" LOC = "P115"; NET "hostAddr[2]" TNM_NET = "hostAddr"; NET "hostAddr[3]" LOC = "P114"; NET "hostAddr[3]" TNM_NET = "hostAddr"; NET "hostAddr[4]" LOC = "P113"; NET "hostAddr[4]" TNM_NET = "hostAddr"; NET "hostAddr[5]" LOC = "P112"; NET "hostAddr[5]" TNM_NET = "hostAddr"; NET "hostAddr[6]" LOC = "P110"; NET "hostAddr[6]" TNM_NET = "hostAddr"; NET "hostData[0]" LOC = "P138"; NET "hostData[0]" TNM_NET = "hostData"; NET "hostData[1]" LOC = "P137"; NET "hostData[1]" TNM_NET = "hostData"; NET "hostData[2]" LOC = "P136"; NET "hostData[2]" TNM_NET = "hostData"; NET "hostData[3]" LOC = "P135"; NET "hostData[3]" TNM_NET = "hostData"; NET "hostData[4]" LOC = "P134"; NET "hostData[4]" TNM_NET = "hostData"; NET "hostData[5]" LOC = "P133"; NET "hostData[5]" TNM_NET = "hostData"; NET "hostData[6]" LOC = "P132"; NET "hostData[6]" TNM_NET = "hostData"; NET "hostData[7]" LOC = "P129"; NET "hostData[7]" TNM_NET = "hostData"; NET "hostData[8]" LOC = "P128"; NET "hostData[8]" TNM_NET = "hostData"; NET "hostData[9]" LOC = "P127"; NET "hostData[9]" TNM_NET = "hostData"; NET "hostData[10]" LOC = "P126"; NET "hostData[10]" TNM_NET = "hostData"; NET "hostData[11]" LOC = "P125"; NET "hostData[11]" TNM_NET = "hostData"; NET "hostData[12]" LOC = "P124"; NET "hostData[12]" TNM_NET = "hostData"; NET "hostData[13]" LOC = "P123"; NET "hostData[13]" TNM_NET = "hostData"; NET "hostData[14]" LOC = "P122"; NET "hostData[14]" TNM_NET = "hostData"; NET "hostData[15]" LOC = "P120"; NET "hostData[15]" TNM_NET = "hostData"; ## SRAM interface NET "nSRAMCS" LOC = "P34"; NET "nSRAMCS" TNM_NET = "sramCtrl"; NET "nSRAMCS" FAST; NET "nSRAMRead" LOC = "P40"; NET "nSRAMRead" TNM_NET = "sramCtrl"; NET "nSRAMRead" FAST; NET "nSRAMWrite" LOC = "P55"; NET "nSRAMWrite" TNM_NET = "sramCtrl"; NET "nSRAMWrite" FAST; NET "sramAddr[0]" LOC = "P30"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[1]" LOC = "P32"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[2]" LOC = "P35"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[3]" LOC = "P37"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[4]" LOC = "P41"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[5]" LOC = "P43"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[6]" LOC = "P45"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[7]" LOC = "P47"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[8]" LOC = "P46"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[9]" LOC = "P44"; NET "sramAddr[0]" TNM_NET = "sramAddr"; NET "sramAddr[10]" LOC = "P36"; NET "sramAddr[10]" TNM_NET = "sramAddr"; NET "sramAddr[11]" LOC = "P42"; NET "sramAddr[11]" TNM_NET = "sramAddr"; NET "sramAddr[12]" LOC = "P49"; NET "sramAddr[12]" TNM_NET = "sramAddr"; NET "sramAddr[13]" LOC = "P48"; NET "sramAddr[13]" TNM_NET = "sramAddr"; NET "sramAddr[14]" LOC = "P56"; NET "sramAddr[14]" TNM_NET = "sramAddr"; NET "sramAddr[15]" LOC = "P58"; NET "sramAddr[15]" TNM_NET = "sramAddr"; NET "sramAddr[16]" LOC = "P57"; NET "sramAddr[16]" TNM_NET = "sramAddr"; NET "sramData[0]" LOC = "P28"; NET "sramData[0]" TNM_NET = "sramData"; NET "sramData[1]" LOC = "P24"; NET "sramData[1]" TNM_NET = "sramData"; NET "sramData[2]" LOC = "P22"; NET "sramData[2]" TNM_NET = "sramData"; NET "sramData[3]" LOC = "P21"; NET "sramData[3]" TNM_NET = "sramData"; NET "sramData[4]" LOC = "P23"; NET "sramData[4]" TNM_NET = "sramData"; NET "sramData[5]" LOC = "P27"; NET "sramData[5]" TNM_NET = "sramData"; NET "sramData[6]" LOC = "P29"; NET "sramData[6]" TNM_NET = "sramData"; NET "sramData[7]" LOC = "P31"; NET "sramData[7]" TNM_NET = "sramData"; ## DRAM interface NET "nDRAMRead" LOC = "P190"; NET "nDRAMRead" TNM_NET = "dramCtrl"; NET "nDRAMRead" FAST; NET "nDRAMWrite" LOC = "P196"; NET "nDRAMWrite" TNM_NET = "dramCtrl"; NET "nDRAMWrite" FAST; NET "nDRAMRAS[0]" LOC = "P191"; # 22H NET "nDRAMRAS[0]" TNM_NET = "dramCtrl"; NET "nDRAMRAS[0]" FAST; NET "nDRAMRAS[1]" LOC = "P189"; # 22J NET "nDRAMRAS[1]" TNM_NET = "dramCtrl"; NET "nDRAMRAS[1]" FAST; NET "nDRAMRAS[2]" LOC = "P193"; # 22G NET "nDRAMRAS[2]" TNM_NET = "dramCtrl"; NET "nDRAMRAS[2]" FAST; NET "nDRAMLCAS[0]" LOC = "P199"; # 22H NET "nDRAMLCAS[0]" TNM_NET = "dramCtrl"; NET "nDRAMLCAS[0]" FAST; NET "nDRAMLCAS[1]" LOC = "P201"; # 22J NET "nDRAMLCAS[1]" TNM_NET = "dramCtrl"; NET "nDRAMLCAS[1]" FAST; NET "nDRAMLCAS[2]" LOC = "P197"; # 22G NET "nDRAMLCAS[2]" TNM_NET = "dramCtrl"; NET "nDRAMLCAS[2]" FAST; NET "nDRAMUCAS[0]" LOC = "P198"; # 22H NET "nDRAMUCAS[0]" TNM_NET = "dramCtrl"; NET "nDRAMUCAS[0]" FAST; NET "nDRAMUCAS[1]" LOC = "P200"; # 22J NET "nDRAMUCAS[1]" TNM_NET = "dramCtrl"; NET "nDRAMUCAS[1]" FAST; NET "nDRAMUCAS[2]" LOC = "P194"; # 22G NET "nDRAMUCAS[2]" TNM_NET = "dramCtrl"; NET "nDRAMUCAS[2]" FAST; NET "dramAddr[0]" LOC = "P186"; NET "dramAddr[0]" TNM_NET = "dramAddr"; NET "dramAddr[1]" LOC = "P184"; NET "dramAddr[1]" TNM_NET = "dramAddr"; NET "dramAddr[2]" LOC = "P180"; NET "dramAddr[2]" TNM_NET = "dramAddr"; NET "dramAddr[3]" LOC = "P178"; NET "dramAddr[3]" TNM_NET = "dramAddr"; NET "dramAddr[4]" LOC = "P176"; NET "dramAddr[4]" TNM_NET = "dramAddr"; NET "dramAddr[5]" LOC = "P174"; NET "dramAddr[5]" TNM_NET = "dramAddr"; NET "dramAddr[6]" LOC = "P175"; NET "dramAddr[6]" TNM_NET = "dramAddr"; NET "dramAddr[7]" LOC = "P177"; NET "dramAddr[7]" TNM_NET = "dramAddr"; NET "dramAddr[8]" LOC = "P179"; NET "dramAddr[8]" TNM_NET = "dramAddr"; NET "dramAddr[9]" LOC = "P181"; NET "dramAddr[9]" TNM_NET = "dramAddr"; NET "dramAddr[10]" LOC = "P185"; NET "dramAddr[10]" TNM_NET = "dramAddr"; NET "dramAddr[11]" LOC = "P187"; NET "dramAddr[11]" TNM_NET = "dramAddr"; NET "dramAddr[12]" LOC = "P188"; NET "dramAddr[12]" TNM_NET = "dramAddr"; NET "dramData[0]" LOC = "P15"; NET "dramData[0]" TNM_NET = "dramData"; NET "dramData[1]" LOC = "P14"; NET "dramData[1]" TNM_NET = "dramData"; NET "dramData[2]" LOC = "P10"; NET "dramData[2]" TNM_NET = "dramData"; NET "dramData[3]" LOC = "P8"; NET "dramData[3]" TNM_NET = "dramData"; NET "dramData[4]" LOC = "P2"; NET "dramData[4]" TNM_NET = "dramData"; NET "dramData[5]" LOC = "P206"; NET "dramData[5]" TNM_NET = "dramData"; NET "dramData[6]" LOC = "P205"; NET "dramData[6]" TNM_NET = "dramData"; NET "dramData[7]" LOC = "P204"; NET "dramData[7]" TNM_NET = "dramData"; NET "dramData[8]" LOC = "P3"; NET "dramData[8]" TNM_NET = "dramData"; NET "dramData[9]" LOC = "P4"; NET "dramData[9]" TNM_NET = "dramData"; NET "dramData[10]" LOC = "P5"; NET "dramData[10]" TNM_NET = "dramData"; NET "dramData[11]" LOC = "P9"; NET "dramData[11]" TNM_NET = "dramData"; NET "dramData[12]" LOC = "P11"; NET "dramData[12]" TNM_NET = "dramData"; NET "dramData[13]" LOC = "P17"; NET "dramData[13]" TNM_NET = "dramData"; NET "dramData[14]" LOC = "P19"; NET "dramData[14]" TNM_NET = "dramData"; NET "dramData[15]" LOC = "P20"; NET "dramData[15]" TNM_NET = "dramData"; ## MP3 decoder control interface NET "mp3ClkIn" LOC = "P163"; NET "mp3ClkIn" TNM_NET = "mp3Clk"; NET "mp3ClkOut" LOC = "P162"; NET "mp3ClkOut" TNM_NET = "mp3Clk"; NET "mp3Reset" LOC = "P152"; NET "mp3Reset" TNM_NET = "mp3Control"; NET "mp3Ready" LOC = "P159"; NET "mp3Ready" TNM_NET = "mp3Control"; NET "mp3SDA" LOC = "P150"; NET "mp3SDA" TNM_NET = "mp3Control"; NET "mp3SCL" LOC = "P151"; NET "mp3SCL" TNM_NET = "mp3Control"; NET "mp3StatusCS" LOC = "P149"; NET "mp3StatusCS" TNM_NET = "mp3Control"; NET "mp3StatusError" LOC = "P168"; NET "mp3StatusError" TNM_NET = "mp3Control"; NET "mp3StatusFrameSync" LOC = "P161"; NET "mp3StatusFrameSync" TNM_NET = "mp3Control"; NET "mp3StatusDataReq" LOC = "P148"; NET "mp3StatusDataReq" TNM_NET = "mp3Control"; ## MP3 decoder data interface NET "mp3InSDIN" LOC = "P167"; NET "mp3InSDIN" TNM_NET = "mp3Data"; NET "mp3InBCLK" LOC = "P164"; NET "mp3InBCLK" TNM_NET = "mp3Data"; NET "mp3InLRCK" LOC = "P166"; NET "mp3InLRCK" TNM_NET = "mp3Data"; NET "mp3OutSDOUT" LOC = "P172"; NET "mp3OutSDOUT" TNM_NET = "mp3Data"; NET "mp3OutBCLK" LOC = "P169"; NET "mp3OutBCLK" TNM_NET = "mp3Data"; NET "mp3OutLRCK" LOC = "P171"; NET "mp3OutLRCK" TNM_NET = "mp3Data"; ## I2S audio output NET "dacSDIN" LOC = "P96"; NET "dacSDIN" TNM_NET = "dacData"; NET "dacBCLK" LOC = "P94"; NET "dacBCLK" TNM_NET = "dacData"; NET "dacLRCK" LOC = "P95"; NET "dacLRCK" TNM_NET = "dacData"; NET "dacMCLK" LOC = "P97"; NET "dacMCLK" TNM_NET = "dacData"; ## Serial interfaces # TODO: are pins 98 and 99 swapped? NET "networkTXE" LOC = "P98"; NET "networkTXE" TNM_NET = "network"; NET "networkTX" LOC = "P99"; NET "networkTX" TNM_NET = "network"; NET "networkRX" LOC = "P100"; NET "networkRX" TNM_NET = "network"; NET "serialTX" LOC = "P89"; NET "serialTX" TNM_NET = "serial"; NET "serialRX" LOC = "P88"; NET "serialRX" TNM_NET = "serial"; NET "serialRTS" LOC = "P93"; NET "serialRTS" TNM_NET = "serial"; NET "serialCTS" LOC = "P90"; NET "serialCTS" TNM_NET = "serial"; NET "serialDTR" LOC = "P87"; NET "serialDTR" TNM_NET = "serial"; NET "serialDSR" LOC = "P85"; NET "serialDSR" TNM_NET = "serial"; ## Light outputs NET "lightBankAH[0]" LOC = "P84"; NET "lightBankAH[0]" TNM_NET = "lights"; NET "lightBankAH[1]" LOC = "P83"; NET "lightBankAH[1]" TNM_NET = "lights"; NET "lightBankAH[2]" LOC = "P82"; NET "lightBankAH[2]" TNM_NET = "lights"; NET "lightBankAH[3]" LOC = "P81"; NET "lightBankAH[3]" TNM_NET = "lights"; NET "lightBankAL[0]" LOC = "P80"; NET "lightBankAL[0]" TNM_NET = "lights"; NET "lightBankAL[1]" LOC = "P76"; NET "lightBankAL[1]" TNM_NET = "lights"; NET "lightBankAL[2]" LOC = "P75"; NET "lightBankAL[2]" TNM_NET = "lights"; NET "lightBankAL[3]" LOC = "P74"; NET "lightBankAL[3]" TNM_NET = "lights"; NET "lightBankBH[0]" LOC = "P73"; NET "lightBankBH[0]" TNM_NET = "lights"; NET "lightBankBH[1]" LOC = "P72"; NET "lightBankBH[1]" TNM_NET = "lights"; NET "lightBankBH[2]" LOC = "P70"; NET "lightBankBH[2]" TNM_NET = "lights"; NET "lightBankBH[3]" LOC = "P69"; NET "lightBankBH[3]" TNM_NET = "lights"; NET "lightBankD[0]" LOC = "P68"; NET "lightBankD[0]" TNM_NET = "lights"; NET "lightBankD[1]" LOC = "P67"; NET "lightBankD[1]" TNM_NET = "lights"; NET "lightBankD[2]" LOC = "P60"; NET "lightBankD[2]" TNM_NET = "lights"; NET "lightBankD[3]" LOC = "P59"; NET "lightBankD[3]" TNM_NET = "lights"; ## General-purpose inputs NET "inputBank[0]" LOC = "P61"; NET "inputBank[0]" TNM_NET = "inputs"; NET "inputBank[1]" LOC = "P62"; NET "inputBank[1]" TNM_NET = "inputs"; NET "inputBank[2]" LOC = "P63"; NET "inputBank[2]" TNM_NET = "inputs"; NET "inputBank[3]" LOC = "P64"; NET "inputBank[3]" TNM_NET = "inputs"; ## 1-wire bus NET "ds2433" LOC = "P107"; NET "ds2433" TNM_NET = "dsBus"; NET "ds2401" LOC = "P109"; NET "ds2401" TNM_NET = "dsBus";