S5443_3Top.v 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 10/30/2023 11:24:31 AM
  7. // Design Name:
  8. // Module Name: S5443_3Top
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module S5443_3Top
  22. #(
  23. parameter CmdRegWidth = 32,
  24. parameter AddrRegWidth = 12,
  25. parameter STAGES = 3,
  26. parameter SpiNum = 7
  27. )
  28. (
  29. input Clk123_i,
  30. input [AddrRegWidth-2:0] SmcAddr_i,
  31. inout [CmdRegWidth/2-1:0] SmcData_io,
  32. input SmcAwe_i,
  33. input SmcAmsN_i,
  34. input SmcAre_i,
  35. input [1:0] SmcBe_i,
  36. input SmcAoe_i,
  37. input [SpiNum-1:0] Ld_i,
  38. output Led_o,
  39. output [SpiNum-1:0] Mosi0_o,
  40. inout [SpiNum-1:0] Mosi1_io,//inout: when RSPI mode, input; when QSPI mode output;
  41. output [SpiNum-1:0] Mosi2_o,
  42. output [SpiNum-2:0] Mosi3_o,
  43. output [SpiNum-1:0] Ss_o,
  44. output [SpiNum-1:0] SsFlash_o,
  45. output [SpiNum-1:0] Sck_o,
  46. output [SpiNum-1:0] SpiRst_o,
  47. output [SpiNum-1:0] SpiDir_o,
  48. output LoCsReg_o,
  49. output LD_o
  50. );
  51. //================================================================================
  52. // REG/WIRE
  53. //================================================================================
  54. wire clk80;
  55. wire [SpiNum-1:0]sckMuxed;
  56. wire [AddrRegWidth-1:0] addrExt;
  57. wire [SpiNum-1:0] ssMuxed;
  58. wire [SpiNum-1:0]mosi0;
  59. wire [SpiNum-1:0]mosi1;
  60. wire [SpiNum-1:0]mosi2;
  61. wire [SpiNum-1:0]mosi3;
  62. wire [SpiNum-1:0] txEn;
  63. wire [SpiNum-1:0] spiTxEnSync;
  64. wire initRst;
  65. wire gclk;
  66. wire [0:7] baudRate [SpiNum-1:0];
  67. wire [0:31] txFifoCtrlReg [SpiNum-1:0];
  68. wire [0:31] rxFifoCtrlReg [SpiNum-1:0];
  69. //InitRst
  70. wire [SpiNum-1:0] initRstGen;
  71. wire rst80;
  72. //SPI0
  73. wire [CmdRegWidth-1:0] spi0Ctrl;
  74. wire [CmdRegWidth-1:0] spi0Clk;
  75. wire [CmdRegWidth-1:0] spi0CsDelay;
  76. wire [CmdRegWidth-1:0] spi0CsCtrl;
  77. wire [CmdRegWidth-1:0] spi0TxFifoCtrl;
  78. wire [CmdRegWidth-1:0] spi0RxFifoCtrl;
  79. wire [CmdRegWidth-1:0] spi0TxFifo;
  80. wire [CmdRegWidth-1:0] spi0RxFifo;
  81. wire [CmdRegWidth-1:0] spi0TxFifoCtrlReg;
  82. wire [CmdRegWidth-1:0] spi0RxFifoCtrlReg;
  83. wire [CmdRegWidth-1:0] spi0CtrlRR;
  84. wire [CmdRegWidth-1:0] spi0ClkRR;
  85. wire [CmdRegWidth-1:0] spi0CsDelayRR;
  86. wire [CmdRegWidth-1:0] spi0CsCtrlRR;
  87. wire [CmdRegWidth-1:0] spi0TxFifoCtrlRR;
  88. wire [CmdRegWidth-1:0] spi0RxFifoCtrlRR;
  89. //SPI1
  90. wire [CmdRegWidth-1:0] spi1Ctrl;
  91. wire [CmdRegWidth-1:0] spi1Clk;
  92. wire [CmdRegWidth-1:0] spi1CsDelay;
  93. wire [CmdRegWidth-1:0] spi1CsCtrl;
  94. wire [CmdRegWidth-1:0] spi1TxFifoCtrl;
  95. wire [CmdRegWidth-1:0] spi1RxFifoCtrl;
  96. wire [CmdRegWidth-1:0] spi1TxFifoCtrlReg;
  97. wire [CmdRegWidth-1:0] spi1RxFifoCtrlReg;
  98. wire [CmdRegWidth-1:0] spi1CtrlRR;
  99. wire [CmdRegWidth-1:0] spi1CsDelayRR;
  100. wire [CmdRegWidth-1:0] spi1CsCtrlRR;
  101. wire [CmdRegWidth-1:0] spi1TxFifoCtrlRR;
  102. wire [CmdRegWidth-1:0] spi1RxFifoCtrlRR;
  103. //SPI2
  104. wire [CmdRegWidth-1:0] spi2Ctrl;
  105. wire [CmdRegWidth-1:0] spi2Clk;
  106. wire [CmdRegWidth-1:0] spi2CsDelay;
  107. wire [CmdRegWidth-1:0] spi2CsCtrl;
  108. wire [CmdRegWidth-1:0] spi2TxFifoCtrl;
  109. wire [CmdRegWidth-1:0] spi2RxFifoCtrl;
  110. wire [CmdRegWidth-1:0] spi2TxFifoCtrlReg;
  111. wire [CmdRegWidth-1:0] spi2RxFifoCtrlReg;
  112. wire [CmdRegWidth-1:0] spi2CtrlRR;
  113. wire [CmdRegWidth-1:0] spi2CsDelayRR;
  114. wire [CmdRegWidth-1:0] spi2CsCtrlRR;
  115. wire [CmdRegWidth-1:0] spi2TxFifoCtrlRR;
  116. wire [CmdRegWidth-1:0] spi2RxFifoCtrlRR;
  117. //SPI3
  118. wire [CmdRegWidth-1:0] spi3Ctrl;
  119. wire [CmdRegWidth-1:0] spi3Clk;
  120. wire [CmdRegWidth-1:0] spi3CsDelay;
  121. wire [CmdRegWidth-1:0] spi3CsCtrl;
  122. wire [CmdRegWidth-1:0] spi3TxFifoCtrl;
  123. wire [CmdRegWidth-1:0] spi3RxFifoCtrl;
  124. wire [CmdRegWidth-1:0] spi3TxFifoCtrlReg;
  125. wire [CmdRegWidth-1:0] spi3RxFifoCtrlReg;
  126. wire [CmdRegWidth-1:0] spi3CtrlRR;
  127. wire [CmdRegWidth-1:0] spi3ClkRR;
  128. wire [CmdRegWidth-1:0] spi3CsDelayRR;
  129. wire [CmdRegWidth-1:0] spi3CsCtrlRR;
  130. wire [CmdRegWidth-1:0] spi3TxFifoCtrlRR;
  131. wire [CmdRegWidth-1:0] spi3RxFifoCtrlRR;
  132. //SPI4
  133. wire [CmdRegWidth-1:0] spi4Ctrl;
  134. wire [CmdRegWidth-1:0] spi4Clk;
  135. wire [CmdRegWidth-1:0] spi4CsDelay;
  136. wire [CmdRegWidth-1:0] spi4CsCtrl;
  137. wire [CmdRegWidth-1:0] spi4TxFifoCtrl;
  138. wire [CmdRegWidth-1:0] spi4RxFifoCtrl;
  139. wire [CmdRegWidth-1:0] spi4TxFifoCtrlReg;
  140. wire [CmdRegWidth-1:0] spi4RxFifoCtrlReg;
  141. wire [CmdRegWidth-1:0] spi4CtrlRR;
  142. wire [CmdRegWidth-1:0] spi4ClkRR;
  143. wire [CmdRegWidth-1:0] spi4CsDelayRR;
  144. wire [CmdRegWidth-1:0] spi4CsCtrlRR;
  145. wire [CmdRegWidth-1:0] spi4TxFifoCtrlRR;
  146. wire [CmdRegWidth-1:0] spi4RxFifoCtrlRR;
  147. //SPI5
  148. wire [CmdRegWidth-1:0] spi5Ctrl;
  149. wire [CmdRegWidth-1:0] spi5Clk;
  150. wire [CmdRegWidth-1:0] spi5CsDelay;
  151. wire [CmdRegWidth-1:0] spi5CsCtrl;
  152. wire [CmdRegWidth-1:0] spi5TxFifoCtrl;
  153. wire [CmdRegWidth-1:0] spi5RxFifoCtrl;
  154. wire [CmdRegWidth-1:0] spi5TxFifoCtrlReg;
  155. wire [CmdRegWidth-1:0] spi5RxFifoCtrlReg;
  156. wire [CmdRegWidth-1:0] spi5CtrlRR;
  157. wire [CmdRegWidth-1:0] spi5ClkRR;
  158. wire [CmdRegWidth-1:0] spi5CsDelayRR;
  159. wire [CmdRegWidth-1:0] spi5CsCtrlRR;
  160. wire [CmdRegWidth-1:0] spi5TxFifoCtrlRR;
  161. wire [CmdRegWidth-1:0] spi5RxFifoCtrlRR;
  162. //SPI6
  163. wire [CmdRegWidth-1:0] spi6Ctrl;
  164. wire [CmdRegWidth-1:0] spi6Clk;
  165. wire [CmdRegWidth-1:0] spi6CsDelay;
  166. wire [CmdRegWidth-1:0] spi6CsCtrl;
  167. wire [CmdRegWidth-1:0] spi6TxFifoCtrl;
  168. wire [CmdRegWidth-1:0] spi6RxFifoCtrl;
  169. wire [CmdRegWidth-1:0] spi6TxFifoCtrlReg;
  170. wire [CmdRegWidth-1:0] spi6RxFifoCtrlReg;
  171. wire [CmdRegWidth-1:0] spi6CtrlRR;
  172. wire [CmdRegWidth-1:0] spi6ClkRR;
  173. wire [CmdRegWidth-1:0] spi6CsDelayRR;
  174. wire [CmdRegWidth-1:0] spi6CsCtrlRR;
  175. wire [CmdRegWidth-1:0] spi6TxFifoCtrlRR;
  176. wire [CmdRegWidth-1:0] spi6RxFifoCtrlRR;
  177. wire [CmdRegWidth-1:0] spiTxRxEn;
  178. wire [CmdRegWidth-1:0] GPIOA;
  179. wire [CmdRegWidth-1:0] GPIOASync;
  180. wire [AddrRegWidth-1:0] toRegMapAddr;
  181. wire [CmdRegWidth/2-1:0] toRegMapData;
  182. wire toRegMapVal;
  183. wire [SpiNum-1:0] toFifoVal;
  184. wire [CmdRegWidth*SpiNum-1:0] toFifoData;
  185. wire [SpiNum-1:0] toSpiVal;
  186. wire [0:31] toSpiData [SpiNum-1:0];
  187. wire [0:1] widthSel [SpiNum-1:0];
  188. wire [SpiNum-1:0] clockPol;
  189. wire [SpiNum-1:0] clockPhase;
  190. wire [SpiNum-1:0] endianSel;
  191. wire [SpiNum-1:0] selSt;
  192. wire [SpiNum-1:0] spiMode;
  193. wire [0:5] stopDelay [SpiNum-1:0];
  194. wire [SpiNum-1:0] leadx;
  195. wire [SpiNum-1:0] lag;
  196. wire [SpiNum-1:0] fifoRxRst;
  197. wire [SpiNum-1:0] fifoTxRst;
  198. wire [SpiNum-1:0] fifoRxRstRdPtr;
  199. wire [SpiNum-1:0] fifoTxRstWrPtr;
  200. wire [0:7] wordCntTx [SpiNum-1:0];
  201. wire [0:7] wordCntRx [SpiNum-1:0];
  202. wire [SpiNum-1:0] chipSelFpga;
  203. wire [SpiNum-1:0] chipSelFlash;
  204. wire [SpiNum-1:0] assel;
  205. wire [SpiNum-1:0] spiClkBus;
  206. wire [SpiNum-1:0] spiSyncRst;
  207. wire [AddrRegWidth-1:0] smcAddr;
  208. wire [CmdRegWidth/2-1:0] smcData;
  209. wire smcVal;
  210. //RxFifo
  211. wire [0:31] dataToRxFifo [SpiNum-1:0];
  212. wire [0:7] addrToRxFifo [SpiNum-1:0];
  213. wire [SpiNum-1:0] valToRxFifo;
  214. wire [SpiNum-1:0] valToTxFifoRead;
  215. // SPI mode choice
  216. wire [SpiNum-1:0] sckR;
  217. wire [SpiNum-1:0] ssR;
  218. wire [SpiNum-1:0] mosi0R;
  219. wire [SpiNum-1:0] valReg;
  220. wire [SpiNum-1:0] valToTxR;
  221. wire [SpiNum-1:0] valToRxR;
  222. wire [0:31] dataToRxFifoR [SpiNum-1:0];
  223. wire [SpiNum-1:0] sckQ;
  224. wire [SpiNum-1:0] ssQ;
  225. wire [SpiNum-1:0] mosi0Q;
  226. wire [SpiNum-1:0] valToTxQ;
  227. wire [SpiNum-1:0] valToRxQ;
  228. wire [0:31] dataToRxFifoQ [SpiNum-1:0];
  229. wire [0:31] dataFromRxFifo [SpiNum-1:0];
  230. wire [CmdRegWidth/2-1:0] muxedData;
  231. wire smcValComb;
  232. wire [CmdRegWidth/2-1:0] ansData;
  233. wire requestToFifo;
  234. wire [SpiNum-1: 0] emptyFlagTx;
  235. wire [SpiNum-1:0] spiEn;
  236. wire [SpiNum-1:0] ldReg;
  237. reg [SpiNum-1:0] ssReg;
  238. reg [SpiNum-1:0] ssFlashReg;
  239. //================================================================================
  240. // ASSIGNMENTS
  241. //================================================================================
  242. assign addrExt = {SmcAddr_i, 1'b0};
  243. assign smcValComb = (!SmcAmsN_i && !SmcAwe_i) ? 1'b1 : 1'b0;
  244. assign txEn = spiTxRxEn[6:0];
  245. assign Mosi1_io[0] =(SpiDir_o[0])?mosi1[0]:1'bz;
  246. assign Mosi1_io[1] =(SpiDir_o[1])?mosi1[1]:1'bz;
  247. assign Mosi1_io[2] =(SpiDir_o[2])?mosi1[2]:1'bz;
  248. assign Mosi1_io[3] =(SpiDir_o[3])?mosi1[3]:1'bz;
  249. assign Mosi1_io[4] =(SpiDir_o[4])?mosi1[4]:1'bz;
  250. assign Mosi1_io[5] =(SpiDir_o[5])?mosi1[5]:1'bz;
  251. assign Mosi1_io[6] =(SpiDir_o[6])?mosi1[6]:1'bz;
  252. assign Mosi2_o = mosi2;
  253. assign Mosi3_o[0] = mosi3[0];
  254. assign Mosi3_o[1] = mosi3[1];
  255. assign Mosi3_o[2] = mosi3[2];
  256. assign Mosi3_o[3] = mosi3[3];
  257. assign Mosi3_o[4] = mosi3[4];
  258. // assign Mosi3_o[5] = mosi3[5];
  259. assign Mosi3_o[5] = mosi3[6];// Mosi6
  260. assign Ss_o[0] = (assel[0]) ? (chipSelFpga[0] ? ssMuxed[0] : 1'b1) : chipSelFpga[0];
  261. assign Ss_o[1] = (assel[1]) ? (chipSelFpga[1] ? ssMuxed[1] : 1'b1) : chipSelFpga[1];
  262. assign Ss_o[2] = (assel[2]) ? (chipSelFpga[2] ? ssMuxed[2] : 1'b1) : chipSelFpga[2];
  263. assign Ss_o[3] = (assel[3]) ? (chipSelFpga[3] ? ssMuxed[3] : 1'b1) : chipSelFpga[3];
  264. assign Ss_o[4] = (assel[4]) ? (chipSelFpga[4] ? ssMuxed[4] : 1'b1) : chipSelFpga[4];
  265. assign Ss_o[5] = (assel[5]) ? (chipSelFpga[5] ? ssMuxed[5] : 1'b1) : chipSelFpga[5];
  266. assign Ss_o[6] = (assel[6]) ? (chipSelFpga[6] ? ssMuxed[6] : 1'b1) : chipSelFpga[6];
  267. assign LoCsReg_o = (assel[5]) ? (chipSelFpga[5] ? ssMuxed[5] : 1'b1) : chipSelFpga[5];
  268. assign SsFlash_o[0] = (assel[0]) ? (chipSelFlash[0] ? ssMuxed[0] : 1'b1) : chipSelFlash[0];
  269. assign SsFlash_o[1] = (assel[1]) ? (chipSelFlash[1] ? ssMuxed[1] : 1'b1) : chipSelFlash[1];
  270. assign SsFlash_o[2] = (assel[2]) ? (chipSelFlash[2] ? ssMuxed[2] : 1'b1) : chipSelFlash[2];
  271. assign SsFlash_o[3] = (assel[3]) ? (chipSelFlash[3] ? ssMuxed[3] : 1'b1) : chipSelFlash[3];
  272. assign SsFlash_o[4] = (assel[4]) ? (chipSelFlash[4] ? ssMuxed[4] : 1'b1) : chipSelFlash[4];
  273. assign SsFlash_o[5] = (assel[5]) ? (chipSelFlash[5] ? ssMuxed[5] : 1'b1) : chipSelFlash[5];
  274. assign SsFlash_o[6] = (assel[6]) ? (chipSelFlash[6] ? ssMuxed[6] : 1'b1) : chipSelFlash[6];
  275. assign Sck_o = sckMuxed;
  276. assign widthSel[0] = spi0CtrlRR[6:5];
  277. assign widthSel[1] = spi1CtrlRR[6:5];
  278. assign widthSel[2] = spi2CtrlRR[6:5];
  279. assign widthSel[3] = spi3CtrlRR[6:5];
  280. assign widthSel[4] = spi4CtrlRR[6:5];
  281. assign widthSel[5] = spi5CtrlRR[6:5];
  282. assign widthSel[6] = spi6CtrlRR[6:5];
  283. assign spiEn[0] = spi0CtrlRR[0];
  284. assign spiEn[1] = spi1CtrlRR[0];
  285. assign spiEn[2] = spi2CtrlRR[0];
  286. assign spiEn[3] = spi3CtrlRR[0];
  287. assign spiEn[4] = spi4CtrlRR[0];
  288. assign spiEn[5] = spi5CtrlRR[0];
  289. assign spiEn[6] = spi6CtrlRR[0];
  290. assign spiMode[0] = spi0CtrlRR[7];
  291. assign spiMode[1] = spi1CtrlRR[7];
  292. assign spiMode[2] = spi2CtrlRR[7];
  293. assign spiMode[3] = spi3CtrlRR[7];
  294. assign spiMode[4] = spi4CtrlRR[7];
  295. assign spiMode[5] = spi5CtrlRR[7];
  296. assign spiMode[6] = spi6CtrlRR[7];
  297. assign clockPol[0] = spi0CtrlRR[2];
  298. assign clockPol[1] = spi1CtrlRR[2];
  299. assign clockPol[2] = spi2CtrlRR[2];
  300. assign clockPol[3] = spi3CtrlRR[2];
  301. assign clockPol[4] = spi4CtrlRR[2];
  302. assign clockPol[5] = spi5CtrlRR[2];
  303. assign clockPol[6] = spi6CtrlRR[2];
  304. assign clockPhase[0] = spi0CtrlRR[1];
  305. assign clockPhase[1] = spi1CtrlRR[1];
  306. assign clockPhase[2] = spi2CtrlRR[1];
  307. assign clockPhase[3] = spi3CtrlRR[1];
  308. assign clockPhase[4] = spi4CtrlRR[1];
  309. assign clockPhase[5] = spi5CtrlRR[1];
  310. assign clockPhase[6] = spi6CtrlRR[1];
  311. assign endianSel[0] = spi0CtrlRR[8];
  312. assign endianSel[1] = spi1CtrlRR[8];
  313. assign endianSel[2] = spi2CtrlRR[8];
  314. assign endianSel[3] = spi3CtrlRR[8];
  315. assign endianSel[4] = spi4CtrlRR[8];
  316. assign endianSel[5] = spi5CtrlRR[8];
  317. assign endianSel[6] = spi6CtrlRR[8];
  318. assign selSt[0] = spi0CtrlRR[4];
  319. assign selSt[1] = spi1CtrlRR[4];
  320. assign selSt[2] = spi2CtrlRR[4];
  321. assign selSt[3] = spi3CtrlRR[4];
  322. assign selSt[4] = spi4CtrlRR[4];
  323. assign selSt[5] = spi5CtrlRR[4];
  324. assign selSt[6] = spi6CtrlRR[4];
  325. assign assel[0] = spi0CtrlRR[3];
  326. assign assel[1] = spi1CtrlRR[3];
  327. assign assel[2] = spi2CtrlRR[3];
  328. assign assel[3] = spi3CtrlRR[3];
  329. assign assel[4] = spi4CtrlRR[3];
  330. assign assel[5] = spi5CtrlRR[3];
  331. assign assel[6] = spi6CtrlRR[3];
  332. assign stopDelay[0] = spi0CsDelayRR[7:2];
  333. assign stopDelay[1] = spi1CsDelayRR[7:2];
  334. assign stopDelay[2] = spi2CsDelayRR[7:2];
  335. assign stopDelay[3] = spi3CsDelayRR[7:2];
  336. assign stopDelay[4] = spi4CsDelayRR[7:2];
  337. assign stopDelay[5] = spi5CsDelayRR[7:2];
  338. assign stopDelay[6] = spi6CsDelayRR[7:2];
  339. assign leadx[0] = spi0CsDelayRR[1];
  340. assign leadx[1] = spi1CsDelayRR[1];
  341. assign leadx[2] = spi2CsDelayRR[1];
  342. assign leadx[3] = spi3CsDelayRR[1];
  343. assign leadx[4] = spi4CsDelayRR[1];
  344. assign leadx[5] = spi5CsDelayRR[1];
  345. assign leadx[6] = spi6CsDelayRR[1];
  346. assign lag[0] = spi0CsDelayRR[0];
  347. assign lag[1] = spi1CsDelayRR[0];
  348. assign lag[2] = spi2CsDelayRR[0];
  349. assign lag[3] = spi3CsDelayRR[0];
  350. assign lag[4] = spi4CsDelayRR[0];
  351. assign lag[5] = spi5CsDelayRR[0];
  352. assign lag[6] = spi6CsDelayRR[0];
  353. assign baudRate[0] = spi0Clk[7:0];
  354. assign baudRate[1] = spi1Clk[7:0];
  355. assign baudRate[2] = spi2Clk[7:0];
  356. assign baudRate[3] = spi3Clk[7:0];
  357. assign baudRate[4] = spi4Clk[7:0];
  358. assign baudRate[5] = spi5Clk[7:0];
  359. assign baudRate[6] = spi6Clk[7:0];
  360. assign SpiRst_o[0] = GPIOA[0];
  361. assign SpiRst_o[1] = GPIOA[1];
  362. assign SpiRst_o[2] = GPIOA[2];
  363. assign SpiRst_o[3] = GPIOA[3];
  364. assign SpiRst_o[4] = GPIOA[4];
  365. assign SpiRst_o[5] = GPIOA[5];
  366. assign SpiRst_o[6] = GPIOA[6];
  367. assign fifoRxRstRdPtr[0] = spi0RxFifoCtrl[0];
  368. assign fifoRxRstRdPtr[1] = spi1RxFifoCtrl[0];
  369. assign fifoRxRstRdPtr[2] = spi2RxFifoCtrl[0];
  370. assign fifoRxRstRdPtr[3] = spi3RxFifoCtrl[0];
  371. assign fifoRxRstRdPtr[4] = spi4RxFifoCtrl[0];
  372. assign fifoRxRstRdPtr[5] = spi5RxFifoCtrl[0];
  373. assign fifoRxRstRdPtr[6] = spi6RxFifoCtrl[0];
  374. assign fifoRxRst[0] = spi0RxFifoCtrlRR[0];
  375. assign fifoRxRst[1] = spi1RxFifoCtrlRR[0];
  376. assign fifoRxRst[2] = spi2RxFifoCtrlRR[0];
  377. assign fifoRxRst[3] = spi3RxFifoCtrlRR[0];
  378. assign fifoRxRst[4] = spi4RxFifoCtrlRR[0];
  379. assign fifoRxRst[5] = spi5RxFifoCtrlRR[0];
  380. assign fifoRxRst[6] = spi6RxFifoCtrlRR[0];
  381. assign fifoTxRstWrPtr[0] = spi0TxFifoCtrl[0];
  382. assign fifoTxRstWrPtr[1] = spi1TxFifoCtrl[0];
  383. assign fifoTxRstWrPtr[2] = spi2TxFifoCtrl[0];
  384. assign fifoTxRstWrPtr[3] = spi3TxFifoCtrl[0];
  385. assign fifoTxRstWrPtr[4] = spi4TxFifoCtrl[0];
  386. assign fifoTxRstWrPtr[5] = spi5TxFifoCtrl[0];
  387. assign fifoTxRstWrPtr[6] = spi6TxFifoCtrl[0];
  388. assign fifoTxRst[0] = spi0TxFifoCtrlRR[0];
  389. assign fifoTxRst[1] = spi1TxFifoCtrlRR[0];
  390. assign fifoTxRst[2] = spi2TxFifoCtrlRR[0];
  391. assign fifoTxRst[3] = spi3TxFifoCtrlRR[0];
  392. assign fifoTxRst[4] = spi4TxFifoCtrlRR[0];
  393. assign fifoTxRst[5] = spi5TxFifoCtrlRR[0];
  394. assign fifoTxRst[6] = spi6TxFifoCtrlRR[0];
  395. assign LD_o = ldReg[0]&ldReg[1]&ldReg[2]&ldReg[3]&ldReg[4]&ldReg[5]&ldReg[6];
  396. assign wordCntRx[0] = spi0RxFifoCtrlRR[15:8];
  397. assign wordCntRx[1] = spi1RxFifoCtrlRR[15:8];
  398. assign wordCntRx[2] = spi2RxFifoCtrlRR[15:8];
  399. assign wordCntRx[3] = spi3RxFifoCtrlRR[15:8];
  400. assign wordCntRx[4] = spi4RxFifoCtrlRR[15:8];
  401. assign wordCntRx[5] = spi5RxFifoCtrlRR[15:8];
  402. assign wordCntRx[6] = spi6RxFifoCtrlRR[15:8];
  403. assign wordCntTx[0] = spi0TxFifoCtrlRR[15:8];
  404. assign wordCntTx[1] = spi1TxFifoCtrlRR[15:8];
  405. assign wordCntTx[2] = spi2TxFifoCtrlRR[15:8];
  406. assign wordCntTx[3] = spi3TxFifoCtrlRR[15:8];
  407. assign wordCntTx[4] = spi4TxFifoCtrlRR[15:8];
  408. assign wordCntTx[5] = spi5TxFifoCtrlRR[15:8];
  409. assign wordCntTx[6] = spi6TxFifoCtrlRR[15:8];
  410. assign chipSelFpga[0] = spi0CsCtrlRR[0];
  411. assign chipSelFpga[1] = spi1CsCtrlRR[0];
  412. assign chipSelFpga[2] = spi2CsCtrlRR[0];
  413. assign chipSelFpga[3] = spi3CsCtrlRR[0];
  414. assign chipSelFpga[4] = spi4CsCtrlRR[0];
  415. assign chipSelFpga[5] = spi5CsCtrlRR[0];
  416. assign chipSelFpga[6] = spi6CsCtrlRR[0];
  417. assign chipSelFlash[0] = spi0CsCtrlRR[1];
  418. assign chipSelFlash[1] = spi1CsCtrlRR[1];
  419. assign chipSelFlash[2] = spi2CsCtrlRR[1];
  420. assign chipSelFlash[3] = spi3CsCtrlRR[1];
  421. assign chipSelFlash[4] = spi4CsCtrlRR[1];
  422. assign chipSelFlash[5] = spi5CsCtrlRR[1];
  423. assign chipSelFlash[6] = spi6CsCtrlRR[1];
  424. assign ssMuxed[0] = (spiMode[0])? ssQ[0]:ssR[0];
  425. assign ssMuxed[1] = (spiMode[1])? ssQ[1]:ssR[1];
  426. assign ssMuxed[2] = (spiMode[2])? ssQ[2]:ssR[2];
  427. assign ssMuxed[3] = (spiMode[3])? ssQ[3]:ssR[3];
  428. assign ssMuxed[4] = (spiMode[4])? ssQ[4]:ssR[4];
  429. assign ssMuxed[5] = (spiMode[5])? ssQ[5]:ssR[5];
  430. assign ssMuxed[6] = (spiMode[6])? ssQ[6]:ssR[6];
  431. assign SpiDir_o[0] = (spiMode[0])? 1'b1 : 1'b0 ;
  432. assign SpiDir_o[1] = (spiMode[1])? 1'b1 : 1'b0 ;
  433. assign SpiDir_o[2] = (spiMode[2])? 1'b1 : 1'b0 ;
  434. assign SpiDir_o[3] = (spiMode[3])? 1'b1 : 1'b0 ;
  435. assign SpiDir_o[4] = (spiMode[4])? 1'b1 : 1'b0 ;
  436. assign SpiDir_o[5] = 1'b1;
  437. assign SpiDir_o[6] = (spiMode[6])? 1'b1 : 1'b0 ;
  438. assign sckMuxed[0] = (spiMode[0])?sckQ[0]:sckR[0];
  439. assign sckMuxed[1] = (spiMode[1])?sckQ[1]:sckR[1];
  440. assign sckMuxed[2] = (spiMode[2])?sckQ[2]:sckR[2];
  441. assign sckMuxed[3] = (spiMode[3])?sckQ[3]:sckR[3];
  442. assign sckMuxed[4] = (spiMode[4])?sckQ[4]:sckR[4];
  443. assign sckMuxed[5] = (spiMode[5])?sckQ[5]:sckR[5];
  444. assign sckMuxed[6] = (spiMode[6])?sckQ[6]:sckR[6];
  445. assign mosi0[0] = (spiMode[0])?mosi0Q[0]:mosi0R[0];
  446. assign mosi0[1] = (spiMode[1])?mosi0Q[1]:mosi0R[1];
  447. assign mosi0[2] = (spiMode[2])?mosi0Q[2]:mosi0R[2];
  448. assign mosi0[3] = (spiMode[3])?mosi0Q[3]:mosi0R[3];
  449. assign mosi0[4] = (spiMode[4])?mosi0Q[4]:mosi0R[4];
  450. assign mosi0[5] = (spiMode[5])?mosi0Q[5]:mosi0R[5];
  451. assign mosi0[6] = (spiMode[6])?mosi0Q[6]:mosi0R[6];
  452. assign Mosi0_o = mosi0;
  453. assign valToTxFifoRead[0] = (spiMode[0])?valToTxQ[0]:valToTxR[0];
  454. assign valToTxFifoRead[1] = (spiMode[1])?valToTxQ[1]:valToTxR[1];
  455. assign valToTxFifoRead[2] = (spiMode[2])?valToTxQ[2]:valToTxR[2];
  456. assign valToTxFifoRead[3] = (spiMode[3])?valToTxQ[3]:valToTxR[3];
  457. assign valToTxFifoRead[4] = (spiMode[4])?valToTxQ[4]:valToTxR[4];
  458. assign valToTxFifoRead[5] = (spiMode[5])?valToTxQ[5]:valToTxR[5];
  459. assign valToTxFifoRead[6] = (spiMode[6])?valToTxQ[6]:valToTxR[6];
  460. assign valToRxFifo[0] = valToRxR[0];
  461. assign valToRxFifo[1] = valToRxR[1];
  462. assign valToRxFifo[2] = valToRxR[2];
  463. assign valToRxFifo[3] = valToRxR[3];
  464. assign valToRxFifo[4] = valToRxR[4];
  465. assign valToRxFifo[5] = valToRxR[5];
  466. assign valToRxFifo[6] = valToRxR[6];
  467. assign dataToRxFifo[0] = dataToRxFifoR[0];
  468. assign dataToRxFifo[1] = dataToRxFifoR[1];
  469. assign dataToRxFifo[2] = dataToRxFifoR[2];
  470. assign dataToRxFifo[3] = dataToRxFifoR[3];
  471. assign dataToRxFifo[4] = dataToRxFifoR[4];
  472. assign dataToRxFifo[5] = dataToRxFifoR[5];
  473. assign dataToRxFifo[6] = dataToRxFifoR[6];
  474. assign spi0TxFifoCtrlReg = txFifoCtrlReg[0];
  475. assign spi1TxFifoCtrlReg = txFifoCtrlReg[1];
  476. assign spi2TxFifoCtrlReg = txFifoCtrlReg[2];
  477. assign spi3TxFifoCtrlReg = txFifoCtrlReg[3];
  478. assign spi4TxFifoCtrlReg = txFifoCtrlReg[4];
  479. assign spi5TxFifoCtrlReg = txFifoCtrlReg[5];
  480. assign spi6TxFifoCtrlReg = txFifoCtrlReg[6];
  481. assign spi0RxFifoCtrlReg = rxFifoCtrlReg[0];
  482. assign spi1RxFifoCtrlReg = rxFifoCtrlReg[1];
  483. assign spi2RxFifoCtrlReg = rxFifoCtrlReg[2];
  484. assign spi3RxFifoCtrlReg = rxFifoCtrlReg[3];
  485. assign spi4RxFifoCtrlReg = rxFifoCtrlReg[4];
  486. assign spi5RxFifoCtrlReg = rxFifoCtrlReg[5];
  487. assign spi6RxFifoCtrlReg = rxFifoCtrlReg[6];
  488. assign SmcData_io = (!SmcAre_i && !SmcAoe_i)?muxedData:16'bz;
  489. //================================================================================
  490. // CODING
  491. //================================================================================
  492. DataOutMux DataOutMuxer
  493. (
  494. .Clk_i(gclk),
  495. .Addr_i(addrExt),
  496. .ToRegMapAddr_i(toRegMapAddr),
  497. .RequestToFifo_i(requestToFifo),
  498. .FifoRxRst_i(fifoRxRstRdPtr[0]),
  499. .DataFromRegMap_i(ansData),
  500. .SmcAre_i(SmcAre_i),
  501. .DataFromRxFifo1_i(dataFromRxFifo[0]),
  502. .DataFromRxFifo2_i(dataFromRxFifo[1]),
  503. .DataFromRxFifo3_i(dataFromRxFifo[2]),
  504. .DataFromRxFifo4_i(dataFromRxFifo[3]),
  505. .DataFromRxFifo5_i(dataFromRxFifo[4]),
  506. .DataFromRxFifo6_i(dataFromRxFifo[5]),
  507. .DataFromRxFifo7_i(dataFromRxFifo[6]),
  508. .AnsData_o (muxedData)
  509. );
  510. BUFG BUFG_inst (
  511. .O(gclk), // 1-bit output: Clock output
  512. .I(Clk123_i) // 1-bit input: Clock input
  513. );
  514. DataMuxer DataMuxer
  515. (
  516. .Clk_i(gclk),
  517. .Rst_i(initRst),
  518. .SmcVal_i(smcValComb),
  519. .SmcData_i(SmcData_io),
  520. .SmcAddr_i(addrExt),
  521. .RequestToFifo_o(requestToFifo),
  522. .ToRegMapVal_o(toRegMapVal),
  523. .ToRegMapData_o(toRegMapData),
  524. .ToRegMapAddr_o(toRegMapAddr),
  525. .ToFifoVal_o(toFifoVal),
  526. .ToFifoData_o(toFifoData)
  527. );
  528. CDC #(
  529. .WIDTH(CmdRegWidth),
  530. .STAGES(STAGES)
  531. ) synchronizer(
  532. .ClkFast_i(gclk),
  533. .ClkSlow_i(spiClkBus),
  534. .Spi0Ctrl_i(spi0Ctrl),
  535. .Spi0CsCtrl_i(spi0CsCtrl),
  536. .Spi0CsDelay_i(spi0CsDelay),
  537. .Spi0TxFifoCtrl_i(spi0TxFifoCtrl),
  538. .Spi0RxFifoCtrl_i(spi0RxFifoCtrl),
  539. .Spi1Ctrl_i(spi1Ctrl),
  540. .Spi1CsCtrl_i(spi1CsCtrl),
  541. .Spi1CsDelay_i(spi1CsDelay),
  542. .Spi1TxFifoCtrl_i(spi1TxFifoCtrl),
  543. .Spi1RxFifoCtrl_i(spi1RxFifoCtrl),
  544. .Spi2Ctrl_i(spi2Ctrl),
  545. .Spi2CsCtrl_i(spi2CsCtrl),
  546. .Spi2CsDelay_i(spi2CsDelay),
  547. .Spi2TxFifoCtrl_i(spi2TxFifoCtrl),
  548. .Spi2RxFifoCtrl_i(spi2RxFifoCtrl),
  549. .Spi3Ctrl_i(spi3Ctrl),
  550. .Spi3CsCtrl_i(spi3CsCtrl),
  551. .Spi3CsDelay_i(spi3CsDelay),
  552. .Spi3TxFifoCtrl_i(spi3TxFifoCtrl),
  553. .Spi3RxFifoCtrl_i(spi3RxFifoCtrl),
  554. .Spi4Ctrl_i(spi4Ctrl),
  555. .Spi4CsCtrl_i(spi4CsCtrl),
  556. .Spi4CsDelay_i(spi4CsDelay),
  557. .Spi4TxFifoCtrl_i(spi4TxFifoCtrl),
  558. .Spi4RxFifoCtrl_i(spi4RxFifoCtrl),
  559. .Spi5Ctrl_i(spi5Ctrl),
  560. .Spi5CsCtrl_i(spi5CsCtrl),
  561. .Spi5CsDelay_i(spi5CsDelay),
  562. .Spi5TxFifoCtrl_i(spi5TxFifoCtrl),
  563. .Spi5RxFifoCtrl_i(spi5RxFifoCtrl),
  564. .Spi6Ctrl_i(spi6Ctrl),
  565. .Spi6CsCtrl_i(spi6CsCtrl),
  566. .Spi6CsDelay_i(spi6CsDelay),
  567. .Spi6TxFifoCtrl_i(spi6TxFifoCtrl),
  568. .Spi6RxFifoCtrl_i(spi6RxFifoCtrl),
  569. .Spi0Ctrl_o(spi0CtrlRR),
  570. .Spi0CsCtrl_o(spi0CsCtrlRR),
  571. .Spi0CsDelay_o(spi0CsDelayRR),
  572. .Spi0TxFifoCtrl_o(spi0TxFifoCtrlRR),
  573. .Spi0RxFifoCtrl_o(spi0RxFifoCtrlRR),
  574. .Spi1Ctrl_o(spi1CtrlRR),
  575. .Spi1CsCtrl_o(spi1CsCtrlRR),
  576. .Spi1CsDelay_o(spi1CsDelayRR),
  577. .Spi1TxFifoCtrl_o(spi1TxFifoCtrlRR),
  578. .Spi1RxFifoCtrl_o(spi1RxFifoCtrlRR),
  579. .Spi2Ctrl_o(spi2CtrlRR),
  580. .Spi2CsCtrl_o(spi2CsCtrlRR),
  581. .Spi2CsDelay_o(spi2CsDelayRR),
  582. .Spi2TxFifoCtrl_o(spi2TxFifoCtrlRR),
  583. .Spi2RxFifoCtrl_o(spi2RxFifoCtrlRR),
  584. .Spi3Ctrl_o(spi3CtrlRR),
  585. .Spi3CsCtrl_o(spi3CsCtrlRR),
  586. .Spi3CsDelay_o(spi3CsDelayRR),
  587. .Spi3TxFifoCtrl_o(spi3TxFifoCtrlRR),
  588. .Spi3RxFifoCtrl_o(spi3RxFifoCtrlRR),
  589. .Spi4Ctrl_o(spi4CtrlRR),
  590. .Spi4CsCtrl_o(spi4CsCtrlRR),
  591. .Spi4CsDelay_o(spi4CsDelayRR),
  592. .Spi4TxFifoCtrl_o(spi4TxFifoCtrlRR),
  593. .Spi4RxFifoCtrl_o(spi4RxFifoCtrlRR),
  594. .Spi5Ctrl_o(spi5CtrlRR),
  595. .Spi5CsCtrl_o(spi5CsCtrlRR),
  596. .Spi5CsDelay_o(spi5CsDelayRR),
  597. .Spi5TxFifoCtrl_o(spi5TxFifoCtrlRR),
  598. .Spi5RxFifoCtrl_o(spi5RxFifoCtrlRR),
  599. .Spi6Ctrl_o(spi6CtrlRR),
  600. .Spi6CsCtrl_o(spi6CsCtrlRR),
  601. .Spi6CsDelay_o(spi6CsDelayRR),
  602. .Spi6TxFifoCtrl_o(spi6TxFifoCtrlRR),
  603. .Spi6RxFifoCtrl_o(spi6RxFifoCtrlRR)
  604. );
  605. RegMap
  606. #(
  607. .CmdRegWidth(32),
  608. .AddrRegWidth(12)
  609. )
  610. RegMap_inst
  611. (
  612. .Clk_i(gclk),
  613. .Rst_i(initRst),
  614. .Data_i(toRegMapData),
  615. .Addr_i(toRegMapAddr),
  616. .Val_i(toRegMapVal),
  617. .SmcBe_i(SmcBe_i),
  618. .TxFifoCtrlReg0_i(spi0TxFifoCtrlReg),
  619. .TxFifoCtrlReg1_i(spi1TxFifoCtrlReg),
  620. .TxFifoCtrlReg2_i(spi2TxFifoCtrlReg),
  621. .TxFifoCtrlReg3_i(spi3TxFifoCtrlReg),
  622. .TxFifoCtrlReg4_i(spi4TxFifoCtrlReg),
  623. .TxFifoCtrlReg5_i(spi5TxFifoCtrlReg),
  624. .TxFifoCtrlReg6_i(spi6TxFifoCtrlReg),
  625. .RxFifoCtrlReg0_i(spi0RxFifoCtrlReg),
  626. .RxFifoCtrlReg1_i(spi1RxFifoCtrlReg),
  627. .RxFifoCtrlReg2_i(spi2RxFifoCtrlReg),
  628. .RxFifoCtrlReg3_i(spi3RxFifoCtrlReg),
  629. .RxFifoCtrlReg4_i(spi4RxFifoCtrlReg),
  630. .RxFifoCtrlReg5_i(spi5RxFifoCtrlReg),
  631. .RxFifoCtrlReg6_i(spi6RxFifoCtrlReg),
  632. .LdReg_i(ldReg),
  633. //Spi0
  634. .Spi0CtrlReg_o(spi0Ctrl),
  635. .Spi0ClkReg_o(spi0Clk),
  636. .Spi0CsDelayReg_o(spi0CsDelay),
  637. .Spi0CsCtrlReg_o(spi0CsCtrl),
  638. .Spi0TxFifoCtrlReg_o(spi0TxFifoCtrl),
  639. .Spi0RxFifoCtrlReg_o(spi0RxFifoCtrl),
  640. //Spi1
  641. .Spi1CtrlReg_o(spi1Ctrl),
  642. .Spi1ClkReg_o(spi1Clk),
  643. .Spi1CsDelayReg_o(spi1CsDelay),
  644. .Spi1CsCtrlReg_o(spi1CsCtrl),
  645. .Spi1TxFifoCtrlReg_o(spi1TxFifoCtrl),
  646. .Spi1RxFifoCtrlReg_o(spi1RxFifoCtrl),
  647. //Spi2
  648. .Spi2CtrlReg_o(spi2Ctrl),
  649. .Spi2ClkReg_o(spi2Clk),
  650. .Spi2CsDelayReg_o(spi2CsDelay),
  651. .Spi2CsCtrlReg_o(spi2CsCtrl),
  652. .Spi2TxFifoCtrlReg_o(spi2TxFifoCtrl),
  653. .Spi2RxFifoCtrlReg_o(spi2RxFifoCtrl),
  654. //Spi3
  655. .Spi3CtrlReg_o(spi3Ctrl),
  656. .Spi3ClkReg_o(spi3Clk),
  657. .Spi3CsDelayReg_o(spi3CsDelay),
  658. .Spi3CsCtrlReg_o(spi3CsCtrl),
  659. .Spi3TxFifoCtrlReg_o(spi3TxFifoCtrl),
  660. .Spi3RxFifoCtrlReg_o(spi3RxFifoCtrl),
  661. //Spi4
  662. .Spi4CtrlReg_o(spi4Ctrl),
  663. .Spi4ClkReg_o(spi4Clk),
  664. .Spi4CsDelayReg_o(spi4CsDelay),
  665. .Spi4CsCtrlReg_o(spi4CsCtrl),
  666. .Spi4TxFifoCtrlReg_o(spi4TxFifoCtrl),
  667. .Spi4RxFifoCtrlReg_o(spi4RxFifoCtrl),
  668. //Spi5
  669. .Spi5CtrlReg_o(spi5Ctrl),
  670. .Spi5ClkReg_o(spi5Clk),
  671. .Spi5CsDelayReg_o(spi5CsDelay),
  672. .Spi5CsCtrlReg_o(spi5CsCtrl),
  673. .Spi5TxFifoCtrlReg_o(spi5TxFifoCtrl),
  674. .Spi5RxFifoCtrlReg_o(spi5RxFifoCtrl),
  675. //Spi6
  676. .Spi6CtrlReg_o(spi6Ctrl),
  677. .Spi6ClkReg_o(spi6Clk),
  678. .Spi6CsDelayReg_o(spi6CsDelay),
  679. .Spi6CsCtrlReg_o(spi6CsCtrl),
  680. .Spi6TxFifoCtrlReg_o(spi6TxFifoCtrl),
  681. .Spi6RxFifoCtrlReg_o(spi6RxFifoCtrl),
  682. .SpiTxRxEnReg_o(spiTxRxEn),
  683. .GPIOAReg_o(GPIOA),
  684. .Led_o(Led_o),
  685. .AnsDataReg_o(ansData)
  686. );
  687. ClkManager #(
  688. .SpiNum(SpiNum),
  689. .STAGES(STAGES)
  690. ) ClkManager
  691. (
  692. .Clk_i(gclk),
  693. .Rst_i(initRst),
  694. .Rst80_i(rst80),
  695. .BaudRate0_i(baudRate[0]),
  696. .BaudRate1_i(baudRate[1]),
  697. .BaudRate2_i(baudRate[2]),
  698. .BaudRate3_i(baudRate[3]),
  699. .BaudRate4_i(baudRate[4]),
  700. .BaudRate5_i(baudRate[5]),
  701. .BaudRate6_i(baudRate[6]),
  702. .Clk80_o(clk80),
  703. .SpiClk_o(spiClkBus)
  704. );
  705. genvar i;
  706. generate
  707. for (i = 0; i < SpiNum; i = i + 1) begin: SpiGen
  708. InitRst InitRst_inst
  709. (
  710. .clk_i(spiClkBus[i]),
  711. .signal_o(initRstGen[i])
  712. );
  713. xpm_cdc_single #(
  714. .DEST_SYNC_FF(3),
  715. .INIT_SYNC_FF(0),
  716. .SIM_ASSERT_CHK(0),
  717. .SRC_INPUT_REG(1)
  718. )
  719. xpm_cdc_single_inst(
  720. .dest_out(ldReg[i]),
  721. .dest_clk(gclk),
  722. .src_clk(spiClkBus[i]),
  723. .src_in(Ld_i[i])
  724. );
  725. Sync1bit#(
  726. .WIDTH(1),
  727. .STAGES(STAGES)
  728. )
  729. Sync1bit_inst(
  730. .ClkFast_i(gclk),
  731. .ClkSlow_i(spiClkBus[i]),
  732. .TxEn_i(txEn[i]),
  733. .RstReg_i(GPIOA[i]),
  734. .TxEn_o(spiTxEnSync[i]),
  735. .RstReg_o(GPIOASync[i])
  736. );
  737. DataFifoWrapper #(
  738. .STAGES(STAGES)
  739. )DataFifoWrapper
  740. (
  741. .WrClk_i(gclk),
  742. .RdClk_i(spiClkBus[i]),
  743. .FifoRxRst_i(fifoRxRst[i]),
  744. .FifoTxRst_i(fifoTxRst[i]),
  745. .FifoRxRstRdPtr_i(fifoRxRstRdPtr[i]),
  746. .FifoTxRstWrPtr_i(fifoTxRstWrPtr[i]),
  747. .SmcAre_i(SmcAre_i),
  748. .SmcAwe_i(SmcAwe_i),
  749. .SmcAddr_i(addrExt),
  750. .ToFifoVal_i(toFifoVal[i]),
  751. .ToFifoRxData_i(dataToRxFifo[i]),
  752. .ToFifoRxWriteVal_i(valToRxFifo[i]),
  753. .ToFifoTxReadVal_i(valToTxFifoRead[i]),
  754. .ToFifoData_i(toFifoData[32*i+:32]),
  755. .TxFifoCtrlReg_o(txFifoCtrlReg[i]),
  756. .RxFifoCtrlReg_o(rxFifoCtrlReg[i]),
  757. .EmptyFlagTx_o(emptyFlagTx[i]),
  758. .DataFromRxFifo_o(dataFromRxFifo[i]),
  759. .ToSpiData_o(toSpiData[i])
  760. );
  761. SPIm SPIm_inst (
  762. .Clk_i(spiClkBus[i]),
  763. .Start_i(spiTxEnSync[i]),
  764. .Rst_i(initRstGen[i]| spiMode[i] | !spiEn[i]),
  765. .EmptyFlag_i(emptyFlagTx[i]),
  766. .SpiData_i(toSpiData[i]),
  767. .Sck_o(sckR[i]),
  768. .Ss_o(ssR[i]),
  769. .Mosi0_o(mosi0R[i]),
  770. .WidthSel_i(widthSel[i]),
  771. .PulsePol_i(clockPol[i]),
  772. .ClockPhase_i(clockPhase[i]),
  773. .EndianSel_i(endianSel[i]),
  774. .Lag_i(lag[i]),
  775. .Lead_i(leadx[i]),
  776. .Stop_i(stopDelay[i]),
  777. .SelSt_i(selSt[i]),
  778. .Val_o(valToTxR[i])
  779. );
  780. SPIs SPIs_inst (
  781. .Clk_i(spiClkBus[i]),
  782. .Rst_i(initRstGen[i] | spiMode[i]),
  783. .Sck_i(sckR[i]),
  784. .Ss_i(ssR[i]),
  785. .Mosi0_i(Mosi1_io[i]),
  786. .WidthSel_i(widthSel[i]),
  787. .EndianSel_i(endianSel[i]),
  788. .SelSt_i(selSt[i]),
  789. .DataToRxFifo_o(dataToRxFifoR[i]),
  790. .Val_o(valToRxR[i])
  791. );
  792. QuadSPIm QuadSPIm_inst (
  793. .Clk_i(spiClkBus[i]),
  794. .Start_i(spiTxEnSync[i]),
  795. .Rst_i(initRstGen[i]| !spiMode[i] | !spiEn[i]),
  796. .EmptyFlag_i(emptyFlagTx[i]),
  797. .SpiData_i(toSpiData[i]),
  798. .Sck_o(sckQ[i]),
  799. .Ss_o(ssQ[i]),
  800. .Mosi0_o(mosi0Q[i]),
  801. .Mosi1_o(mosi1[i]),
  802. .Mosi2_o(mosi2[i]),
  803. .Mosi3_o(mosi3[i]),
  804. .WidthSel_i(widthSel[i]),
  805. .PulsePol_i(clockPol[i]),
  806. .ClockPhase_i(clockPhase[i]),
  807. .EndianSel_i(endianSel[i]),
  808. .Lag_i(lag[i]),
  809. .Lead_i(leadx[i]),
  810. .Stop_i(stopDelay[i]),
  811. .SelSt_i(selSt[i]),
  812. .Val_o(valToTxQ[i])
  813. );
  814. end
  815. endgenerate
  816. //================================================================================
  817. // FOR DEBUG
  818. //================================================================================
  819. // QuadSPIs QuadSPIs (
  820. // .Clk_i(spiClkBus[0]),
  821. // .Rst_i(initRstGen[0] | !spiMode[0]),
  822. // .Sck_i(sckQ[0]),
  823. // .Ss_i(ssQ[0]),
  824. // .Mosi0_i(mosi0Q[0]),
  825. // .Mosi1_i(mosi1[0]),
  826. // .Mosi2_i(mosi2[0]),
  827. // .Mosi3_i(mosi3[0]),
  828. // .WidthSel_i(widthSel[0]),
  829. // .SELST_i(selSt[0]),
  830. // .EndianSel_i(endianSel[0])
  831. // );
  832. InitRst InitRst_inst
  833. (
  834. .clk_i(gclk),
  835. .signal_o(initRst)
  836. );
  837. InitRst Rst80_inst
  838. (
  839. .clk_i(clk80),
  840. .signal_o(rst80)
  841. );
  842. endmodule