QuadSPIm.v 39 KB

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