S5443_3Top.v 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  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 SpiNum = 7
  26. )
  27. (
  28. input Clk123_i,
  29. input [AddrRegWidth-2:0] SmcAddr_i,
  30. inout [CmdRegWidth/2-1:0] SmcData_io,
  31. input SmcAwe_i,
  32. input SmcAmsN_i,
  33. input SmcAre_i,
  34. input [1:0] SmcBe_i,
  35. input SmcAoe_i,
  36. output [SpiNum-1:0] Ld_o,
  37. output Led_o,
  38. output [SpiNum-1:0] Mosi0_o,
  39. inout [SpiNum-1:0] Mosi1_io,//inout: when RSPI mode, input; when QSPI mode output;
  40. output [SpiNum-1:0] Mosi2_o,
  41. output [SpiNum-1:0] Mosi3_o,
  42. output [SpiNum-1:0] Ss_o,
  43. output [SpiNum-1:0] SsFlash_o,
  44. output [SpiNum-1:0] Sck_o,
  45. output [SpiNum-1:0] SpiRst_o,
  46. output [SpiNum-1:0] SpiDir_o,
  47. output LD_o
  48. );
  49. //================================================================================
  50. // REG/WIRE
  51. //================================================================================
  52. wire Clk100_i;
  53. wire [SpiNum-1:0]sck;
  54. wire [AddrRegWidth-1:0] addr;
  55. wire [SpiNum-1:0] ss;
  56. wire [SpiNum-1:0]mosi0;
  57. wire [SpiNum-1:0]mosi1;
  58. wire [SpiNum-1:0]mosi2;
  59. wire [SpiNum-1:0]mosi3;
  60. wire [SpiNum-1:0] ten;
  61. wire initRst;
  62. wire gclk;
  63. wire [0:7] baudRate [SpiNum-1:0];
  64. wire [0:31] txFifoCtrlReg [SpiNum-1:0];
  65. wire [0:31] rxFifoCtrlReg [SpiNum-1:0];
  66. //InitRst
  67. wire [SpiNum-1:0] initRstGen;
  68. //SPI0
  69. wire [CmdRegWidth-1:0] spi0Ctrl;
  70. wire [CmdRegWidth-1:0] spi0Clk;
  71. wire [CmdRegWidth-1:0] spi0CsDelay;
  72. wire [CmdRegWidth-1:0] spi0CsCtrl;
  73. wire [CmdRegWidth-1:0] spi0TxFifoCtrl;
  74. wire [CmdRegWidth-1:0] spi0RxFifoCtrl;
  75. wire [CmdRegWidth-1:0] spi0TxFifo;
  76. wire [CmdRegWidth-1:0] spi0RxFifo;
  77. wire [CmdRegWidth-1:0] spi0TxFifoCtrlReg;
  78. wire [CmdRegWidth-1:0] spi0RxFifoCtrlReg;
  79. wire [CmdRegWidth-1:0] spi0CtrlRR;
  80. wire [CmdRegWidth-1:0] spi0ClkRR;
  81. wire [CmdRegWidth-1:0] spi0CsDelayRR;
  82. wire [CmdRegWidth-1:0] spi0CsCtrlRR;
  83. wire [CmdRegWidth-1:0] spi0TxFifoCtrlRR;
  84. wire [CmdRegWidth-1:0] spi0RxFifoCtrlRR;
  85. wire [CmdRegWidth/2-1:0] ansDataRR;
  86. //SPI1
  87. wire [CmdRegWidth-1:0] spi1Ctrl;
  88. wire [CmdRegWidth-1:0] spi1Clk;
  89. wire [CmdRegWidth-1:0] spi1CsDelay;
  90. wire [CmdRegWidth-1:0] spi1CsCtrl;
  91. wire [CmdRegWidth-1:0] spi1TxFifoCtrl;
  92. wire [CmdRegWidth-1:0] spi1RxFifoCtrl;
  93. wire [CmdRegWidth-1:0] spi1TxFifo;
  94. wire [CmdRegWidth-1:0] spi1RxFifo;
  95. wire [CmdRegWidth-1:0] spi1TxFifoCtrlReg;
  96. wire [CmdRegWidth-1:0] spi1RxFifoCtrlReg;
  97. //SPI2
  98. wire [CmdRegWidth-1:0] spi2Ctrl;
  99. wire [CmdRegWidth-1:0] spi2Clk;
  100. wire [CmdRegWidth-1:0] spi2CsDelay;
  101. wire [CmdRegWidth-1:0] spi2CsCtrl;
  102. wire [CmdRegWidth-1:0] spi2TxFifoCtrl;
  103. wire [CmdRegWidth-1:0] spi2RxFifoCtrl;
  104. wire [CmdRegWidth-1:0] spi2TxFifoCtrlReg;
  105. wire [CmdRegWidth-1:0] spi2RxFifoCtrlReg;
  106. //SPI3
  107. wire [CmdRegWidth-1:0] spi3Ctrl;
  108. wire [CmdRegWidth-1:0] spi3Clk;
  109. wire [CmdRegWidth-1:0] spi3CsDelay;
  110. wire [CmdRegWidth-1:0] spi3CsCtrl;
  111. wire [CmdRegWidth-1:0] spi3TxFifoCtrl;
  112. wire [CmdRegWidth-1:0] spi3RxFifoCtrl;
  113. wire [CmdRegWidth-1:0] spi3TxFifoCtrlReg;
  114. wire [CmdRegWidth-1:0] spi3RxFifoCtrlReg;
  115. //SPI4
  116. wire [CmdRegWidth-1:0] spi4Ctrl;
  117. wire [CmdRegWidth-1:0] spi4Clk;
  118. wire [CmdRegWidth-1:0] spi4CsDelay;
  119. wire [CmdRegWidth-1:0] spi4CsCtrl;
  120. wire [CmdRegWidth-1:0] spi4TxFifoCtrl;
  121. wire [CmdRegWidth-1:0] spi4RxFifoCtrl;
  122. wire [CmdRegWidth-1:0] spi4TxFifoCtrlReg;
  123. wire [CmdRegWidth-1:0] spi4RxFifoCtrlReg;
  124. //SPI5
  125. wire [CmdRegWidth-1:0] spi5Ctrl;
  126. wire [CmdRegWidth-1:0] spi5Clk;
  127. wire [CmdRegWidth-1:0] spi5CsDelay;
  128. wire [CmdRegWidth-1:0] spi5CsCtrl;
  129. wire [CmdRegWidth-1:0] spi5TxFifoCtrl;
  130. wire [CmdRegWidth-1:0] spi5RxFifoCtrl;
  131. wire [CmdRegWidth-1:0] spi5TxFifoCtrlReg;
  132. wire [CmdRegWidth-1:0] spi5RxFifoCtrlReg;
  133. //SPI6
  134. wire [CmdRegWidth-1:0] spi6Ctrl;
  135. wire [CmdRegWidth-1:0] spi6Clk;
  136. wire [CmdRegWidth-1:0] spi6CsDelay;
  137. wire [CmdRegWidth-1:0] spi6CsCtrl;
  138. wire [CmdRegWidth-1:0] spi6TxFifoCtrl;
  139. wire [CmdRegWidth-1:0] spi6RxFifoCtrl;
  140. wire [CmdRegWidth-1:0] spi6TxFifoCtrlReg;
  141. wire [CmdRegWidth-1:0] spi6RxFifoCtrlReg;
  142. wire [CmdRegWidth-1:0] spiTxRxEn;
  143. wire [CmdRegWidth-1:0] GPIOA;
  144. wire [AddrRegWidth-1:0] toRegMapAddr;
  145. wire [CmdRegWidth/2-1:0] toRegMapData;
  146. wire toRegMapVal;
  147. wire [SpiNum-1:0] toFifoVal;
  148. wire [CmdRegWidth*SpiNum-1:0] toFifoData;
  149. wire [SpiNum-1:0] toSpiVal;
  150. wire [0:31] toSpiData [SpiNum-1:0];
  151. wire [0:1] widthSel [SpiNum-1:0];
  152. wire [SpiNum-1:0] CPOL;
  153. wire [SpiNum-1:0] CPHA;
  154. wire [SpiNum-1:0] endianSel;
  155. wire [SpiNum-1:0] selSt;
  156. wire [SpiNum-1:0] spiMode;
  157. wire [0:5] stopDelay [SpiNum-1:0];
  158. wire [SpiNum-1:0] leadx;
  159. wire [SpiNum-1:0] lag;
  160. wire [SpiNum-1:0] fifoRxRst;
  161. wire [SpiNum-1:0] fifoTxRst;
  162. wire [0:7] wordCntTx [SpiNum-1:0];
  163. wire [0:7] wordCntRx [SpiNum-1:0];
  164. wire [SpiNum-1:0] CS0;
  165. wire [SpiNum-1:0] CS1;
  166. wire [SpiNum-1:0] assel;
  167. wire [SpiNum-1:0] spiClkBus;
  168. wire [SpiNum-1:0] spiSyncRst;
  169. wire [AddrRegWidth-1:0] smcAddr;
  170. wire [CmdRegWidth/2-1:0] smcData;
  171. wire smcVal;
  172. //RxFifo
  173. wire [0:31] dataToRxFifo [SpiNum-1:0];
  174. wire [0:7] addrToRxFifo [SpiNum-1:0];
  175. wire [SpiNum-1:0] valToRxFifo;
  176. wire [SpiNum-1:0] valToTxFifoRead;
  177. // SPI mode choice
  178. wire [SpiNum-1:0] sckR;
  179. wire [SpiNum-1:0] ssR;
  180. wire [SpiNum-1:0] mosi0R;
  181. wire [SpiNum-1:0] valReg;
  182. wire [SpiNum-1:0] valToTxR;
  183. wire [SpiNum-1:0] valToRxR;
  184. wire [0:31] dataToRxFifoR [SpiNum-1:0];
  185. wire [SpiNum-1:0] sckQ;
  186. wire [SpiNum-1:0] ssQ;
  187. wire [SpiNum-1:0] mosi0Q;
  188. wire [SpiNum-1:0] valToTxQ;
  189. wire [SpiNum-1:0] valToRxQ;
  190. wire [0:31] dataToRxFifoQ [SpiNum-1:0];
  191. wire [0:31] dataFromRxFifo [SpiNum-1:0];
  192. wire [CmdRegWidth/2-1:0] muxedData;
  193. wire Clk100_o;
  194. wire Clk40_o;
  195. wire smcValComb;
  196. wire [CmdRegWidth/2-1:0] ansData;
  197. //================================================================================
  198. // ASSIGNMENTS
  199. //================================================================================
  200. assign addr = {SmcAddr_i, 1'b0};
  201. assign smcValComb = (!SmcAmsN_i && !SmcAwe_i) ? 1'b1 : 1'b0;
  202. assign ten = spiTxRxEn[6:0];
  203. assign Mosi1_io[0] =(SpiDir_o[0])?mosi1[0]:1'bz;
  204. assign Mosi1_io[1] =(SpiDir_o[1])?mosi1[1]:1'bz;
  205. assign Mosi1_io[2] =(SpiDir_o[2])?mosi1[2]:1'bz;
  206. assign Mosi1_io[3] =(SpiDir_o[3])?mosi1[3]:1'bz;
  207. assign Mosi1_io[4] =(SpiDir_o[4])?mosi1[4]:1'bz;
  208. assign Mosi1_io[5] =(SpiDir_o[5])?mosi1[5]:1'bz;
  209. assign Mosi1_io[6] =(SpiDir_o[6])?mosi1[6]:1'bz;
  210. assign Mosi2_o = mosi2;
  211. assign Mosi3_o = mosi3;
  212. assign Ss_o[0] = (assel[0])? ((CS0[0])? ss[0]:~ss[0]):CS0[0];
  213. assign Ss_o[1] = (assel[1])? ((CS0[1])? ss[1]:~ss[1]):CS0[1];
  214. assign Ss_o[2] = (assel[2])? ((CS0[2])? ss[2]:~ss[2]):CS0[2];
  215. assign Ss_o[3] = (assel[3])? ((CS0[3])? ss[3]:~ss[3]):CS0[3];
  216. assign Ss_o[4] = (assel[4])? ((CS0[4])? ss[4]:~ss[4]):CS0[4];
  217. assign Ss_o[5] = (assel[5])? ((CS0[5])? ss[5]:~ss[5]):CS0[5];
  218. assign Ss_o[6] = (assel[6])? ((CS0[6])? ss[6]:~ss[6]):CS0[6];
  219. assign SsFlash_o[0] = (assel[0])?(CS1[0]? ss[0]:~ss[0]):CS1[0];
  220. assign SsFlash_o[1] = (assel[1])?(CS1[1]? ss[1]:~ss[1]):CS1[1];
  221. assign SsFlash_o[2] = (assel[2])?(CS1[2]? ss[2]:~ss[2]):CS1[2];
  222. assign SsFlash_o[3] = (assel[3])?(CS1[3]? ss[3]:~ss[3]):CS1[3];
  223. assign SsFlash_o[4] = (assel[4])?(CS1[4]? ss[4]:~ss[4]):CS1[4];
  224. assign SsFlash_o[5] = (assel[5])?(CS1[5]? ss[5]:~ss[5]):CS1[5];
  225. assign SsFlash_o[6] = (assel[6])?(CS1[6]? ss[6]:~ss[6]):CS1[6];
  226. assign Sck_o = sck;
  227. assign widthSel[0] = spi0Ctrl[6:5];
  228. assign widthSel[1] = spi1Ctrl[6:5];
  229. assign widthSel[2] = spi2Ctrl[6:5];
  230. assign widthSel[3] = spi3Ctrl[6:5];
  231. assign widthSel[4] = spi4Ctrl[6:5];
  232. assign widthSel[5] = spi5Ctrl[6:5];
  233. assign widthSel[6] = spi6Ctrl[6:5];
  234. assign spiMode[0] = spi0Ctrl[7];
  235. assign spiMode[1] = spi1Ctrl[7];
  236. assign spiMode[2] = spi2Ctrl[7];
  237. assign spiMode[3] = spi3Ctrl[7];
  238. assign spiMode[4] = spi4Ctrl[7];
  239. assign spiMode[5] = spi5Ctrl[7];
  240. assign spiMode[6] = spi6Ctrl[7];
  241. assign CPOL[0] = spi0Ctrl[2];
  242. assign CPOL[1] = spi1Ctrl[2];
  243. assign CPOL[2] = spi2Ctrl[2];
  244. assign CPOL[3] = spi3Ctrl[2];
  245. assign CPOL[4] = spi4Ctrl[2];
  246. assign CPOL[5] = spi5Ctrl[2];
  247. assign CPOL[6] = spi6Ctrl[2];
  248. assign CPHA[0] = spi0Ctrl[1];
  249. assign CPHA[1] = spi1Ctrl[1];
  250. assign CPHA[2] = spi2Ctrl[1];
  251. assign CPHA[3] = spi3Ctrl[1];
  252. assign CPHA[4] = spi4Ctrl[1];
  253. assign CPHA[5] = spi5Ctrl[1];
  254. assign CPHA[6] = spi6Ctrl[1];
  255. assign endianSel[0] = spi0Ctrl[8];
  256. assign endianSel[1] = spi1Ctrl[8];
  257. assign endianSel[2] = spi2Ctrl[8];
  258. assign endianSel[3] = spi3Ctrl[8];
  259. assign endianSel[4] = spi4Ctrl[8];
  260. assign endianSel[5] = spi5Ctrl[8];
  261. assign endianSel[6] = spi6Ctrl[8];
  262. assign selSt[0] = spi0Ctrl[4];
  263. assign selSt[1] = spi1Ctrl[4];
  264. assign selSt[2] = spi2Ctrl[4];
  265. assign selSt[3] = spi3Ctrl[4];
  266. assign selSt[4] = spi4Ctrl[4];
  267. assign selSt[5] = spi5Ctrl[4];
  268. assign selSt[6] = spi6Ctrl[4];
  269. assign assel[0] = spi0Ctrl[3];
  270. assign assel[1] = spi1Ctrl[3];
  271. assign assel[2] = spi2Ctrl[3];
  272. assign assel[3] = spi3Ctrl[3];
  273. assign assel[4] = spi4Ctrl[3];
  274. assign assel[5] = spi5Ctrl[3];
  275. assign assel[6] = spi6Ctrl[3];
  276. assign stopDelay[0] = spi0CsDelay[7:2];
  277. assign stopDelay[1] = spi1CsDelay[7:2];
  278. assign stopDelay[2] = spi2CsDelay[7:2];
  279. assign stopDelay[3] = spi3CsDelay[7:2];
  280. assign stopDelay[4] = spi4CsDelay[7:2];
  281. assign stopDelay[5] = spi5CsDelay[7:2];
  282. assign stopDelay[6] = spi6CsDelay[7:2];
  283. assign leadx[0] = spi0CsDelay[1];
  284. assign leadx[1] = spi1CsDelay[1];
  285. assign leadx[2] = spi2CsDelay[1];
  286. assign leadx[3] = spi3CsDelay[1];
  287. assign leadx[4] = spi4CsDelay[1];
  288. assign leadx[5] = spi5CsDelay[1];
  289. assign leadx[6] = spi6CsDelay[1];
  290. assign lag[0] = spi0CsDelay[0];
  291. assign lag[1] = spi1CsDelay[0];
  292. assign lag[2] = spi2CsDelay[0];
  293. assign lag[3] = spi3CsDelay[0];
  294. assign lag[4] = spi4CsDelay[0];
  295. assign lag[5] = spi5CsDelay[0];
  296. assign lag[6] = spi6CsDelay[0];
  297. assign baudRate[0] = spi0Clk[7:0];
  298. assign baudRate[1] = spi1Clk[7:0];
  299. assign baudRate[2] = spi2Clk[7:0];
  300. assign baudRate[3] = spi3Clk[7:0];
  301. assign baudRate[4] = spi4Clk[7:0];
  302. assign baudRate[5] = spi5Clk[7:0];
  303. assign baudRate[6] = spi6Clk[7:0];
  304. assign SpiRst_o[0] = GPIOA[0];
  305. assign SpiRst_o[1] = GPIOA[1];
  306. assign SpiRst_o[2] = GPIOA[2];
  307. assign SpiRst_o[3] = GPIOA[3];
  308. assign SpiRst_o[4] = GPIOA[4];
  309. assign SpiRst_o[5] = GPIOA[5];
  310. assign SpiRst_o[6] = GPIOA[6];
  311. assign fifoRxRst[0] = spi0RxFifoCtrl[0];
  312. assign fifoRxRst[1] = spi1RxFifoCtrl[0];
  313. assign fifoRxRst[2] = spi2RxFifoCtrl[0];
  314. assign fifoRxRst[3] = spi3RxFifoCtrl[0];
  315. assign fifoRxRst[4] = spi4RxFifoCtrl[0];
  316. assign fifoRxRst[5] = spi5RxFifoCtrl[0];
  317. assign fifoRxRst[6] = spi6RxFifoCtrl[0];
  318. assign fifoTxRst[0] = spi0TxFifoCtrl[0];
  319. assign fifoTxRst[1] = spi1TxFifoCtrl[0];
  320. assign fifoTxRst[2] = spi2TxFifoCtrl[0];
  321. assign fifoTxRst[3] = spi3TxFifoCtrl[0];
  322. assign fifoTxRst[4] = spi4TxFifoCtrl[0];
  323. assign fifoTxRst[5] = spi5TxFifoCtrl[0];
  324. assign fifoTxRst[6] = spi6TxFifoCtrl[0];
  325. assign Ld_o[0] = GPIOA[16];
  326. assign Ld_o[1] = GPIOA[17];
  327. assign Ld_o[2] = GPIOA[18];
  328. assign Ld_o[3] = GPIOA[19];
  329. assign Ld_o[4] = GPIOA[20];
  330. assign Ld_o[5] = GPIOA[21];
  331. assign Ld_o[6] = GPIOA[22];
  332. assign LD_o = Ld_o[0]&Ld_o[1]&Ld_o[2]&Ld_o[3]&Ld_o[4]&Ld_o[5]&Ld_o[6];
  333. assign wordCntRx[0] = spi0RxFifoCtrl[15:8];
  334. assign wordCntRx[1] = spi1RxFifoCtrl[15:8];
  335. assign wordCntRx[2] = spi2RxFifoCtrl[15:8];
  336. assign wordCntRx[3] = spi3RxFifoCtrl[15:8];
  337. assign wordCntRx[4] = spi4RxFifoCtrl[15:8];
  338. assign wordCntRx[5] = spi5RxFifoCtrl[15:8];
  339. assign wordCntRx[6] = spi6RxFifoCtrl[15:8];
  340. assign wordCntTx[0] = spi0TxFifoCtrl[15:8];
  341. assign wordCntTx[1] = spi1TxFifoCtrl[15:8];
  342. assign wordCntTx[2] = spi2TxFifoCtrl[15:8];
  343. assign wordCntTx[3] = spi3TxFifoCtrl[15:8];
  344. assign wordCntTx[4] = spi4TxFifoCtrl[15:8];
  345. assign wordCntTx[5] = spi5TxFifoCtrl[15:8];
  346. assign wordCntTx[6] = spi6TxFifoCtrl[15:8];
  347. assign CS0[0] = spi0CsCtrl[0];
  348. assign CS0[1] = spi1CsCtrl[0];
  349. assign CS0[2] = spi2CsCtrl[0];
  350. assign CS0[3] = spi3CsCtrl[0];
  351. assign CS0[4] = spi4CsCtrl[0];
  352. assign CS0[5] = spi5CsCtrl[0];
  353. assign CS0[6] = spi6CsCtrl[0];
  354. assign CS1[0] = spi0CsCtrl[1];
  355. assign CS1[1] = spi1CsCtrl[1];
  356. assign CS1[2] = spi2CsCtrl[1];
  357. assign CS1[3] = spi3CsCtrl[1];
  358. assign CS1[4] = spi4CsCtrl[1];
  359. assign CS1[5] = spi5CsCtrl[1];
  360. assign CS1[6] = spi6CsCtrl[1];
  361. assign ss[0] = (spiMode[0])? ssQ[0]:ssR[0];
  362. assign ss[1] = (spiMode[1])? ssQ[1]:ssR[1];
  363. assign ss[2] = (spiMode[2])? ssQ[2]:ssR[2];
  364. assign ss[3] = (spiMode[3])? ssQ[3]:ssR[3];
  365. assign ss[4] = (spiMode[4])? ssQ[4]:ssR[4];
  366. assign ss[5] = (spiMode[5])? ssQ[5]:ssR[5];
  367. assign ss[6] = (spiMode[6])? ssQ[6]:ssR[6];
  368. assign SpiDir_o[0] = (spiMode[0])? 1'b1 : 1'b0 ;
  369. assign SpiDir_o[1] = (spiMode[1])? 1'b1 : 1'b0 ;
  370. assign SpiDir_o[2] = (spiMode[2])? 1'b1 : 1'b0 ;
  371. assign SpiDir_o[3] = (spiMode[3])? 1'b1 : 1'b0 ;
  372. assign SpiDir_o[4] = (spiMode[4])? 1'b1 : 1'b0 ;
  373. assign SpiDir_o[5] = (spiMode[5])? 1'b1 : 1'b0 ;
  374. assign SpiDir_o[6] = (spiMode[6])? 1'b1 : 1'b0 ;
  375. assign sck[0] = (spiMode[0])?sckQ[0]:sckR[0];
  376. assign sck[1] = (spiMode[1])?sckQ[1]:sckR[1];
  377. assign sck[2] = (spiMode[2])?sckQ[2]:sckR[2];
  378. assign sck[3] = (spiMode[3])?sckQ[3]:sckR[3];
  379. assign sck[4] = (spiMode[4])?sckQ[4]:sckR[4];
  380. assign sck[5] = (spiMode[5])?sckQ[5]:sckR[5];
  381. assign sck[6] = (spiMode[6])?sckQ[6]:sckR[6];
  382. assign mosi0[0] = (spiMode[0])?mosi0Q[0]:mosi0R[0];
  383. assign mosi0[1] = (spiMode[1])?mosi0Q[1]:mosi0R[1];
  384. assign mosi0[2] = (spiMode[2])?mosi0Q[2]:mosi0R[2];
  385. assign mosi0[3] = (spiMode[3])?mosi0Q[3]:mosi0R[3];
  386. assign mosi0[4] = (spiMode[4])?mosi0Q[4]:mosi0R[4];
  387. assign mosi0[5] = (spiMode[5])?mosi0Q[5]:mosi0R[5];
  388. assign mosi0[6] = (spiMode[6])?mosi0Q[6]:mosi0R[6];
  389. assign Mosi0_o[0] = mosi0[0];
  390. assign Mosi0_o[1] = mosi0[1];
  391. assign Mosi0_o[2] = mosi0[2];
  392. assign Mosi0_o[3] = mosi0[3];
  393. assign Mosi0_o[4] = mosi0[4];
  394. assign Mosi0_o[5] = mosi0[5];
  395. assign Mosi0_o[6] = mosi0[6];
  396. assign valToTxFifoRead[0] = (spiMode[0])?valToTxQ[0]:valToTxR[0];
  397. assign valToTxFifoRead[1] = (spiMode[1])?valToTxQ[1]:valToTxR[1];
  398. assign valToTxFifoRead[2] = (spiMode[2])?valToTxQ[2]:valToTxR[2];
  399. assign valToTxFifoRead[3] = (spiMode[3])?valToTxQ[3]:valToTxR[3];
  400. assign valToTxFifoRead[4] = (spiMode[4])?valToTxQ[4]:valToTxR[4];
  401. assign valToTxFifoRead[5] = (spiMode[5])?valToTxQ[5]:valToTxR[5];
  402. assign valToTxFifoRead[6] = (spiMode[6])?valToTxQ[6]:valToTxR[6];
  403. assign valToRxFifo[0] = valToRxR[0];
  404. assign valToRxFifo[1] = valToRxR[1];
  405. assign valToRxFifo[2] = valToRxR[2];
  406. assign valToRxFifo[3] = valToRxR[3];
  407. assign valToRxFifo[4] = valToRxR[4];
  408. assign valToRxFifo[5] = valToRxR[5];
  409. assign valToRxFifo[6] = valToRxR[6];
  410. assign dataToRxFifo[0] = dataToRxFifoR[0];
  411. assign dataToRxFifo[1] = dataToRxFifoR[1];
  412. assign dataToRxFifo[2] = dataToRxFifoR[2];
  413. assign dataToRxFifo[3] = dataToRxFifoR[3];
  414. assign dataToRxFifo[4] = dataToRxFifoR[4];
  415. assign dataToRxFifo[5] = dataToRxFifoR[5];
  416. assign dataToRxFifo[6] = dataToRxFifoR[6];
  417. assign spi0TxFifoCtrlReg = txFifoCtrlReg[0];
  418. assign spi1TxFifoCtrlReg = txFifoCtrlReg[1];
  419. assign spi2TxFifoCtrlReg = txFifoCtrlReg[2];
  420. assign spi3TxFifoCtrlReg = txFifoCtrlReg[3];
  421. assign spi4TxFifoCtrlReg = txFifoCtrlReg[4];
  422. assign spi5TxFifoCtrlReg = txFifoCtrlReg[5];
  423. assign spi6TxFifoCtrlReg = txFifoCtrlReg[6];
  424. assign spi0RxFifoCtrlReg = rxFifoCtrlReg[0];
  425. assign spi1RxFifoCtrlReg = rxFifoCtrlReg[1];
  426. assign spi2RxFifoCtrlReg = rxFifoCtrlReg[2];
  427. assign spi3RxFifoCtrlReg = rxFifoCtrlReg[3];
  428. assign spi4RxFifoCtrlReg = rxFifoCtrlReg[4];
  429. assign spi5RxFifoCtrlReg = rxFifoCtrlReg[5];
  430. assign spi6RxFifoCtrlReg = rxFifoCtrlReg[6];
  431. assign SmcData_io = (!SmcAre_i && !SmcAoe_i)?muxedData:16'bz;
  432. //================================================================================
  433. // CODING
  434. //================================================================================
  435. DataOutMux DataOutMuxer
  436. (
  437. // .Rst_i (initRst),
  438. .Clk_i (gclk),
  439. .Addr_i (addr),
  440. .ToRegMapAddr_i (toRegMapAddr),
  441. .FifoRxRst_i(fifoRxRst[0]),
  442. .DataFromRegMap_i (ansData),
  443. .SmcAre_i (SmcAre_i),
  444. .DataFromRxFifo1_i (dataFromRxFifo[0]),
  445. .DataFromRxFifo2_i (dataFromRxFifo[1]),
  446. .DataFromRxFifo3_i (dataFromRxFifo[2]),
  447. .DataFromRxFifo4_i (dataFromRxFifo[3]),
  448. .DataFromRxFifo5_i (dataFromRxFifo[4]),
  449. .DataFromRxFifo6_i (dataFromRxFifo[5]),
  450. .DataFromRxFifo7_i (dataFromRxFifo[6]),
  451. .AnsData_o (muxedData)
  452. );
  453. BUFG BUFG_inst (
  454. .O(gclk), // 1-bit output: Clock output
  455. .I(Clk123_i) // 1-bit input: Clock input
  456. );
  457. DataMuxer DataMuxer
  458. (
  459. .Clk_i (gclk),
  460. .Rst_i (initRst),
  461. .SmcVal_i (smcValComb),
  462. .SmcData_i (SmcData_io),
  463. .SmcAddr_i (addr),
  464. .ToRegMapVal_o (toRegMapVal),
  465. .ToRegMapData_o (toRegMapData),
  466. .ToRegMapAddr_o (toRegMapAddr),
  467. .ToFifoVal_o (toFifoVal),
  468. .ToFifoData_o (toFifoData)
  469. );
  470. RegMap
  471. #(
  472. .CmdRegWidth(32),
  473. .AddrRegWidth(12)
  474. )
  475. RegMap_inst
  476. (
  477. .Clk_i(gclk),
  478. .Rst_i(initRst),
  479. .Data_i(toRegMapData),
  480. .Addr_i(toRegMapAddr),
  481. .Val_i(toRegMapVal),
  482. .SmcBe_i(SmcBe_i),
  483. .TxFifoCtrlReg0_i(spi0TxFifoCtrlReg),
  484. .TxFifoCtrlReg1_i(spi1TxFifoCtrlReg),
  485. .TxFifoCtrlReg2_i(spi2TxFifoCtrlReg),
  486. .TxFifoCtrlReg3_i(spi3TxFifoCtrlReg),
  487. .TxFifoCtrlReg4_i(spi4TxFifoCtrlReg),
  488. .TxFifoCtrlReg5_i(spi5TxFifoCtrlReg),
  489. .TxFifoCtrlReg6_i(spi6TxFifoCtrlReg),
  490. .RxFifoCtrlReg0_i(spi0RxFifoCtrlReg),
  491. .RxFifoCtrlReg1_i(spi1RxFifoCtrlReg),
  492. .RxFifoCtrlReg2_i(spi2RxFifoCtrlReg),
  493. .RxFifoCtrlReg3_i(spi3RxFifoCtrlReg),
  494. .RxFifoCtrlReg4_i(spi4RxFifoCtrlReg),
  495. .RxFifoCtrlReg5_i(spi5RxFifoCtrlReg),
  496. .RxFifoCtrlReg6_i(spi6RxFifoCtrlReg),
  497. .Led_o(Led_o),
  498. .AnsDataReg_o(ansData),
  499. //Spi0
  500. .Spi0CtrlReg_o(spi0Ctrl),
  501. .Spi0ClkReg_o(spi0Clk),
  502. .Spi0CsDelayReg_o(spi0CsDelay),
  503. .Spi0CsCtrlReg_o(spi0CsCtrl),
  504. .Spi0TxFifoCtrlReg_o(spi0TxFifoCtrl),
  505. .Spi0RxFifoCtrlReg_o(spi0RxFifoCtrl),
  506. //Spi1
  507. .Spi1CtrlReg_o(spi1Ctrl),
  508. .Spi1ClkReg_o(spi1Clk),
  509. .Spi1CsDelayReg_o(spi1CsDelay),
  510. .Spi1CsCtrlReg_o(spi1CsCtrl),
  511. .Spi1TxFifoCtrlReg_o(spi1TxFifoCtrl),
  512. .Spi1RxFifoCtrlReg_o(spi1RxFifoCtrl),
  513. //Spi2
  514. .Spi2CtrlReg_o(spi2Ctrl),
  515. .Spi2ClkReg_o(spi2Clk),
  516. .Spi2CsDelayReg_o(spi2CsDelay),
  517. .Spi2CsCtrlReg_o(spi2CsCtrl),
  518. .Spi2TxFifoCtrlReg_o(spi2TxFifoCtrl),
  519. .Spi2RxFifoCtrlReg_o(spi2RxFifoCtrl),
  520. //Spi3
  521. .Spi3CtrlReg_o(spi3Ctrl),
  522. .Spi3ClkReg_o(spi3Clk),
  523. .Spi3CsDelayReg_o(spi3CsDelay),
  524. .Spi3CsCtrlReg_o(spi3CsCtrl),
  525. .Spi3TxFifoCtrlReg_o(spi3TxFifoCtrl),
  526. .Spi3RxFifoCtrlReg_o(spi3RxFifoCtrl),
  527. //Spi4
  528. .Spi4CtrlReg_o(spi4Ctrl),
  529. .Spi4ClkReg_o(spi4Clk),
  530. .Spi4CsDelayReg_o(spi4CsDelay),
  531. .Spi4CsCtrlReg_o(spi4CsCtrl),
  532. .Spi4TxFifoCtrlReg_o(spi4TxFifoCtrl),
  533. .Spi4RxFifoCtrlReg_o(spi4RxFifoCtrl),
  534. //Spi5
  535. .Spi5CtrlReg_o(spi5Ctrl),
  536. .Spi5ClkReg_o(spi5Clk),
  537. .Spi5CsDelayReg_o(spi5CsDelay),
  538. .Spi5CsCtrlReg_o(spi5CsCtrl),
  539. .Spi5TxFifoCtrlReg_o(spi5TxFifoCtrl),
  540. .Spi5RxFifoCtrlReg_o(spi5RxFifoCtrl),
  541. //Spi6
  542. .Spi6CtrlReg_o(spi6Ctrl),
  543. .Spi6ClkReg_o(spi6Clk),
  544. .Spi6CsDelayReg_o(spi6CsDelay),
  545. .Spi6CsCtrlReg_o(spi6CsCtrl),
  546. .Spi6TxFifoCtrlReg_o(spi6TxFifoCtrl),
  547. .Spi6RxFifoCtrlReg_o(spi6RxFifoCtrl),
  548. .SpiTxRxEnReg_o(spiTxRxEn),
  549. .GPIOAReg_o(GPIOA)
  550. );
  551. MmcmWrapper #(
  552. .SpiNum(SpiNum)
  553. ) MainMmcm
  554. (
  555. .Clk_i (gclk),
  556. .Rst_i (initRst),
  557. .BaudRate0_i(baudRate[0]),
  558. .BaudRate1_i(baudRate[1]),
  559. .BaudRate2_i(baudRate[2]),
  560. .BaudRate3_i(baudRate[3]),
  561. .BaudRate4_i(baudRate[4]),
  562. .BaudRate5_i(baudRate[5]),
  563. .BaudRate6_i(baudRate[6]),
  564. .SpiClk_o (spiClkBus)
  565. );
  566. genvar i;
  567. generate
  568. for (i = 0; i < SpiNum; i = i + 1) begin: SpiGen
  569. InitRst InitRst_inst
  570. (
  571. .clk_i(spiClkBus[i]),
  572. .signal_o(initRstGen[i])
  573. );
  574. DataFifoWrapper DataFifoWrapper
  575. (
  576. .WrClk_i (gclk),
  577. .RdClk_i (spiClkBus[i]),
  578. .FifoRxRst_i (fifoRxRst[i]),
  579. .FifoTxRst_i (fifoTxRst[i]),
  580. .SmcAre_i (SmcAre_i),
  581. .SmcAwe_i (SmcAwe_i),
  582. .SmcAddr_i (addr),
  583. .TxFifoWrdCnt_i (wordCntTx[i]),
  584. .RxFifoWrdCnt_i (wordCntRx[i]),
  585. .ToFifoVal_i (toFifoVal[i]),
  586. .ToFifoRxData_i (dataToRxFifo[i]),
  587. .ToFifoRxWriteVal_i (valToRxFifo[i]),
  588. .ToFifoTxReadVal_i (valToTxFifoRead[i]),
  589. .ToFifoData_i (toFifoData[32*i+:32]),
  590. .TxFifoCtrlReg_o (txFifoCtrlReg[i]),
  591. .RxFifoCtrlReg_o (rxFifoCtrlReg[i]),
  592. .ToSpiVal_o (toSpiVal[i]),
  593. .DataFromRxFifo_o (dataFromRxFifo[i]),
  594. .ToSpiData_o (toSpiData[i])
  595. );
  596. SPIm SPIm_inst (
  597. .Clk_i(spiClkBus[i]),
  598. .Start_i(ten[i]),
  599. .Rst_i(initRstGen[i]| spiMode[i]),
  600. .SPIdata(toSpiData[i]),
  601. .Sck_o(sckR[i]),
  602. .Ss_o(ssR[i]),
  603. .Mosi0_o(mosi0R[i]),
  604. .WidthSel_i(widthSel[i]),
  605. .PulsePol_i(CPOL[i]),
  606. .CPHA_i(CPHA[i]),
  607. .EndianSel_i(endianSel[i]),
  608. .LAG_i(lag[i]),
  609. .LEAD_i(leadx[i]),
  610. .Stop_i(stopDelay[i]),
  611. .SELST_i(selSt[i]),
  612. .Val_o(valToTxR[i])
  613. );
  614. SPIs SPIs_inst (
  615. .Clk_i(spiClkBus[i]),
  616. .Rst_i(initRstGen[i]|SpiRst_o[i]| spiMode[i]),
  617. .Sck_i(sckR[i]),
  618. .Ss_i(ssR[i]),
  619. .Mosi0_i(Mosi1_io[i]),
  620. .WidthSel_i(widthSel[i]),
  621. .SELST_i(selSt[i]),
  622. .DataToRxFifo_o(dataToRxFifoR[i]),
  623. .Val_o(valToRxR[i])
  624. );
  625. QuadSPIm QuadSPIm_inst (
  626. .Clk_i(spiClkBus[i]),
  627. .Start_i(ten[i]),
  628. .Rst_i(initRstGen[i]| !spiMode[i]),
  629. .SpiDataVal_i (toSpiVal),
  630. // .SPIdata(32'h2aaa00aa),
  631. .SPIdata(toSpiData[i]),
  632. .Sck_o(sckQ[i]),
  633. .Ss_o(ssQ[i]),
  634. .Mosi0_i(mosi0Q[i]),
  635. .Mosi1_i(mosi1[i]),
  636. .Mosi2_i(mosi2[i]),
  637. .Mosi3_i(mosi3[i]),
  638. .WidthSel_i(widthSel[i]),
  639. .PulsePol_i(CPOL[i]),
  640. .CPHA_i(CPHA[i]),
  641. .EndianSel_i(endianSel[i]),
  642. .LAG_i(lag[i]),
  643. .LEAD_i(leadx[i]),
  644. .Stop_i(stopDelay[i]),
  645. .SELST_i(selSt[i]),
  646. .Val_o(valToTxQ[i])
  647. );
  648. // QuadSPIs QuadSPIs_inst (
  649. // .Clk_i(Clk40_o),
  650. // .Rst_i(initRstGen[i]|SpiRst_o[i]| !spiMode[i]),
  651. // .Sck_i(sckQ[i]),
  652. // .Ss_i(ssQ[i]),
  653. // .Mosi0_i(mosi0Q[i]),
  654. // .Mosi1_i(mosi1[i]),
  655. // .Mosi2_i(mosi2[i]),
  656. // .Mosi3_i(mosi3[i]),
  657. // .WidthSel_i(widthSel[i]),
  658. // .SELST_i(selSt[i]),
  659. // .DataToRxFifo_o(dataToRxFifoQ[i]),
  660. // .Val_o(valToRxQ[i])
  661. // );
  662. end
  663. endgenerate
  664. InitRst InitRst_inst
  665. (
  666. .clk_i(gclk),
  667. .signal_o(initRst)
  668. );
  669. endmodule