QuadSPIm.v 32 KB

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