QuadSPIm.v 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: QuadSPIm
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description: This is module implements QuadSpi Master protocol. For more info refer
  12. // to the techincal reference manual.
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 1.0 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module QuadSPIm
  22. (
  23. input Clk_i,
  24. input Rst_i,
  25. input Start_i,
  26. input EmptyFlag_i,
  27. input ClockPhase_i,
  28. input [31:0] SpiData_i,
  29. input SelSt_i,
  30. input [1:0] WidthSel_i,
  31. input Lag_i,
  32. input Lead_i,
  33. input EndianSel_i,
  34. input [5:0] Stop_i,
  35. input PulsePol_i,
  36. output reg Mosi0_o,
  37. output reg Mosi1_o,
  38. output reg Mosi2_o,
  39. output reg Mosi3_o,
  40. output reg Sck_o,
  41. output reg Val_o,
  42. output Ss_o
  43. );
  44. //================================================================================
  45. // REG/WIRE
  46. //================================================================================
  47. reg startFlag;
  48. reg startR;
  49. reg [31:0] trCnt;
  50. reg valReg;
  51. reg lineBusy;
  52. reg [5:0] ssCnt;
  53. reg ss;
  54. reg ssR;
  55. reg oldDataFlag;
  56. reg [7:0] mosiReg0;
  57. reg [7:0] mosiReg1;
  58. reg [7:0] mosiReg2;
  59. reg [7:0] mosiReg3;
  60. reg [3:0] ssNum;
  61. reg [2:0] delayCnt;
  62. reg stopFlag;
  63. reg rstReg;
  64. wire [31:0] txLenght = ssNum+Lag_i+Lead_i;
  65. //================================================================================
  66. // ASSIGNMENTS
  67. //================================================================================
  68. assign Ss_o = ss;
  69. //================================================================================
  70. // CODING
  71. //================================================================================
  72. always @(posedge Clk_i) begin
  73. rstReg <= Rst_i;
  74. end
  75. always @(*) begin
  76. if (Start_i) begin
  77. Val_o = valReg;
  78. end
  79. else begin
  80. Val_o = 1'b0;
  81. end
  82. end
  83. always @(*) begin
  84. if (SelSt_i) begin
  85. if (!ss) begin
  86. lineBusy = 1'b1;
  87. end
  88. else begin
  89. lineBusy = 1'b0;
  90. end
  91. end
  92. else begin
  93. if (ss) begin
  94. lineBusy = 1'b1;
  95. end
  96. else begin
  97. lineBusy = 1'b0;
  98. end
  99. end
  100. end
  101. always @(negedge Clk_i) begin
  102. if (rstReg) begin
  103. delayCnt <= 1'b0;
  104. end else begin
  105. if (stopFlag) begin
  106. delayCnt <= delayCnt + 1'b1;
  107. end else begin
  108. delayCnt <= 0;
  109. end
  110. end
  111. end
  112. always @(posedge Clk_i) begin
  113. if (rstReg) begin
  114. stopFlag <= 1'b0;
  115. end
  116. else begin
  117. if (Stop_i != 0) begin
  118. if (Stop_i == 1) begin
  119. stopFlag <= 1'b0;
  120. end
  121. else begin
  122. if (SelSt_i) begin
  123. if (ss && !ssR) begin
  124. stopFlag <= 1'b1;
  125. end
  126. else if (delayCnt == Stop_i-1) begin
  127. stopFlag <= 1'b0;
  128. end
  129. end
  130. else begin
  131. if (!ss && ssR) begin
  132. stopFlag <= 1'b1;
  133. end
  134. else if (delayCnt == Stop_i-1) begin
  135. stopFlag <= 1'b0;
  136. end
  137. end
  138. end
  139. end else begin
  140. stopFlag <= 1'b0;
  141. end
  142. end
  143. end
  144. reg [2:0] clkCtrlReg;
  145. always @(*) begin
  146. if (rstReg) begin
  147. clkCtrlReg = 0;
  148. end else begin
  149. clkCtrlReg = {SelSt_i,PulsePol_i,ClockPhase_i};
  150. end
  151. end
  152. always @(*) begin
  153. if (rstReg) begin
  154. Sck_o = 0;
  155. end else begin
  156. if (Stop_i!=0) begin
  157. case (clkCtrlReg)
  158. 0: begin
  159. if (!Lag_i) begin
  160. if (!Lead_i) begin
  161. if (ss) begin
  162. Sck_o = Clk_i;
  163. end else begin
  164. Sck_o = 0;
  165. end
  166. end else begin
  167. if (ssCnt < txLenght-1) begin
  168. Sck_o = Clk_i;
  169. end else begin
  170. Sck_o = 0;
  171. end
  172. end
  173. end else begin
  174. if (!Lead_i) begin
  175. if (ssCnt > 0) begin
  176. Sck_o = Clk_i;
  177. end else begin
  178. Sck_o = 0;
  179. end
  180. end else begin
  181. if (ssCnt >0 && ssCnt < txLenght-1) begin
  182. Sck_o = Clk_i;
  183. end else begin
  184. Sck_o = 0;
  185. end
  186. end
  187. end
  188. end
  189. 1: begin
  190. if (!Lag_i) begin
  191. if (!Lead_i) begin
  192. if (ss) begin
  193. Sck_o = !Clk_i;
  194. end else begin
  195. Sck_o = 0;
  196. end
  197. end else begin
  198. if (ssCnt < txLenght-1) begin
  199. Sck_o = !Clk_i;
  200. end else begin
  201. Sck_o = 0;
  202. end
  203. end
  204. end else begin
  205. if (!Lead_i) begin
  206. if (ssCnt > 0) begin
  207. Sck_o = !Clk_i;
  208. end else begin
  209. Sck_o = 0;
  210. end
  211. end else begin
  212. if (ssCnt >0 && ssCnt < txLenght-1) begin
  213. Sck_o = !Clk_i;
  214. end else begin
  215. Sck_o = 0;
  216. end
  217. end
  218. end
  219. end
  220. 2: begin
  221. if (!Lag_i) begin
  222. if (!Lead_i) begin
  223. if (ss) begin
  224. Sck_o = !Clk_i;
  225. end else begin
  226. Sck_o = 0;
  227. end
  228. end else begin
  229. if (ssCnt < txLenght-1) begin
  230. Sck_o = !Clk_i;
  231. end else begin
  232. Sck_o = 0;
  233. end
  234. end
  235. end else begin
  236. if (!Lead_i) begin
  237. if (ssCnt > 0) begin
  238. Sck_o = !Clk_i;
  239. end else begin
  240. Sck_o = 0;
  241. end
  242. end else begin
  243. if (ssCnt >0 && ssCnt < txLenght-1) begin
  244. Sck_o = !Clk_i;
  245. end else begin
  246. Sck_o = 0;
  247. end
  248. end
  249. end
  250. end
  251. 3: begin
  252. if (!Lag_i) begin
  253. if (!Lead_i) begin
  254. if (ss) begin
  255. Sck_o = Clk_i;
  256. end else begin
  257. Sck_o = 0;
  258. end
  259. end else begin
  260. if (ssCnt < txLenght-1) begin
  261. Sck_o = Clk_i;
  262. end else begin
  263. Sck_o = 0;
  264. end
  265. end
  266. end else begin
  267. if (!Lead_i) begin
  268. if (ssCnt > 0) begin
  269. Sck_o = Clk_i;
  270. end else begin
  271. Sck_o = 0;
  272. end
  273. end else begin
  274. if (ssCnt >0 && ssCnt < txLenght-1) begin
  275. Sck_o = Clk_i;
  276. end else begin
  277. Sck_o = 0;
  278. end
  279. end
  280. end
  281. end
  282. 4: begin
  283. if (!Lag_i) begin
  284. if (!Lead_i) begin
  285. if (!ss) begin
  286. Sck_o = Clk_i;
  287. end else begin
  288. Sck_o = 0;
  289. end
  290. end else begin
  291. if (ssCnt < txLenght-1) begin
  292. Sck_o = Clk_i;
  293. end else begin
  294. Sck_o = 0;
  295. end
  296. end
  297. end else begin
  298. if (!Lead_i) begin
  299. if (ssCnt > 0) begin
  300. Sck_o = Clk_i;
  301. end else begin
  302. Sck_o = 0;
  303. end
  304. end else begin
  305. if (ssCnt >0 && ssCnt < txLenght-1) begin
  306. Sck_o = Clk_i;
  307. end else begin
  308. Sck_o = 0;
  309. end
  310. end
  311. end
  312. end
  313. 5: begin
  314. if (!Lag_i) begin
  315. if (!Lead_i) begin
  316. if (!ss) begin
  317. Sck_o = !Clk_i;
  318. end else begin
  319. Sck_o = 0;
  320. end
  321. end else begin
  322. if (ssCnt < txLenght-1) begin
  323. Sck_o = !Clk_i;
  324. end else begin
  325. Sck_o = 0;
  326. end
  327. end
  328. end else begin
  329. if (!Lead_i) begin
  330. if (ssCnt > 0) begin
  331. Sck_o = !Clk_i;
  332. end else begin
  333. Sck_o = 0;
  334. end
  335. end else begin
  336. if (ssCnt >0 && ssCnt < txLenght-1) begin
  337. Sck_o = !Clk_i;
  338. end else begin
  339. Sck_o = 0;
  340. end
  341. end
  342. end
  343. end
  344. 6: begin
  345. if (!Lag_i) begin
  346. if (!Lead_i) begin
  347. if (!ss) begin
  348. Sck_o = !Clk_i;
  349. end else begin
  350. Sck_o = 0;
  351. end
  352. end else begin
  353. if (ssCnt < txLenght-1) begin
  354. Sck_o = !Clk_i;
  355. end else begin
  356. Sck_o = 0;
  357. end
  358. end
  359. end else begin
  360. if (!Lead_i) begin
  361. if (ssCnt > 0) begin
  362. Sck_o = !Clk_i;
  363. end else begin
  364. Sck_o = 0;
  365. end
  366. end else begin
  367. if (ssCnt >0 && ssCnt < txLenght-1) begin
  368. Sck_o = !Clk_i;
  369. end else begin
  370. Sck_o = 0;
  371. end
  372. end
  373. end
  374. end
  375. 7: begin
  376. if (!Lag_i) begin
  377. if (!Lead_i) begin
  378. if (!ss) begin
  379. Sck_o = Clk_i;
  380. end else begin
  381. Sck_o = 0;
  382. end
  383. end else begin
  384. if (ssCnt < txLenght-1) begin
  385. Sck_o = Clk_i;
  386. end else begin
  387. Sck_o = 0;
  388. end
  389. end
  390. end else begin
  391. if (!Lead_i) begin
  392. if (ssCnt > 0) begin
  393. Sck_o = Clk_i;
  394. end else begin
  395. Sck_o = 0;
  396. end
  397. end else begin
  398. if (ssCnt >0 && ssCnt < txLenght-1) begin
  399. Sck_o = Clk_i;
  400. end else begin
  401. Sck_o = 0;
  402. end
  403. end
  404. end
  405. end
  406. endcase
  407. end else begin
  408. if (SelSt_i) begin
  409. if (!ss) begin
  410. if (PulsePol_i) begin
  411. if (ClockPhase_i) begin
  412. Sck_o = Clk_i;
  413. end
  414. else begin
  415. Sck_o = ~Clk_i;
  416. end
  417. end else begin
  418. if (ClockPhase_i) begin
  419. Sck_o = ~Clk_i;
  420. end
  421. else begin
  422. Sck_o = Clk_i;
  423. end
  424. end
  425. end else begin
  426. Sck_o = 1'b0;
  427. end
  428. end else begin
  429. if (ss) begin
  430. if (PulsePol_i) begin
  431. if (ClockPhase_i) begin
  432. Sck_o = Clk_i;
  433. end
  434. else begin
  435. Sck_o = ~Clk_i;
  436. end
  437. end else begin
  438. if (ClockPhase_i) begin
  439. Sck_o = ~Clk_i;
  440. end
  441. else begin
  442. Sck_o = Clk_i;
  443. end
  444. end
  445. end else begin
  446. Sck_o = 1'b0;
  447. end
  448. end
  449. end
  450. end
  451. end
  452. always @(*) begin
  453. if (SelSt_i) begin
  454. if (EndianSel_i) begin
  455. case (WidthSel_i)
  456. 0 : begin
  457. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  458. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  459. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  460. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  461. end
  462. 1 : begin
  463. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  464. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  465. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  466. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  467. end
  468. 2 : begin
  469. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  470. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  471. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  472. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  473. end
  474. 3 : begin
  475. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  476. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  477. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  478. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  479. end
  480. endcase
  481. end
  482. else begin
  483. case (WidthSel_i)
  484. 0 : begin
  485. Mosi0_o = (!ss)? (mosiReg0[1]):1'b0;
  486. Mosi1_o = (!ss)? (mosiReg1[1]):1'b0;
  487. Mosi2_o = (!ss)? (mosiReg2[1]):1'b0;
  488. Mosi3_o = (!ss)? (mosiReg3[1]):1'b0;
  489. end
  490. 1 : begin
  491. Mosi0_o = (!ss)? (mosiReg0[3]):1'b0;
  492. Mosi1_o = (!ss)? (mosiReg1[3]):1'b0;
  493. Mosi2_o = (!ss)? (mosiReg2[3]):1'b0;
  494. Mosi3_o = (!ss)? (mosiReg3[3]):1'b0;
  495. end
  496. 2 : begin
  497. Mosi0_o = (!ss)? (mosiReg0[5]):1'b0;
  498. Mosi1_o = (!ss)? (mosiReg1[5]):1'b0;
  499. Mosi2_o = (!ss)? (mosiReg2[5]):1'b0;
  500. Mosi3_o = (!ss)? (mosiReg3[5]):1'b0;
  501. end
  502. 3 : begin
  503. Mosi0_o = (!ss)? (mosiReg0[7]):1'b0;
  504. Mosi1_o = (!ss)? (mosiReg1[7]):1'b0;
  505. Mosi2_o = (!ss)? (mosiReg2[7]):1'b0;
  506. Mosi3_o = (!ss)? (mosiReg3[7]):1'b0;
  507. end
  508. endcase
  509. end
  510. end
  511. else begin
  512. if (EndianSel_i) begin
  513. case (WidthSel_i)
  514. 0 : begin
  515. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  516. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  517. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  518. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  519. end
  520. 1 : begin
  521. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  522. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  523. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  524. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  525. end
  526. 2 : begin
  527. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  528. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  529. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  530. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  531. end
  532. 3 : begin
  533. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  534. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  535. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  536. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  537. end
  538. endcase
  539. end
  540. else begin
  541. case (WidthSel_i)
  542. 0 : begin
  543. Mosi0_o = (ss)? (mosiReg0[1]):1'b0;
  544. Mosi1_o = (ss)? (mosiReg1[1]):1'b0;
  545. Mosi2_o = (ss)? (mosiReg2[1]):1'b0;
  546. Mosi3_o = (ss)? (mosiReg3[1]):1'b0;
  547. end
  548. 1 : begin
  549. Mosi0_o = (ss)? (mosiReg0[3]):1'b0;
  550. Mosi1_o = (ss)? (mosiReg1[3]):1'b0;
  551. Mosi2_o = (ss)? (mosiReg2[3]):1'b0;
  552. Mosi3_o = (ss)? (mosiReg3[3]):1'b0;
  553. end
  554. 2 : begin
  555. Mosi0_o = (ss)? (mosiReg0[5]):1'b0;
  556. Mosi1_o = (ss)? (mosiReg1[5]):1'b0;
  557. Mosi2_o = (ss)? (mosiReg2[5]):1'b0;
  558. Mosi3_o = (ss)? (mosiReg3[5]):1'b0;
  559. end
  560. 3 : begin
  561. Mosi0_o = (ss)? (mosiReg0[7]):1'b0;
  562. Mosi1_o = (ss)? (mosiReg1[7]):1'b0;
  563. Mosi2_o = (ss)? (mosiReg2[7]):1'b0;
  564. Mosi3_o = (ss)? (mosiReg3[7]):1'b0;
  565. end
  566. endcase
  567. end
  568. end
  569. end
  570. always @(posedge Clk_i) begin
  571. ssR <= ss;
  572. end
  573. always @(posedge Clk_i) begin
  574. if (rstReg) begin
  575. valReg <= 0;
  576. end else begin
  577. if (ssCnt == txLenght-3) begin
  578. if (!valReg) begin
  579. valReg <= 1;
  580. end else begin
  581. valReg <= 0;
  582. end
  583. end else begin
  584. valReg <= 0;
  585. end
  586. end
  587. end
  588. always @(*) begin
  589. if (rstReg) begin
  590. startFlag = 1'b0;
  591. end
  592. else begin
  593. if (Start_i && !stopFlag && !EmptyFlag_i ) begin
  594. startFlag = 1'b1;
  595. end
  596. else begin
  597. startFlag = 1'b0;
  598. end
  599. end
  600. end
  601. always @(*) begin
  602. if (rstReg) begin
  603. ssNum = 1'b0;
  604. end
  605. else begin
  606. case (WidthSel_i)
  607. 0 : begin
  608. ssNum = 2;
  609. end
  610. 1 : begin
  611. ssNum = 4;
  612. end
  613. 2 : begin
  614. ssNum = 6;
  615. end
  616. 3 : begin
  617. ssNum = 8;
  618. end
  619. endcase
  620. end
  621. end
  622. always @(negedge Clk_i) begin
  623. if (rstReg) begin
  624. ssCnt <= 0;
  625. end
  626. else begin
  627. if (SelSt_i) begin
  628. if (!ss) begin
  629. if (ssCnt != txLenght-1) begin
  630. ssCnt <= ssCnt + 1;
  631. end else begin
  632. ssCnt <= 0;
  633. end
  634. end else begin
  635. ssCnt <= 0;
  636. end
  637. end else begin
  638. if (ss) begin
  639. if (ssCnt != txLenght-1) begin
  640. ssCnt <= ssCnt + 1;
  641. end else begin
  642. ssCnt <= 0;
  643. end
  644. end else begin
  645. ssCnt <= 0;
  646. end
  647. end
  648. end
  649. end
  650. always @(negedge Clk_i) begin
  651. if (rstReg) begin
  652. ss <= 1'b1;
  653. end else begin
  654. if (Stop_i != 0) begin
  655. if (startFlag) begin
  656. if (SelSt_i) begin
  657. if (ssCnt != txLenght-1) begin
  658. ss <= 1'b0;
  659. end
  660. else begin
  661. ss <= 1'b1;
  662. end
  663. end else begin
  664. if (ssCnt != txLenght-1) begin
  665. ss <= 1'b1;
  666. end
  667. else begin
  668. ss <= 1'b0;
  669. end
  670. end
  671. end else begin
  672. if (SelSt_i) begin
  673. ss <= 1'b1;
  674. end else begin
  675. ss <= 1'b0;
  676. end
  677. end
  678. end else begin
  679. if (startFlag) begin
  680. if (SelSt_i) begin
  681. ss <= 1'b0;
  682. end else begin
  683. ss <= 1'b1;
  684. end
  685. end else begin
  686. if (SelSt_i) begin
  687. ss <= 1'b1;
  688. end else begin
  689. ss <= 1'b0;
  690. end
  691. end
  692. end
  693. end
  694. end
  695. always @(negedge Clk_i) begin
  696. if (rstReg) begin
  697. mosiReg3 <= SpiData_i[7:0];
  698. mosiReg2 <= SpiData_i[15:8];
  699. mosiReg1 <= SpiData_i[23:16];
  700. mosiReg0 <= SpiData_i[31:24];
  701. end
  702. else begin
  703. case (WidthSel_i)
  704. 3: begin
  705. if (!EndianSel_i) begin
  706. if (SelSt_i) begin
  707. if (Lag_i != 0) begin
  708. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  709. mosiReg3 <= {mosiReg3[6:0],1'b0};
  710. mosiReg2 <= {mosiReg2[6:0],1'b0};
  711. mosiReg1 <= {mosiReg1[6:0],1'b0};
  712. mosiReg0 <= {mosiReg0[6:0],1'b0};
  713. end
  714. else begin
  715. mosiReg3 <= SpiData_i[7:0];
  716. mosiReg2 <= SpiData_i[15:8];
  717. mosiReg1 <= SpiData_i[23:16];
  718. mosiReg0 <= SpiData_i[31:24];
  719. end
  720. end else begin
  721. if (!ss&& (ssCnt < txLenght-1)) begin
  722. mosiReg3 <= {mosiReg3[6:0],1'b0};
  723. mosiReg2 <= {mosiReg2[6:0],1'b0};
  724. mosiReg1 <= {mosiReg1[6:0],1'b0};
  725. mosiReg0 <= {mosiReg0[6:0],1'b0};
  726. end
  727. else begin
  728. mosiReg3 <= SpiData_i[7:0];
  729. mosiReg2 <= SpiData_i[15:8];
  730. mosiReg1 <= SpiData_i[23:16];
  731. mosiReg0 <= SpiData_i[31:24];
  732. end
  733. end
  734. end
  735. else begin
  736. if (Lag_i != 0) begin
  737. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  738. mosiReg3 <= {mosiReg3[6:0],1'b0};
  739. mosiReg2 <= {mosiReg2[6:0],1'b0};
  740. mosiReg1 <= {mosiReg1[6:0],1'b0};
  741. mosiReg0 <= {mosiReg0[6:0],1'b0};
  742. end
  743. else begin
  744. mosiReg3 <= SpiData_i[7:0];
  745. mosiReg2 <= SpiData_i[15:8];
  746. mosiReg1 <= SpiData_i[23:16];
  747. mosiReg0 <= SpiData_i[31:24];
  748. end
  749. end else begin
  750. if (!ss&& (ssCnt < txLenght-1)) begin
  751. mosiReg3 <= {mosiReg3[6:0],1'b0};
  752. mosiReg2 <= {mosiReg2[6:0],1'b0};
  753. mosiReg1 <= {mosiReg1[6:0],1'b0};
  754. mosiReg0 <= {mosiReg0[6:0],1'b0};
  755. end
  756. else begin
  757. mosiReg3 <= SpiData_i[7:0];
  758. mosiReg2 <= SpiData_i[15:8];
  759. mosiReg1 <= SpiData_i[23:16];
  760. mosiReg0 <= SpiData_i[31:24];
  761. end
  762. end
  763. end
  764. end
  765. else begin
  766. if (SelSt_i) begin
  767. if (Lag_i != 0) begin
  768. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  769. /* LSB First */
  770. mosiReg3 <= mosiReg3 >> 1;
  771. mosiReg2 <= mosiReg2 >> 1;
  772. mosiReg1 <= mosiReg1 >> 1;
  773. mosiReg0 <= mosiReg0 >> 1;
  774. end
  775. else begin
  776. mosiReg3 <= SpiData_i[7:0];
  777. mosiReg2 <= SpiData_i[15:8];
  778. mosiReg1 <= SpiData_i[23:16];
  779. mosiReg0 <= SpiData_i[31:24];
  780. end
  781. end else begin
  782. if (!ss&& (ssCnt < txLenght-1)) begin
  783. /* LSB First */
  784. mosiReg3 <= mosiReg3 >> 1;
  785. mosiReg2 <= mosiReg2 >> 1;
  786. mosiReg1 <= mosiReg1 >> 1;
  787. mosiReg0 <= mosiReg0 >> 1;
  788. end
  789. else begin
  790. mosiReg3 <= SpiData_i[7:0];
  791. mosiReg2 <= SpiData_i[15:8];
  792. mosiReg1 <= SpiData_i[23:16];
  793. mosiReg0 <= SpiData_i[31:24];
  794. end
  795. end
  796. end
  797. else begin
  798. if (Lag_i != 0) begin
  799. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  800. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  801. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  802. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  803. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  804. end
  805. else begin
  806. mosiReg3 <= SpiData_i[7:0];
  807. mosiReg2 <= SpiData_i[15:8];
  808. mosiReg1 <= SpiData_i[23:16];
  809. mosiReg0 <= SpiData_i[31:24];
  810. end
  811. end else begin
  812. if (!ss&& (ssCnt < txLenght-1)) begin
  813. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  814. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  815. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  816. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  817. end
  818. else begin
  819. mosiReg3 <= SpiData_i[7:0];
  820. mosiReg2 <= SpiData_i[15:8];
  821. mosiReg1 <= SpiData_i[23:16];
  822. mosiReg0 <= SpiData_i[31:24];
  823. end
  824. end
  825. end
  826. end
  827. end
  828. 2: begin
  829. if (!EndianSel_i) begin
  830. if (SelSt_i) begin
  831. if (Lag_i != 0) begin
  832. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  833. mosiReg3 <= mosiReg3 << 1;
  834. mosiReg2 <= mosiReg2 << 1;
  835. mosiReg1 <= mosiReg1 << 1;
  836. mosiReg0 <= mosiReg0 << 1;
  837. end
  838. else begin
  839. mosiReg3 <= SpiData_i[5:0];
  840. mosiReg2 <= SpiData_i[11:6];
  841. mosiReg1 <= SpiData_i[17:12];
  842. mosiReg0 <= SpiData_i[23:18];
  843. end
  844. end else begin
  845. if (!ss&& (ssCnt < txLenght-1)) begin
  846. mosiReg3 <= mosiReg3 << 1;
  847. mosiReg2 <= mosiReg2 << 1;
  848. mosiReg1 <= mosiReg1 << 1;
  849. mosiReg0 <= mosiReg0 << 1;
  850. end
  851. else begin
  852. mosiReg3 <= SpiData_i[5:0];
  853. mosiReg2 <= SpiData_i[11:6];
  854. mosiReg1 <= SpiData_i[17:12];
  855. mosiReg0 <= SpiData_i[23:18];
  856. end
  857. end
  858. end
  859. else begin
  860. if (Lag_i != 0) begin
  861. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  862. mosiReg3 <= mosiReg3 << 1;
  863. mosiReg2 <= mosiReg2 << 1;
  864. mosiReg1 <= mosiReg1 << 1;
  865. mosiReg0 <= mosiReg0 << 1;
  866. end
  867. else begin
  868. mosiReg3 <= SpiData_i[5:0];
  869. mosiReg2 <= SpiData_i[11:6];
  870. mosiReg1 <= SpiData_i[17:12];
  871. mosiReg0 <= SpiData_i[23:18];
  872. end
  873. end else begin
  874. if (!ss&& (ssCnt < txLenght-1)) begin
  875. mosiReg3 <= mosiReg3 << 1;
  876. mosiReg2 <= mosiReg2 << 1;
  877. mosiReg1 <= mosiReg1 << 1;
  878. mosiReg0 <= mosiReg0 << 1;
  879. end
  880. else begin
  881. mosiReg3 <= SpiData_i[5:0];
  882. mosiReg2 <= SpiData_i[11:6];
  883. mosiReg1 <= SpiData_i[17:12];
  884. mosiReg0 <= SpiData_i[23:18];
  885. end
  886. end
  887. end
  888. end
  889. else begin
  890. if (SelSt_i) begin
  891. if (Lag_i != 0) begin
  892. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  893. mosiReg3 <= mosiReg3 >> 1;
  894. mosiReg2 <= mosiReg2 >> 1;
  895. mosiReg1 <= mosiReg1 >> 1;
  896. mosiReg0 <= mosiReg0 >> 1;
  897. end
  898. else begin
  899. mosiReg3 <= SpiData_i[5:0];
  900. mosiReg2 <= SpiData_i[11:6];
  901. mosiReg1 <= SpiData_i[17:12];
  902. mosiReg0 <= SpiData_i[23:18];
  903. end
  904. end else begin
  905. if (!ss&& (ssCnt < txLenght-1)) begin
  906. mosiReg3 <= mosiReg3 >> 1;
  907. mosiReg2 <= mosiReg2 >> 1;
  908. mosiReg1 <= mosiReg1 >> 1;
  909. mosiReg0 <= mosiReg0 >> 1;
  910. end
  911. else begin
  912. mosiReg3 <= SpiData_i[5:0];
  913. mosiReg2 <= SpiData_i[11:6];
  914. mosiReg1 <= SpiData_i[17:12];
  915. mosiReg0 <= SpiData_i[23:18];
  916. end
  917. end
  918. end
  919. else begin
  920. if (Lag_i != 0) begin
  921. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  922. mosiReg3 <= mosiReg3 >> 1;
  923. mosiReg2 <= mosiReg2 >> 1;
  924. mosiReg1 <= mosiReg1 >> 1;
  925. mosiReg0 <= mosiReg0 >> 1;
  926. end
  927. else begin
  928. mosiReg3 <= SpiData_i[5:0];
  929. mosiReg2 <= SpiData_i[11:6];
  930. mosiReg1 <= SpiData_i[17:12];
  931. mosiReg0 <= SpiData_i[23:18];
  932. end
  933. end else begin
  934. if (!ss&& (ssCnt < txLenght-1)) begin
  935. mosiReg3 <= mosiReg3 >> 1;
  936. mosiReg2 <= mosiReg2 >> 1;
  937. mosiReg1 <= mosiReg1 >> 1;
  938. mosiReg0 <= mosiReg0 >> 1;
  939. end
  940. else begin
  941. mosiReg3 <= SpiData_i[5:0];
  942. mosiReg2 <= SpiData_i[11:6];
  943. mosiReg1 <= SpiData_i[17:12];
  944. mosiReg0 <= SpiData_i[23:18];
  945. end
  946. end
  947. end
  948. end
  949. end
  950. 1: begin
  951. if (!EndianSel_i) begin
  952. if (SelSt_i) begin
  953. if (Lag_i != 0) begin
  954. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  955. mosiReg3 <= mosiReg3 << 1;
  956. mosiReg2 <= mosiReg2 << 1;
  957. mosiReg1 <= mosiReg1 << 1;
  958. mosiReg0 <= mosiReg0 << 1;
  959. end
  960. else begin
  961. mosiReg3 <= SpiData_i[3:0];
  962. mosiReg2 <= SpiData_i[7:4];
  963. mosiReg1 <= SpiData_i[11:8];
  964. mosiReg0 <= SpiData_i[15:12];
  965. end
  966. end else begin
  967. if (!ss&& (ssCnt < txLenght-1)) begin
  968. mosiReg3 <= mosiReg3 << 1;
  969. mosiReg2 <= mosiReg2 << 1;
  970. mosiReg1 <= mosiReg1 << 1;
  971. mosiReg0 <= mosiReg0 << 1;
  972. end
  973. else begin
  974. mosiReg3 <= SpiData_i[3:0];
  975. mosiReg2 <= SpiData_i[7:4];
  976. mosiReg1 <= SpiData_i[11:8];
  977. mosiReg0 <= SpiData_i[15:12];
  978. end
  979. end
  980. end
  981. else begin
  982. if (Lag_i != 0) begin
  983. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  984. mosiReg3 <= mosiReg3 << 1;
  985. mosiReg2 <= mosiReg2 << 1;
  986. mosiReg1 <= mosiReg1 << 1;
  987. mosiReg0 <= mosiReg0 << 1;
  988. end
  989. else begin
  990. mosiReg3 <= SpiData_i[3:0];
  991. mosiReg2 <= SpiData_i[7:4];
  992. mosiReg1 <= SpiData_i[11:8];
  993. mosiReg0 <= SpiData_i[15:12];
  994. end
  995. end else begin
  996. if (!ss&& (ssCnt < txLenght-1)) begin
  997. mosiReg3 <= mosiReg3 << 1;
  998. mosiReg2 <= mosiReg2 << 1;
  999. mosiReg1 <= mosiReg1 << 1;
  1000. mosiReg0 <= mosiReg0 << 1;
  1001. end
  1002. else begin
  1003. mosiReg3 <= SpiData_i[3:0];
  1004. mosiReg2 <= SpiData_i[7:4];
  1005. mosiReg1 <= SpiData_i[11:8];
  1006. mosiReg0 <= SpiData_i[15:12];
  1007. end
  1008. end
  1009. end
  1010. end
  1011. else begin
  1012. if (SelSt_i) begin
  1013. if (Lag_i != 0) begin
  1014. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1015. mosiReg3 <= mosiReg3 >> 1;
  1016. mosiReg2 <= mosiReg2 >> 1;
  1017. mosiReg1 <= mosiReg1 >> 1;
  1018. mosiReg0 <= mosiReg0 >> 1;
  1019. end
  1020. else begin
  1021. mosiReg3 <= SpiData_i[3:0];
  1022. mosiReg2 <= SpiData_i[7:4];
  1023. mosiReg1 <= SpiData_i[11:8];
  1024. mosiReg0 <= SpiData_i[15:12];
  1025. end
  1026. end else begin
  1027. if (!ss&& (ssCnt < txLenght-1)) begin
  1028. mosiReg3 <= mosiReg3 >> 1;
  1029. mosiReg2 <= mosiReg2 >> 1;
  1030. mosiReg1 <= mosiReg1 >> 1;
  1031. mosiReg0 <= mosiReg0 >> 1;
  1032. end
  1033. else begin
  1034. mosiReg3 <= SpiData_i[3:0];
  1035. mosiReg2 <= SpiData_i[7:4];
  1036. mosiReg1 <= SpiData_i[11:8];
  1037. mosiReg0 <= SpiData_i[15:12];
  1038. end
  1039. end
  1040. end
  1041. else begin
  1042. if (Lag_i != 0) begin
  1043. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1044. mosiReg3 <= mosiReg3 >> 1;
  1045. mosiReg2 <= mosiReg2 >> 1;
  1046. mosiReg1 <= mosiReg1 >> 1;
  1047. mosiReg0 <= mosiReg0 >> 1;
  1048. end
  1049. else begin
  1050. mosiReg3 <= SpiData_i[3:0];
  1051. mosiReg2 <= SpiData_i[7:4];
  1052. mosiReg1 <= SpiData_i[11:8];
  1053. mosiReg0 <= SpiData_i[15:12];
  1054. end
  1055. end else begin
  1056. if (!ss&& (ssCnt < txLenght-1)) begin
  1057. mosiReg3 <= mosiReg3 >> 1;
  1058. mosiReg2 <= mosiReg2 >> 1;
  1059. mosiReg1 <= mosiReg1 >> 1;
  1060. mosiReg0 <= mosiReg0 >> 1;
  1061. end
  1062. else begin
  1063. mosiReg3 <= SpiData_i[3:0];
  1064. mosiReg2 <= SpiData_i[7:4];
  1065. mosiReg1 <= SpiData_i[11:8];
  1066. mosiReg0 <= SpiData_i[15:12];
  1067. end
  1068. end
  1069. end
  1070. end
  1071. end
  1072. 0: begin
  1073. if (!EndianSel_i) begin
  1074. if (SelSt_i) begin
  1075. if (Lag_i != 0) begin
  1076. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1077. mosiReg3 <= mosiReg3 << 1;
  1078. mosiReg2 <= mosiReg2 << 1;
  1079. mosiReg1 <= mosiReg1 << 1;
  1080. mosiReg0 <= mosiReg0 << 1;
  1081. end
  1082. else begin
  1083. mosiReg3 <= SpiData_i[1:0];
  1084. mosiReg2 <= SpiData_i[3:2];
  1085. mosiReg1 <= SpiData_i[5:4];
  1086. mosiReg0 <= SpiData_i[7:6];
  1087. end
  1088. end else begin
  1089. if (!ss&& (ssCnt < txLenght-1)) begin
  1090. mosiReg3 <= mosiReg3 << 1;
  1091. mosiReg2 <= mosiReg2 << 1;
  1092. mosiReg1 <= mosiReg1 << 1;
  1093. mosiReg0 <= mosiReg0 << 1;
  1094. end
  1095. else begin
  1096. mosiReg3 <= SpiData_i[1:0];
  1097. mosiReg2 <= SpiData_i[3:2];
  1098. mosiReg1 <= SpiData_i[5:4];
  1099. mosiReg0 <= SpiData_i[7:6];
  1100. end
  1101. end
  1102. end
  1103. else begin
  1104. if (Lag_i != 0) begin
  1105. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1106. mosiReg3 <= mosiReg3 << 1;
  1107. mosiReg2 <= mosiReg2 << 1;
  1108. mosiReg1 <= mosiReg1 << 1;
  1109. mosiReg0 <= mosiReg0 << 1;
  1110. end
  1111. else begin
  1112. mosiReg3 <= SpiData_i[1:0];
  1113. mosiReg2 <= SpiData_i[3:2];
  1114. mosiReg1 <= SpiData_i[5:4];
  1115. mosiReg0 <= SpiData_i[7:6];
  1116. end
  1117. end else begin
  1118. if (!ss&& (ssCnt < txLenght-1)) begin
  1119. mosiReg3 <= mosiReg3 << 1;
  1120. mosiReg2 <= mosiReg2 << 1;
  1121. mosiReg1 <= mosiReg1 << 1;
  1122. mosiReg0 <= mosiReg0 << 1;
  1123. end
  1124. else begin
  1125. mosiReg3 <= SpiData_i[1:0];
  1126. mosiReg2 <= SpiData_i[3:2];
  1127. mosiReg1 <= SpiData_i[5:4];
  1128. mosiReg0 <= SpiData_i[7:6];
  1129. end
  1130. end
  1131. end
  1132. end
  1133. else begin
  1134. if (SelSt_i) begin
  1135. if (Lag_i != 0) begin
  1136. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1137. mosiReg3 <= mosiReg3 >> 1;
  1138. mosiReg2 <= mosiReg2 >> 1;
  1139. mosiReg1 <= mosiReg1 >> 1;
  1140. mosiReg0 <= mosiReg0 >> 1;
  1141. end
  1142. else begin
  1143. mosiReg3 <= SpiData_i[1:0];
  1144. mosiReg2 <= SpiData_i[3:2];
  1145. mosiReg1 <= SpiData_i[5:4];
  1146. mosiReg0 <= SpiData_i[7:6];
  1147. end
  1148. end else begin
  1149. if (!ss&& (ssCnt < txLenght-1)) begin
  1150. mosiReg3 <= mosiReg3 >> 1;
  1151. mosiReg2 <= mosiReg2 >> 1;
  1152. mosiReg1 <= mosiReg1 >> 1;
  1153. mosiReg0 <= mosiReg0 >> 1;
  1154. end
  1155. else begin
  1156. mosiReg3 <= SpiData_i[1:0];
  1157. mosiReg2 <= SpiData_i[3:2];
  1158. mosiReg1 <= SpiData_i[5:4];
  1159. mosiReg0 <= SpiData_i[7:6];
  1160. end
  1161. end
  1162. end
  1163. else begin
  1164. if (Lag_i != 0) begin
  1165. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1166. mosiReg3 <= mosiReg3 >> 1;
  1167. mosiReg2 <= mosiReg2 >> 1;
  1168. mosiReg1 <= mosiReg1 >> 1;
  1169. mosiReg0 <= mosiReg0 >> 1;
  1170. end
  1171. else begin
  1172. mosiReg3 <= SpiData_i[1:0];
  1173. mosiReg2 <= SpiData_i[3:2];
  1174. mosiReg1 <= SpiData_i[5:4];
  1175. mosiReg0 <= SpiData_i[7:6];
  1176. end
  1177. end else begin
  1178. if (!ss&& (ssCnt < txLenght-1)) begin
  1179. mosiReg3 <= mosiReg3 >> 1;
  1180. mosiReg2 <= mosiReg2 >> 1;
  1181. mosiReg1 <= mosiReg1 >> 1;
  1182. mosiReg0 <= mosiReg0 >> 1;
  1183. end
  1184. else begin
  1185. mosiReg3 <= SpiData_i[1:0];
  1186. mosiReg2 <= SpiData_i[3:2];
  1187. mosiReg1 <= SpiData_i[5:4];
  1188. mosiReg0 <= SpiData_i[7:6];
  1189. end
  1190. end
  1191. end
  1192. end
  1193. end
  1194. endcase
  1195. end
  1196. end
  1197. endmodule