DspSmcModel.v 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 01.09.2022 15:03:04
  7. // Design Name:
  8. // Module Name: DspModel
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. // 2BYTES ADDRESING
  22. // 0->2->4->6
  23. //
  24. //////////////////////////////////////////////////////////////////////////////////
  25. module DspSmcModel
  26. #(
  27. parameter DwordsNum = 5,
  28. parameter DataToClkRate = 4, //data changes every 4th clk negedge
  29. parameter SmcWrBaseAddr = 4, //data changes every 4th clk negedge
  30. parameter SmcRdBaseAddr = 1, //data changes every 4th clk negedge
  31. parameter [15:0] SmcBaseData = 16'h5, //data changes every 4th clk negedge
  32. parameter Offset = 2, //data changes every 4th clk negedge
  33. parameter WordsNum = 10 //data changes every 4th clk negedge
  34. )
  35. (
  36. input Clk120MHz_i,
  37. input RstN_i,
  38. inout [15:0] SmcD_o,
  39. output [10:0] SmcA_o,
  40. output SmcAwe_o,
  41. output SmcAmsN_o,
  42. output SmcAoe_o,
  43. output SmcAre_o,
  44. output [1:0] SmcBe_o,
  45. input Start_i
  46. );
  47. //================================================================================
  48. // REG/WIRE
  49. reg smcAmsN;
  50. reg smcAoe;
  51. reg smcAwe;
  52. reg smcAre;
  53. reg [1:0] smcBe;
  54. reg [1:0] writeSetupDelay;
  55. reg [1:0] writeAccessDelay;
  56. reg [1:0] writeHoldDelay;
  57. reg [1:0] transTurnDelay;
  58. reg [1:0] readSetupDelay;
  59. reg [1:0] readAccessDelay;
  60. reg [24:0] smcAddr;
  61. reg [15:0] smcData;
  62. reg [3:0] currState;
  63. reg [3:0] wordsCnt;
  64. wire txDone;
  65. //================================================================================
  66. // LOCALPARAM
  67. localparam IDLE = 3'h0;
  68. localparam WriteSetup = 3'h1;
  69. localparam WriteAccess = 3'h2;
  70. localparam WriteHold = 3'h3;
  71. localparam TramsTurn = 3'h4;
  72. localparam ReadSetup = 3'h5;
  73. localparam ReadAccess = 3'h6;
  74. localparam ReadHold = 3'h7;
  75. //================================================================================
  76. // ASSIGNMENTS
  77. assign SmcA_o = smcAddr;
  78. assign SmcD_o = (!SmcAre_o)? 15'bz:smcData;
  79. assign SmcAwe_o = smcAwe;
  80. assign SmcAmsN_o = smcAmsN;
  81. assign SmcAoe_o = smcAoe;
  82. assign SmcAre_o = smcAre;
  83. assign SmcBe_o = smcBe;
  84. assign txDone = wordsCnt==WordsNum-1;
  85. //================================================================================
  86. // CODING
  87. always @(posedge Clk120MHz_i or negedge RstN_i) begin
  88. if (!RstN_i) begin
  89. wordsCnt <= 0;
  90. end else begin
  91. if (currState == TramsTurn) begin
  92. if (smcAmsN) begin
  93. if (wordsCnt!=WordsNum-1) begin
  94. wordsCnt <= wordsCnt+4'd1;
  95. end else begin
  96. wordsCnt <= 0;
  97. end
  98. end
  99. end
  100. end
  101. end
  102. always @(negedge Clk120MHz_i or negedge RstN_i) begin
  103. if (!RstN_i) begin
  104. currState <= 0;
  105. smcAddr <= 0;
  106. smcData <= 0;
  107. smcAmsN <= 1'b1;
  108. smcAoe <= 1'b1;
  109. smcAwe <= 1'b1;
  110. smcAre <= 1'b1;
  111. smcBe <= 2'b00;
  112. writeSetupDelay <= 2'b01;
  113. writeAccessDelay<= 4'b01;
  114. writeHoldDelay <= 2'b01;
  115. transTurnDelay <= 2'b01;
  116. readSetupDelay <= 3'b01;
  117. readAccessDelay <= 5'b01;
  118. end else begin
  119. case(currState)
  120. IDLE: begin
  121. if (Start_i) begin
  122. currState <= WriteSetup;
  123. smcAmsN <= 1'b0;
  124. smcAddr <= wordsCnt;
  125. smcData <= wordsCnt;
  126. smcAmsN <= 1'b0;
  127. smcAoe <= 1'b1;
  128. smcAre <= 1'b1;
  129. smcAwe <= 1'b1;
  130. smcBe <= 2'b00;
  131. end else begin
  132. currState <= IDLE;
  133. end
  134. end
  135. WriteSetup: begin
  136. if (writeSetupDelay[0]) begin
  137. currState <= WriteAccess;
  138. smcAwe <= 1'b0;
  139. writeSetupDelay <= 2'b01;
  140. end else begin
  141. currState <= WriteSetup;
  142. writeSetupDelay <= writeSetupDelay<<1;
  143. end
  144. end
  145. WriteAccess:begin
  146. if (writeAccessDelay[0]) begin
  147. currState <= WriteHold;
  148. writeAccessDelay<= 4'b0001;
  149. smcAwe <= 1'b1;
  150. end else begin
  151. currState <= WriteAccess;
  152. writeAccessDelay<= writeAccessDelay<<1;
  153. end
  154. end
  155. WriteHold :begin
  156. if (writeHoldDelay[0]) begin
  157. currState <= TramsTurn;
  158. writeHoldDelay<= 2'b01;
  159. smcAmsN <= 1'b1;
  160. end else begin
  161. currState <= WriteHold;
  162. writeHoldDelay<= writeHoldDelay<<1;
  163. end
  164. end
  165. TramsTurn :begin
  166. if (transTurnDelay[0]) begin
  167. if (!txDone) begin
  168. currState <= WriteSetup;
  169. smcAmsN <= 1'b0;
  170. smcAddr <= wordsCnt;
  171. smcData <= wordsCnt;
  172. smcAmsN <= 1'b0;
  173. smcAoe <= 1'b1;
  174. smcAre <= 1'b1;
  175. smcAwe <= 1'b1;
  176. smcBe <= 2'b00;
  177. end else begin
  178. currState <= ReadSetup;
  179. transTurnDelay<= 2'b01;
  180. smcAmsN <= 1'b0;
  181. smcAoe <= 1'b0;
  182. smcAddr <= SmcRdBaseAddr;
  183. end
  184. end else begin
  185. currState <= TramsTurn;
  186. transTurnDelay<= transTurnDelay<<1;
  187. end
  188. end
  189. ReadSetup :begin
  190. if (readSetupDelay[0]) begin
  191. currState <= ReadAccess;
  192. readSetupDelay<= 3'b001;
  193. smcAre <= 1'b0;
  194. end else begin
  195. currState <= ReadSetup;
  196. readSetupDelay <= readSetupDelay<<1;
  197. end
  198. end
  199. ReadAccess :begin
  200. if (readAccessDelay[0]) begin
  201. currState <= ReadHold;
  202. readAccessDelay<= 5'b00001;
  203. smcAre <= 1'b1;
  204. end else begin
  205. currState <= ReadAccess;
  206. readAccessDelay <= readAccessDelay<<1;
  207. end
  208. end
  209. ReadHold :begin
  210. currState <= IDLE;
  211. smcAmsN <=1'b1;
  212. smcAoe <= 1'b1;
  213. end
  214. endcase
  215. end
  216. end
  217. endmodule