QuadSPIm.v 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191
  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 @(posedge Clk_i) 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 (startFlag) begin
  380. if (SelSt_i) begin
  381. if (!ss) begin
  382. if (PulsePol_i) begin
  383. if (ClockPhase_i) begin
  384. Sck_o = ~(~Clk_i);
  385. end
  386. else begin
  387. Sck_o = ~Clk_i;
  388. end
  389. end else begin
  390. if (ClockPhase_i) begin
  391. Sck_o = ~(Clk_i);
  392. end
  393. else begin
  394. Sck_o = ~(~Clk_i);
  395. end
  396. end
  397. end else begin
  398. Sck_o = 1'b0;
  399. end
  400. end else begin
  401. if (ss) begin
  402. if (PulsePol_i) begin
  403. if (ClockPhase_i) begin
  404. Sck_o = ~(~Clk_i);
  405. end
  406. else begin
  407. Sck_o = ~Clk_i;
  408. end
  409. end else begin
  410. if (ClockPhase_i) begin
  411. Sck_o = ~(Clk_i);
  412. end
  413. else begin
  414. Sck_o = ~(~Clk_i);
  415. end
  416. end
  417. end else begin
  418. Sck_o = 1'b0;
  419. end
  420. end
  421. end else begin
  422. Sck_o = 0;
  423. end
  424. end
  425. end
  426. end
  427. always @(*) begin
  428. if (SelSt_i) begin
  429. if (EndianSel_i) begin
  430. case (WidthSel_i)
  431. 0 : begin
  432. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  433. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  434. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  435. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  436. end
  437. 1 : begin
  438. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  439. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  440. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  441. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  442. end
  443. 2 : begin
  444. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  445. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  446. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  447. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  448. end
  449. 3 : begin
  450. Mosi0_o = (!ss) ? (mosiReg3[0]):1'b0;
  451. Mosi1_o = (!ss) ? (mosiReg2[0]):1'b0;
  452. Mosi2_o = (!ss) ? (mosiReg1[0]):1'b0;
  453. Mosi3_o = (!ss) ? (mosiReg0[0]):1'b0;
  454. end
  455. endcase
  456. end
  457. else begin
  458. case (WidthSel_i)
  459. 0 : begin
  460. Mosi0_o = (!ss)? (mosiReg0[1]):1'b0;
  461. Mosi1_o = (!ss)? (mosiReg1[1]):1'b0;
  462. Mosi2_o = (!ss)? (mosiReg2[1]):1'b0;
  463. Mosi3_o = (!ss)? (mosiReg3[1]):1'b0;
  464. end
  465. 1 : begin
  466. Mosi0_o = (!ss)? (mosiReg0[3]):1'b0;
  467. Mosi1_o = (!ss)? (mosiReg1[3]):1'b0;
  468. Mosi2_o = (!ss)? (mosiReg2[3]):1'b0;
  469. Mosi3_o = (!ss)? (mosiReg3[3]):1'b0;
  470. end
  471. 2 : begin
  472. Mosi0_o = (!ss)? (mosiReg0[5]):1'b0;
  473. Mosi1_o = (!ss)? (mosiReg1[5]):1'b0;
  474. Mosi2_o = (!ss)? (mosiReg2[5]):1'b0;
  475. Mosi3_o = (!ss)? (mosiReg3[5]):1'b0;
  476. end
  477. 3 : begin
  478. Mosi0_o = (!ss)? (mosiReg0[7]):1'b0;
  479. Mosi1_o = (!ss)? (mosiReg1[7]):1'b0;
  480. Mosi2_o = (!ss)? (mosiReg2[7]):1'b0;
  481. Mosi3_o = (!ss)? (mosiReg3[7]):1'b0;
  482. end
  483. endcase
  484. end
  485. end
  486. else begin
  487. if (EndianSel_i) begin
  488. case (WidthSel_i)
  489. 0 : begin
  490. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  491. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  492. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  493. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  494. end
  495. 1 : begin
  496. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  497. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  498. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  499. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  500. end
  501. 2 : begin
  502. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  503. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  504. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  505. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  506. end
  507. 3 : begin
  508. Mosi0_o = (ss) ? (mosiReg3[0]):1'b0;
  509. Mosi1_o = (ss) ? (mosiReg2[0]):1'b0;
  510. Mosi2_o = (ss) ? (mosiReg1[0]):1'b0;
  511. Mosi3_o = (ss) ? (mosiReg0[0]):1'b0;
  512. end
  513. endcase
  514. end
  515. else begin
  516. case (WidthSel_i)
  517. 0 : begin
  518. Mosi0_o = (ss)? (mosiReg0[1]):1'b0;
  519. Mosi1_o = (ss)? (mosiReg1[1]):1'b0;
  520. Mosi2_o = (ss)? (mosiReg2[1]):1'b0;
  521. Mosi3_o = (ss)? (mosiReg3[1]):1'b0;
  522. end
  523. 1 : begin
  524. Mosi0_o = (ss)? (mosiReg0[3]):1'b0;
  525. Mosi1_o = (ss)? (mosiReg1[3]):1'b0;
  526. Mosi2_o = (ss)? (mosiReg2[3]):1'b0;
  527. Mosi3_o = (ss)? (mosiReg3[3]):1'b0;
  528. end
  529. 2 : begin
  530. Mosi0_o = (ss)? (mosiReg0[5]):1'b0;
  531. Mosi1_o = (ss)? (mosiReg1[5]):1'b0;
  532. Mosi2_o = (ss)? (mosiReg2[5]):1'b0;
  533. Mosi3_o = (ss)? (mosiReg3[5]):1'b0;
  534. end
  535. 3 : begin
  536. Mosi0_o = (ss)? (mosiReg0[7]):1'b0;
  537. Mosi1_o = (ss)? (mosiReg1[7]):1'b0;
  538. Mosi2_o = (ss)? (mosiReg2[7]):1'b0;
  539. Mosi3_o = (ss)? (mosiReg3[7]):1'b0;
  540. end
  541. endcase
  542. end
  543. end
  544. end
  545. always @(posedge Clk_i) begin
  546. ssR <= ss;
  547. end
  548. always @(posedge Clk_i) begin
  549. if (Rst_i) begin
  550. valReg <= 0;
  551. end else begin
  552. if (ssCnt == txLenght-3) begin
  553. if (!valReg) begin
  554. valReg <= 1;
  555. end else begin
  556. valReg <= 0;
  557. end
  558. end else begin
  559. valReg <= 0;
  560. end
  561. end
  562. end
  563. always @(*) begin
  564. if (Rst_i) begin
  565. startFlag = 1'b0;
  566. end
  567. else begin
  568. if (Start_i && !stopFlag && !EmptyFlag_i ) begin
  569. startFlag = 1'b1;
  570. end
  571. else begin
  572. startFlag = 1'b0;
  573. end
  574. end
  575. end
  576. always @(*) begin
  577. if (Rst_i) begin
  578. ssNum = 1'b0;
  579. end
  580. else begin
  581. case (WidthSel_i)
  582. 0 : begin
  583. ssNum = 2;
  584. end
  585. 1 : begin
  586. ssNum = 4;
  587. end
  588. 2 : begin
  589. ssNum = 6;
  590. end
  591. 3 : begin
  592. ssNum = 8;
  593. end
  594. endcase
  595. end
  596. end
  597. always @(negedge Clk_i) begin
  598. if (Rst_i) begin
  599. ssCnt <= 0;
  600. end
  601. else begin
  602. if (SelSt_i) begin
  603. if (!ss) begin
  604. if (ssCnt != txLenght-1) begin
  605. ssCnt <= ssCnt + 1;
  606. end else begin
  607. ssCnt <= 0;
  608. end
  609. end else begin
  610. ssCnt <= 0;
  611. end
  612. end else begin
  613. if (ss) begin
  614. if (ssCnt != txLenght-1) begin
  615. ssCnt <= ssCnt + 1;
  616. end else begin
  617. ssCnt <= 0;
  618. end
  619. end else begin
  620. ssCnt <= 0;
  621. end
  622. end
  623. end
  624. end
  625. always @(negedge Clk_i) begin
  626. if (Rst_i) begin
  627. ss <= 1'b1;
  628. end else begin
  629. if (Stop_i != 0) begin
  630. if (startFlag) begin
  631. if (SelSt_i) begin
  632. if (ssCnt != txLenght-1) begin
  633. ss <= 1'b0;
  634. end
  635. else begin
  636. ss <= 1'b1;
  637. end
  638. end else begin
  639. if (ssCnt != txLenght-1) begin
  640. ss <= 1'b1;
  641. end
  642. else begin
  643. ss <= 1'b0;
  644. end
  645. end
  646. end else begin
  647. if (SelSt_i) begin
  648. ss <= 1'b1;
  649. end else begin
  650. ss <= 1'b0;
  651. end
  652. end
  653. end else begin
  654. if (startFlag) begin
  655. if (SelSt_i) begin
  656. ss <= 1'b0;
  657. end else begin
  658. ss <= 1'b1;
  659. end
  660. end else begin
  661. if (SelSt_i) begin
  662. ss <= 1'b1;
  663. end else begin
  664. ss <= 1'b0;
  665. end
  666. end
  667. end
  668. end
  669. end
  670. always @(negedge Clk_i) begin
  671. if (Rst_i) begin
  672. mosiReg3 <= SpiData_i[7:0];
  673. mosiReg2 <= SpiData_i[15:8];
  674. mosiReg1 <= SpiData_i[23:16];
  675. mosiReg0 <= SpiData_i[31:24];
  676. end
  677. else begin
  678. case (WidthSel_i)
  679. 3: begin
  680. if (!EndianSel_i) begin
  681. if (SelSt_i) begin
  682. if (Lag_i != 0) begin
  683. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  684. mosiReg3 <= {mosiReg3[6:0],1'b0};
  685. mosiReg2 <= {mosiReg2[6:0],1'b0};
  686. mosiReg1 <= {mosiReg1[6:0],1'b0};
  687. mosiReg0 <= {mosiReg0[6:0],1'b0};
  688. end
  689. else begin
  690. mosiReg3 <= SpiData_i[7:0];
  691. mosiReg2 <= SpiData_i[15:8];
  692. mosiReg1 <= SpiData_i[23:16];
  693. mosiReg0 <= SpiData_i[31:24];
  694. end
  695. end else begin
  696. if (!ss&& (ssCnt < txLenght-1)) begin
  697. mosiReg3 <= {mosiReg3[6:0],1'b0};
  698. mosiReg2 <= {mosiReg2[6:0],1'b0};
  699. mosiReg1 <= {mosiReg1[6:0],1'b0};
  700. mosiReg0 <= {mosiReg0[6:0],1'b0};
  701. end
  702. else begin
  703. mosiReg3 <= SpiData_i[7:0];
  704. mosiReg2 <= SpiData_i[15:8];
  705. mosiReg1 <= SpiData_i[23:16];
  706. mosiReg0 <= SpiData_i[31:24];
  707. end
  708. end
  709. end
  710. else begin
  711. if (Lag_i != 0) begin
  712. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  713. mosiReg3 <= {mosiReg3[6:0],1'b0};
  714. mosiReg2 <= {mosiReg2[6:0],1'b0};
  715. mosiReg1 <= {mosiReg1[6:0],1'b0};
  716. mosiReg0 <= {mosiReg0[6:0],1'b0};
  717. end
  718. else begin
  719. mosiReg3 <= SpiData_i[7:0];
  720. mosiReg2 <= SpiData_i[15:8];
  721. mosiReg1 <= SpiData_i[23:16];
  722. mosiReg0 <= SpiData_i[31:24];
  723. end
  724. end else begin
  725. if (!ss&& (ssCnt < txLenght-1)) begin
  726. mosiReg3 <= {mosiReg3[6:0],1'b0};
  727. mosiReg2 <= {mosiReg2[6:0],1'b0};
  728. mosiReg1 <= {mosiReg1[6:0],1'b0};
  729. mosiReg0 <= {mosiReg0[6:0],1'b0};
  730. end
  731. else begin
  732. mosiReg3 <= SpiData_i[7:0];
  733. mosiReg2 <= SpiData_i[15:8];
  734. mosiReg1 <= SpiData_i[23:16];
  735. mosiReg0 <= SpiData_i[31:24];
  736. end
  737. end
  738. end
  739. end
  740. else begin
  741. if (SelSt_i) begin
  742. if (Lag_i != 0) begin
  743. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  744. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  745. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  746. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  747. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  748. end
  749. else begin
  750. mosiReg3 <= SpiData_i[7:0];
  751. mosiReg2 <= SpiData_i[15:8];
  752. mosiReg1 <= SpiData_i[23:16];
  753. mosiReg0 <= SpiData_i[31:24];
  754. end
  755. end else begin
  756. if (!ss&& (ssCnt < txLenght-1)) begin
  757. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  758. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  759. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  760. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  761. end
  762. else begin
  763. mosiReg3 <= SpiData_i[7:0];
  764. mosiReg2 <= SpiData_i[15:8];
  765. mosiReg1 <= SpiData_i[23:16];
  766. mosiReg0 <= SpiData_i[31:24];
  767. end
  768. end
  769. end
  770. else begin
  771. if (Lag_i != 0) begin
  772. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  773. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  774. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  775. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  776. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  777. end
  778. else begin
  779. mosiReg3 <= SpiData_i[7:0];
  780. mosiReg2 <= SpiData_i[15:8];
  781. mosiReg1 <= SpiData_i[23:16];
  782. mosiReg0 <= SpiData_i[31:24];
  783. end
  784. end else begin
  785. if (!ss&& (ssCnt < txLenght-1)) begin
  786. mosiReg3 <= {1'b0, mosiReg3[7:1] };
  787. mosiReg2 <= {1'b0, mosiReg2[7:1] };
  788. mosiReg1 <= {1'b0, mosiReg1[7:1] };
  789. mosiReg0 <= {1'b0, mosiReg0[7:1] };
  790. end
  791. else begin
  792. mosiReg3 <= SpiData_i[7:0];
  793. mosiReg2 <= SpiData_i[15:8];
  794. mosiReg1 <= SpiData_i[23:16];
  795. mosiReg0 <= SpiData_i[31:24];
  796. end
  797. end
  798. end
  799. end
  800. end
  801. 2: begin
  802. if (!EndianSel_i) begin
  803. if (SelSt_i) begin
  804. if (Lag_i != 0) begin
  805. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  806. mosiReg3 <= mosiReg3 << 1;
  807. mosiReg2 <= mosiReg2 << 1;
  808. mosiReg1 <= mosiReg1 << 1;
  809. mosiReg0 <= mosiReg0 << 1;
  810. end
  811. else begin
  812. mosiReg3 <= SpiData_i[5:0];
  813. mosiReg2 <= SpiData_i[11:6];
  814. mosiReg1 <= SpiData_i[17:12];
  815. mosiReg0 <= SpiData_i[23:18];
  816. end
  817. end else begin
  818. if (!ss&& (ssCnt < txLenght-1)) begin
  819. mosiReg3 <= mosiReg3 << 1;
  820. mosiReg2 <= mosiReg2 << 1;
  821. mosiReg1 <= mosiReg1 << 1;
  822. mosiReg0 <= mosiReg0 << 1;
  823. end
  824. else begin
  825. mosiReg3 <= SpiData_i[5:0];
  826. mosiReg2 <= SpiData_i[11:6];
  827. mosiReg1 <= SpiData_i[17:12];
  828. mosiReg0 <= SpiData_i[23:18];
  829. end
  830. end
  831. end
  832. else begin
  833. if (Lag_i != 0) begin
  834. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  835. mosiReg3 <= mosiReg3 << 1;
  836. mosiReg2 <= mosiReg2 << 1;
  837. mosiReg1 <= mosiReg1 << 1;
  838. mosiReg0 <= mosiReg0 << 1;
  839. end
  840. else begin
  841. mosiReg3 <= SpiData_i[5:0];
  842. mosiReg2 <= SpiData_i[11:6];
  843. mosiReg1 <= SpiData_i[17:12];
  844. mosiReg0 <= SpiData_i[23:18];
  845. end
  846. end else begin
  847. if (!ss&& (ssCnt < txLenght-1)) begin
  848. mosiReg3 <= mosiReg3 << 1;
  849. mosiReg2 <= mosiReg2 << 1;
  850. mosiReg1 <= mosiReg1 << 1;
  851. mosiReg0 <= mosiReg0 << 1;
  852. end
  853. else begin
  854. mosiReg3 <= SpiData_i[5:0];
  855. mosiReg2 <= SpiData_i[11:6];
  856. mosiReg1 <= SpiData_i[17:12];
  857. mosiReg0 <= SpiData_i[23:18];
  858. end
  859. end
  860. end
  861. end
  862. else begin
  863. if (SelSt_i) begin
  864. if (Lag_i != 0) begin
  865. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  866. mosiReg3 <= mosiReg3 >> 1;
  867. mosiReg2 <= mosiReg2 >> 1;
  868. mosiReg1 <= mosiReg1 >> 1;
  869. mosiReg0 <= mosiReg0 >> 1;
  870. end
  871. else begin
  872. mosiReg3 <= SpiData_i[5:0];
  873. mosiReg2 <= SpiData_i[11:6];
  874. mosiReg1 <= SpiData_i[17:12];
  875. mosiReg0 <= SpiData_i[23:18];
  876. end
  877. end else begin
  878. if (!ss&& (ssCnt < txLenght-1)) begin
  879. mosiReg3 <= mosiReg3 >> 1;
  880. mosiReg2 <= mosiReg2 >> 1;
  881. mosiReg1 <= mosiReg1 >> 1;
  882. mosiReg0 <= mosiReg0 >> 1;
  883. end
  884. else begin
  885. mosiReg3 <= SpiData_i[5:0];
  886. mosiReg2 <= SpiData_i[11:6];
  887. mosiReg1 <= SpiData_i[17:12];
  888. mosiReg0 <= SpiData_i[23:18];
  889. end
  890. end
  891. end
  892. else begin
  893. if (Lag_i != 0) begin
  894. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  895. mosiReg3 <= mosiReg3 >> 1;
  896. mosiReg2 <= mosiReg2 >> 1;
  897. mosiReg1 <= mosiReg1 >> 1;
  898. mosiReg0 <= mosiReg0 >> 1;
  899. end
  900. else begin
  901. mosiReg3 <= SpiData_i[5:0];
  902. mosiReg2 <= SpiData_i[11:6];
  903. mosiReg1 <= SpiData_i[17:12];
  904. mosiReg0 <= SpiData_i[23:18];
  905. end
  906. end else begin
  907. if (!ss&& (ssCnt < txLenght-1)) begin
  908. mosiReg3 <= mosiReg3 >> 1;
  909. mosiReg2 <= mosiReg2 >> 1;
  910. mosiReg1 <= mosiReg1 >> 1;
  911. mosiReg0 <= mosiReg0 >> 1;
  912. end
  913. else begin
  914. mosiReg3 <= SpiData_i[5:0];
  915. mosiReg2 <= SpiData_i[11:6];
  916. mosiReg1 <= SpiData_i[17:12];
  917. mosiReg0 <= SpiData_i[23:18];
  918. end
  919. end
  920. end
  921. end
  922. end
  923. 1: begin
  924. if (!EndianSel_i) begin
  925. if (SelSt_i) begin
  926. if (Lag_i != 0) begin
  927. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  928. mosiReg3 <= mosiReg3 << 1;
  929. mosiReg2 <= mosiReg2 << 1;
  930. mosiReg1 <= mosiReg1 << 1;
  931. mosiReg0 <= mosiReg0 << 1;
  932. end
  933. else begin
  934. mosiReg3 <= SpiData_i[3:0];
  935. mosiReg2 <= SpiData_i[7:4];
  936. mosiReg1 <= SpiData_i[11:8];
  937. mosiReg0 <= SpiData_i[15:12];
  938. end
  939. end else begin
  940. if (!ss&& (ssCnt < txLenght-1)) begin
  941. mosiReg3 <= mosiReg3 << 1;
  942. mosiReg2 <= mosiReg2 << 1;
  943. mosiReg1 <= mosiReg1 << 1;
  944. mosiReg0 <= mosiReg0 << 1;
  945. end
  946. else begin
  947. mosiReg3 <= SpiData_i[3:0];
  948. mosiReg2 <= SpiData_i[7:4];
  949. mosiReg1 <= SpiData_i[11:8];
  950. mosiReg0 <= SpiData_i[15:12];
  951. end
  952. end
  953. end
  954. else begin
  955. if (Lag_i != 0) begin
  956. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  957. mosiReg3 <= mosiReg3 << 1;
  958. mosiReg2 <= mosiReg2 << 1;
  959. mosiReg1 <= mosiReg1 << 1;
  960. mosiReg0 <= mosiReg0 << 1;
  961. end
  962. else begin
  963. mosiReg3 <= SpiData_i[3:0];
  964. mosiReg2 <= SpiData_i[7:4];
  965. mosiReg1 <= SpiData_i[11:8];
  966. mosiReg0 <= SpiData_i[15:12];
  967. end
  968. end else begin
  969. if (!ss&& (ssCnt < txLenght-1)) begin
  970. mosiReg3 <= mosiReg3 << 1;
  971. mosiReg2 <= mosiReg2 << 1;
  972. mosiReg1 <= mosiReg1 << 1;
  973. mosiReg0 <= mosiReg0 << 1;
  974. end
  975. else begin
  976. mosiReg3 <= SpiData_i[3:0];
  977. mosiReg2 <= SpiData_i[7:4];
  978. mosiReg1 <= SpiData_i[11:8];
  979. mosiReg0 <= SpiData_i[15:12];
  980. end
  981. end
  982. end
  983. end
  984. else begin
  985. if (SelSt_i) begin
  986. if (Lag_i != 0) begin
  987. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  988. mosiReg3 <= mosiReg3 >> 1;
  989. mosiReg2 <= mosiReg2 >> 1;
  990. mosiReg1 <= mosiReg1 >> 1;
  991. mosiReg0 <= mosiReg0 >> 1;
  992. end
  993. else begin
  994. mosiReg3 <= SpiData_i[3:0];
  995. mosiReg2 <= SpiData_i[7:4];
  996. mosiReg1 <= SpiData_i[11:8];
  997. mosiReg0 <= SpiData_i[15:12];
  998. end
  999. end else begin
  1000. if (!ss&& (ssCnt < txLenght-1)) begin
  1001. mosiReg3 <= mosiReg3 >> 1;
  1002. mosiReg2 <= mosiReg2 >> 1;
  1003. mosiReg1 <= mosiReg1 >> 1;
  1004. mosiReg0 <= mosiReg0 >> 1;
  1005. end
  1006. else begin
  1007. mosiReg3 <= SpiData_i[3:0];
  1008. mosiReg2 <= SpiData_i[7:4];
  1009. mosiReg1 <= SpiData_i[11:8];
  1010. mosiReg0 <= SpiData_i[15:12];
  1011. end
  1012. end
  1013. end
  1014. else begin
  1015. if (Lag_i != 0) begin
  1016. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1017. mosiReg3 <= mosiReg3 >> 1;
  1018. mosiReg2 <= mosiReg2 >> 1;
  1019. mosiReg1 <= mosiReg1 >> 1;
  1020. mosiReg0 <= mosiReg0 >> 1;
  1021. end
  1022. else begin
  1023. mosiReg3 <= SpiData_i[3:0];
  1024. mosiReg2 <= SpiData_i[7:4];
  1025. mosiReg1 <= SpiData_i[11:8];
  1026. mosiReg0 <= SpiData_i[15:12];
  1027. end
  1028. end else begin
  1029. if (!ss&& (ssCnt < txLenght-1)) begin
  1030. mosiReg3 <= mosiReg3 >> 1;
  1031. mosiReg2 <= mosiReg2 >> 1;
  1032. mosiReg1 <= mosiReg1 >> 1;
  1033. mosiReg0 <= mosiReg0 >> 1;
  1034. end
  1035. else begin
  1036. mosiReg3 <= SpiData_i[3:0];
  1037. mosiReg2 <= SpiData_i[7:4];
  1038. mosiReg1 <= SpiData_i[11:8];
  1039. mosiReg0 <= SpiData_i[15:12];
  1040. end
  1041. end
  1042. end
  1043. end
  1044. end
  1045. 0: begin
  1046. if (!EndianSel_i) begin
  1047. if (SelSt_i) begin
  1048. if (Lag_i != 0) begin
  1049. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1050. mosiReg3 <= mosiReg3 << 1;
  1051. mosiReg2 <= mosiReg2 << 1;
  1052. mosiReg1 <= mosiReg1 << 1;
  1053. mosiReg0 <= mosiReg0 << 1;
  1054. end
  1055. else begin
  1056. mosiReg3 <= SpiData_i[1:0];
  1057. mosiReg2 <= SpiData_i[3:2];
  1058. mosiReg1 <= SpiData_i[5:4];
  1059. mosiReg0 <= SpiData_i[7:6];
  1060. end
  1061. end else begin
  1062. if (!ss&& (ssCnt < txLenght-1)) begin
  1063. mosiReg3 <= mosiReg3 << 1;
  1064. mosiReg2 <= mosiReg2 << 1;
  1065. mosiReg1 <= mosiReg1 << 1;
  1066. mosiReg0 <= mosiReg0 << 1;
  1067. end
  1068. else begin
  1069. mosiReg3 <= SpiData_i[1:0];
  1070. mosiReg2 <= SpiData_i[3:2];
  1071. mosiReg1 <= SpiData_i[5:4];
  1072. mosiReg0 <= SpiData_i[7:6];
  1073. end
  1074. end
  1075. end
  1076. else begin
  1077. if (Lag_i != 0) begin
  1078. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1079. mosiReg3 <= mosiReg3 << 1;
  1080. mosiReg2 <= mosiReg2 << 1;
  1081. mosiReg1 <= mosiReg1 << 1;
  1082. mosiReg0 <= mosiReg0 << 1;
  1083. end
  1084. else begin
  1085. mosiReg3 <= SpiData_i[1:0];
  1086. mosiReg2 <= SpiData_i[3:2];
  1087. mosiReg1 <= SpiData_i[5:4];
  1088. mosiReg0 <= SpiData_i[7:6];
  1089. end
  1090. end else begin
  1091. if (!ss&& (ssCnt < txLenght-1)) begin
  1092. mosiReg3 <= mosiReg3 << 1;
  1093. mosiReg2 <= mosiReg2 << 1;
  1094. mosiReg1 <= mosiReg1 << 1;
  1095. mosiReg0 <= mosiReg0 << 1;
  1096. end
  1097. else begin
  1098. mosiReg3 <= SpiData_i[1:0];
  1099. mosiReg2 <= SpiData_i[3:2];
  1100. mosiReg1 <= SpiData_i[5:4];
  1101. mosiReg0 <= SpiData_i[7:6];
  1102. end
  1103. end
  1104. end
  1105. end
  1106. else begin
  1107. if (SelSt_i) begin
  1108. if (Lag_i != 0) begin
  1109. if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1110. mosiReg3 <= mosiReg3 >> 1;
  1111. mosiReg2 <= mosiReg2 >> 1;
  1112. mosiReg1 <= mosiReg1 >> 1;
  1113. mosiReg0 <= mosiReg0 >> 1;
  1114. end
  1115. else begin
  1116. mosiReg3 <= SpiData_i[1:0];
  1117. mosiReg2 <= SpiData_i[3:2];
  1118. mosiReg1 <= SpiData_i[5:4];
  1119. mosiReg0 <= SpiData_i[7:6];
  1120. end
  1121. end else begin
  1122. if (!ss&& (ssCnt < txLenght-1)) begin
  1123. mosiReg3 <= mosiReg3 >> 1;
  1124. mosiReg2 <= mosiReg2 >> 1;
  1125. mosiReg1 <= mosiReg1 >> 1;
  1126. mosiReg0 <= mosiReg0 >> 1;
  1127. end
  1128. else begin
  1129. mosiReg3 <= SpiData_i[1:0];
  1130. mosiReg2 <= SpiData_i[3:2];
  1131. mosiReg1 <= SpiData_i[5:4];
  1132. mosiReg0 <= SpiData_i[7:6];
  1133. end
  1134. end
  1135. end
  1136. else begin
  1137. if (Lag_i != 0) begin
  1138. if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
  1139. mosiReg3 <= mosiReg3 >> 1;
  1140. mosiReg2 <= mosiReg2 >> 1;
  1141. mosiReg1 <= mosiReg1 >> 1;
  1142. mosiReg0 <= mosiReg0 >> 1;
  1143. end
  1144. else begin
  1145. mosiReg3 <= SpiData_i[1:0];
  1146. mosiReg2 <= SpiData_i[3:2];
  1147. mosiReg1 <= SpiData_i[5:4];
  1148. mosiReg0 <= SpiData_i[7:6];
  1149. end
  1150. end else begin
  1151. if (!ss&& (ssCnt < txLenght-1)) begin
  1152. mosiReg3 <= mosiReg3 >> 1;
  1153. mosiReg2 <= mosiReg2 >> 1;
  1154. mosiReg1 <= mosiReg1 >> 1;
  1155. mosiReg0 <= mosiReg0 >> 1;
  1156. end
  1157. else begin
  1158. mosiReg3 <= SpiData_i[1:0];
  1159. mosiReg2 <= SpiData_i[3:2];
  1160. mosiReg1 <= SpiData_i[5:4];
  1161. mosiReg0 <= SpiData_i[7:6];
  1162. end
  1163. end
  1164. end
  1165. end
  1166. end
  1167. endcase
  1168. end
  1169. end
  1170. endmodule