QuadSPIs.v 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. module QuadSPIs (
  2. input Clk_i,
  3. input Rst_i,
  4. input Sck_i,
  5. input Ss_i,
  6. input Mosi0_i,
  7. input Mosi1_i,
  8. input Mosi2_i,
  9. input Mosi3_i,
  10. input [1:0] WidthSel_i,
  11. input SELST_i,
  12. input EndianSel_i,
  13. output reg [23:0] Data_o,
  14. output reg [7:0] Addr_o,
  15. output [31:0] DataToRxFifo_o,
  16. output reg Val_o
  17. );
  18. //================================================================================
  19. // REG/WIRE
  20. //================================================================================
  21. reg ssReg;
  22. reg ssRegR;
  23. reg SckReg;
  24. reg [7:0] addrReg;
  25. reg [7:0] shiftReg0;
  26. reg [7:0] shiftReg1;
  27. reg [7:0] shiftReg2;
  28. reg [7:0] addrRegLSB;
  29. reg [7:0] shiftReg0LSB;
  30. reg [7:0] shiftReg1LSB;
  31. reg [7:0] shiftReg2LSB;
  32. reg [7:0] shiftReg0M;
  33. reg [7:0] shiftReg1M;
  34. reg [7:0] shiftReg2M;
  35. reg [7:0] addrRegM;
  36. //===============================================================================
  37. // ASSIGNMENTS
  38. assign DataToRxFifo_o = {Addr_o, Data_o};
  39. //================================================================================
  40. // CODING
  41. //================================================================================
  42. always @(posedge Clk_i) begin
  43. ssReg <= Ss_i;
  44. ssRegR <= ssReg;
  45. end
  46. always @(*) begin
  47. if (Rst_i) begin
  48. addrRegM = 8'h0;
  49. shiftReg0M = 8'h0;
  50. shiftReg1M = 8'h0;
  51. shiftReg2M = 8'h0;
  52. end
  53. else begin
  54. if (!EndianSel_i) begin
  55. case(WidthSel_i)
  56. 0: begin
  57. addrRegM = addrReg [1:0];
  58. shiftReg0M = shiftReg0[1:0];
  59. shiftReg1M = shiftReg1[1:0];
  60. shiftReg2M = shiftReg2[1:0];
  61. end
  62. 1: begin
  63. addrRegM = addrReg [3:0];
  64. shiftReg0M = shiftReg0[3:0];
  65. shiftReg1M = shiftReg1[3:0];
  66. shiftReg2M = shiftReg2[3:0];
  67. end
  68. 2: begin
  69. addrRegM = addrReg [5:0];
  70. shiftReg0M = shiftReg0[5:0];
  71. shiftReg1M = shiftReg1[5:0];
  72. shiftReg2M = shiftReg2[5:0];
  73. end
  74. 3: begin
  75. addrRegM = addrReg [7:0];
  76. shiftReg0M = shiftReg0[7:0];
  77. shiftReg1M = shiftReg1[7:0];
  78. shiftReg2M = shiftReg2[7:0];
  79. end
  80. endcase
  81. end
  82. else begin
  83. case(WidthSel_i)
  84. 0: begin
  85. addrRegM = addrRegLSB[1:0];
  86. shiftReg0M = shiftReg0LSB[1:0];
  87. shiftReg1M = shiftReg1LSB[1:0];
  88. shiftReg2M = shiftReg2LSB[1:0];
  89. end
  90. 1: begin
  91. addrRegM = addrRegLSB[3:0];
  92. shiftReg0M = shiftReg0LSB[3:0];
  93. shiftReg1M = shiftReg1LSB[3:0];
  94. shiftReg2M = shiftReg2LSB[3:0];
  95. end
  96. 2: begin
  97. addrRegM = addrRegLSB[5:0];
  98. shiftReg0M = shiftReg0LSB[5:0];
  99. shiftReg1M = shiftReg1LSB[5:0];
  100. shiftReg2M = shiftReg2LSB[5:0];
  101. end
  102. 3: begin
  103. addrRegM = addrRegLSB[7:0];
  104. shiftReg0M = shiftReg0LSB[7:0];
  105. shiftReg1M = shiftReg1LSB[7:0];
  106. shiftReg2M = shiftReg2LSB[7:0];
  107. end
  108. endcase
  109. end
  110. end
  111. end
  112. always @(posedge Clk_i) begin
  113. if (Rst_i) begin
  114. Data_o <= 24'h0;
  115. end
  116. else begin
  117. if (!EndianSel_i) begin
  118. if (SELST_i) begin
  119. if (ssReg && !ssRegR) begin
  120. Data_o <= {shiftReg0M, shiftReg1M, shiftReg2M};
  121. end
  122. end
  123. else begin
  124. if (!ssReg && ssRegR) begin
  125. Data_o <= {shiftReg0M, shiftReg1M, shiftReg2M};
  126. end
  127. end
  128. end
  129. else begin
  130. if (SELST_i) begin
  131. if (ssReg && !ssRegR) begin
  132. Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
  133. end
  134. end
  135. else begin
  136. if (!ssReg && ssRegR) begin
  137. Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
  138. end
  139. end
  140. end
  141. end
  142. end
  143. always @(posedge Clk_i) begin
  144. if (Rst_i) begin
  145. Addr_o <= 8'h0;
  146. end
  147. else begin
  148. if (SELST_i) begin
  149. if (ssReg && !ssRegR) begin
  150. Addr_o <= addrRegM;
  151. end
  152. end
  153. else begin
  154. if (!ssReg && ssRegR) begin
  155. Addr_o <= addrRegM;
  156. end
  157. end
  158. end
  159. end
  160. always @(posedge Sck_i) begin
  161. if (Rst_i) begin
  162. shiftReg0 <= 8'h0;
  163. end
  164. else begin
  165. if (SELST_i) begin
  166. if (!Ss_i) begin
  167. shiftReg0 <= {shiftReg0[6:0], Mosi1_i};
  168. end
  169. else begin
  170. shiftReg0 <= 8'h0;
  171. end
  172. end
  173. else begin
  174. if (Ss_i) begin
  175. shiftReg0 <= {shiftReg0[6:0], Mosi1_i};
  176. end
  177. else begin
  178. shiftReg0<= 8'h0;
  179. end
  180. end
  181. end
  182. end
  183. always @(posedge Sck_i ) begin
  184. if (Rst_i) begin
  185. shiftReg1 <= 8'h0;
  186. end
  187. else begin
  188. if (SELST_i) begin
  189. if (!Ss_i) begin
  190. shiftReg1 <= {shiftReg1[6:0], Mosi2_i};
  191. end
  192. else begin
  193. shiftReg1 <= 8'h0;
  194. end
  195. end
  196. else begin
  197. if (Ss_i) begin
  198. shiftReg1 <= {shiftReg1[6:0], Mosi2_i};
  199. end
  200. else begin
  201. shiftReg1 <= 8'h0;
  202. end
  203. end
  204. end
  205. end
  206. always @(posedge Sck_i ) begin
  207. if (Rst_i) begin
  208. shiftReg2 <= 8'h0;
  209. end
  210. else begin
  211. if (SELST_i) begin
  212. if (!Ss_i) begin
  213. shiftReg2 <= {shiftReg2[6:0], Mosi3_i};
  214. end
  215. else begin
  216. shiftReg2 <= 8'h0;
  217. end
  218. end
  219. else begin
  220. if (Ss_i) begin
  221. shiftReg2 <= {shiftReg2[6:0], Mosi3_i};
  222. end
  223. else begin
  224. shiftReg2 <= 8'h0;
  225. end
  226. end
  227. end
  228. end
  229. always @(posedge Sck_i or posedge Rst_i ) begin
  230. if (Rst_i) begin
  231. addrReg <= 8'h0;
  232. end
  233. else begin
  234. if (SELST_i) begin
  235. if (!Ss_i) begin
  236. addrReg <={addrReg[6:0], Mosi0_i};
  237. end
  238. else begin
  239. addrReg <= 8'h0;
  240. end
  241. end
  242. else begin
  243. if (Ss_i) begin
  244. addrReg <= {addrReg[6:0], Mosi0_i};
  245. end
  246. else begin
  247. addrReg <= 8'h0;
  248. end
  249. end
  250. end
  251. end
  252. always @(posedge Sck_i or posedge Rst_i) begin
  253. if (Rst_i) begin
  254. addrRegLSB <= 8'h0;
  255. end
  256. else begin
  257. if (SELST_i) begin
  258. if (!Ss_i) begin
  259. addrRegLSB <= {Mosi3_i, addrRegLSB[7:1]};
  260. end
  261. else begin
  262. addrRegLSB <= 8'h0;
  263. end
  264. end
  265. else begin
  266. if (Ss_i) begin
  267. addrRegLSB <= {Mosi3_i, addrRegLSB[7:1]};
  268. end
  269. else begin
  270. addrRegLSB <= 8'h0;
  271. end
  272. end
  273. end
  274. end
  275. always @(posedge Sck_i or posedge Rst_i) begin
  276. if (Rst_i) begin
  277. shiftReg0LSB <= 8'h0;
  278. end
  279. else begin
  280. if (SELST_i) begin
  281. if (!Ss_i) begin
  282. shiftReg0LSB <= {Mosi0_i, shiftReg0LSB[7:1]};
  283. end
  284. else begin
  285. shiftReg0LSB <= 8'h0;
  286. end
  287. end
  288. else begin
  289. if (Ss_i) begin
  290. shiftReg0LSB <= {Mosi0_i, shiftReg0LSB[7:1]};
  291. end
  292. else begin
  293. shiftReg0LSB <= 8'h0;
  294. end
  295. end
  296. end
  297. end
  298. always @(posedge Sck_i or posedge Rst_i) begin
  299. if (Rst_i) begin
  300. shiftReg1LSB <= 8'h0;
  301. end
  302. else begin
  303. if (SELST_i) begin
  304. if (!Ss_i) begin
  305. shiftReg1LSB <= {Mosi1_i, shiftReg1LSB[7:1]};
  306. end
  307. else begin
  308. shiftReg1LSB <= 8'h0;
  309. end
  310. end
  311. else begin
  312. if (Ss_i) begin
  313. shiftReg1LSB <= {Mosi1_i, shiftReg1LSB[7:1]};
  314. end
  315. else begin
  316. shiftReg1LSB <= 8'h0;
  317. end
  318. end
  319. end
  320. end
  321. always @(posedge Sck_i or posedge Rst_i) begin
  322. if (Rst_i) begin
  323. shiftReg2LSB <= 8'h0;
  324. end
  325. else begin
  326. if (SELST_i) begin
  327. if (!Ss_i) begin
  328. shiftReg2LSB <= {Mosi2_i, shiftReg2LSB[7:1]};
  329. end
  330. else begin
  331. shiftReg2LSB <= 8'h0;
  332. end
  333. end
  334. else begin
  335. if (Ss_i) begin
  336. shiftReg2LSB <= {Mosi2_i, shiftReg2LSB[7:1]};
  337. end
  338. else begin
  339. shiftReg2LSB <= 8'h0;
  340. end
  341. end
  342. end
  343. end
  344. always @(posedge Clk_i) begin
  345. if (SELST_i) begin
  346. if (ssReg && !ssRegR) begin
  347. Val_o <= 1'b1;
  348. end
  349. else begin
  350. Val_o <= 1'b0;
  351. end
  352. end
  353. else begin
  354. if (!ssReg&& ssRegR) begin
  355. Val_o <= 1'b1;
  356. end
  357. else begin
  358. Val_o <= 1'b0;
  359. end
  360. end
  361. end
  362. endmodule