PulseGenV2.v 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. //`timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 10:02:35 04/20/2020
  7. // Design Name:
  8. // Module Name: PulseGen
  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. module PulseGen
  22. #(
  23. parameter CmdRegWidth = 32
  24. )
  25. (
  26. input Rst_i,
  27. input Clk_i,
  28. input EnPulse_i,
  29. input PulsePol_i,
  30. input EnEdge_i,
  31. input [CmdRegWidth-29:0] Mode_i,
  32. input [CmdRegWidth-1:0] P1Del_i,
  33. input [CmdRegWidth-1:0] P2Del_i,
  34. input [CmdRegWidth-1:0] P3Del_i,
  35. input [CmdRegWidth-1:0] P1Width_i,
  36. input [CmdRegWidth-1:0] P2Width_i,
  37. input [CmdRegWidth-1:0] P3Width_i,
  38. output Pulse_o
  39. );
  40. //================================================================================
  41. // LOCALPARAM
  42. localparam IDLE = 2'h0;
  43. localparam DELAY = 2'h1;
  44. localparam PULSE = 2'h2;
  45. localparam DISABLED = 8'd0;
  46. localparam SINGLE = 8'd1;
  47. localparam DOUBLE = 8'd2;
  48. localparam TRIPPLE = 8'd3;
  49. localparam BURST = 8'd4;
  50. localparam CONTINIOUS = 8'd5;
  51. //================================================================================
  52. reg pulse;
  53. wire [31:0] delArray [2:0];
  54. wire [31:0] widthArray [2:0];
  55. reg [31:0] pulseCnt;
  56. reg [31:0] delayCnt;
  57. reg [31:0] widthCnt;
  58. reg [31:0] currWidthValue;
  59. reg [31:0] currDelValue;
  60. reg [1:0] currState;
  61. reg [1:0] nextState;
  62. reg pulseDone;
  63. wire delayDone = (currState == DELAY)? delayCnt==currDelValue-1:1'b0;
  64. wire zeroDelay = (P1Del_i==0);
  65. reg patternDone;
  66. reg enPulseR;
  67. wire enPulsePos = (!enPulseR&EnPulse_i);
  68. wire enPulseNeg = (enPulseR&!EnPulse_i);
  69. wire enPulse = (EnEdge_i)? enPulseNeg:enPulsePos;
  70. wire enPulseEn = (Mode_i != 0)? enPulse:1'b0;
  71. //================================================================================
  72. // ASSIGNMENTS
  73. assign delArray [0] = P1Del_i;
  74. assign delArray [1] = P2Del_i;
  75. assign delArray [2] = P3Del_i;
  76. assign widthArray [0] = P1Width_i;
  77. assign widthArray [1] = P2Width_i;
  78. assign widthArray [2] = P3Width_i;
  79. assign Pulse_o = (PulsePol_i)? ~pulse:pulse;
  80. //================================================================================
  81. // CODING
  82. always @(posedge Clk_i) begin
  83. if (!Rst_i) begin
  84. enPulseR <= EnPulse_i;
  85. end else begin
  86. enPulseR <= 1'b0;
  87. end
  88. end
  89. always @(posedge Clk_i) begin
  90. if (!Rst_i) begin
  91. if (Mode_i >=1 & Mode_i<=3) begin
  92. if (currState != IDLE) begin
  93. delayCnt <= delayCnt+1;
  94. end else begin
  95. delayCnt <= 0;
  96. end
  97. end else begin
  98. if (currState == DELAY) begin
  99. delayCnt <= delayCnt+1;
  100. end else begin
  101. delayCnt <= 0;
  102. end
  103. end
  104. end else begin
  105. delayCnt <= 0;
  106. end
  107. end
  108. always @(posedge Clk_i) begin
  109. if (!Rst_i) begin
  110. if (currState == PULSE) begin
  111. widthCnt <= widthCnt+1;
  112. end else begin
  113. widthCnt <= 0;
  114. end
  115. end else begin
  116. widthCnt <= 0;
  117. end
  118. end
  119. always @(*) begin
  120. if (!Rst_i) begin
  121. if (currState == PULSE) begin
  122. if (widthCnt==currWidthValue-1) begin
  123. pulseDone = 1'b1;
  124. end else begin
  125. pulseDone = 1'b0;
  126. end
  127. end else begin
  128. pulseDone = 1'b0;
  129. end
  130. end else begin
  131. pulseDone = 1'b0;
  132. end
  133. end
  134. always @(posedge Clk_i) begin
  135. if (!Rst_i) begin
  136. if (pulseDone) begin
  137. if (!patternDone) begin
  138. pulseCnt <= pulseCnt+1;
  139. end else begin
  140. pulseCnt <= 0;
  141. end
  142. end
  143. end else begin
  144. pulseCnt <= 0;
  145. end
  146. end
  147. always @(posedge Clk_i) begin
  148. if (!Rst_i) begin
  149. if (Mode_i == 0) begin
  150. currDelValue <= 0;
  151. currWidthValue <= 0;
  152. end else begin
  153. if (Mode_i >=1 & Mode_i<=3) begin
  154. currDelValue <= delArray[pulseCnt];
  155. currWidthValue <= widthArray[pulseCnt];
  156. end else begin
  157. if (Mode_i == 4|Mode_i == 5) begin
  158. if (currState == IDLE) begin
  159. currDelValue <= delArray[0];
  160. currWidthValue <= widthArray[0];
  161. end else if (currState == PULSE & pulseDone) begin
  162. currDelValue <= delArray[1];
  163. currWidthValue <= widthArray[0];
  164. end
  165. end
  166. end
  167. end
  168. end else begin
  169. currDelValue <= 0;
  170. currWidthValue <= 0;
  171. end
  172. end
  173. always @(*) begin
  174. if (!Rst_i) begin
  175. if (currState != IDLE) begin
  176. case(Mode_i)
  177. 8'd0: begin
  178. patternDone = 0;
  179. end
  180. 8'd1: begin
  181. patternDone = ((pulseCnt==Mode_i-1)&pulseDone);
  182. end
  183. 8'd2: begin
  184. patternDone = ((pulseCnt==Mode_i-1)&pulseDone);
  185. end
  186. 8'd3: begin
  187. patternDone = ((pulseCnt==Mode_i-1)&pulseDone);
  188. end
  189. 8'd4: begin
  190. patternDone = ((pulseCnt==P2Width_i-1)&pulseDone);
  191. end
  192. 8'd5: begin
  193. patternDone = 0;
  194. end
  195. default :begin
  196. patternDone = 0;
  197. end
  198. endcase
  199. end else begin
  200. patternDone = 0;
  201. end
  202. end else begin
  203. patternDone = 0;
  204. end
  205. end
  206. always @(posedge Clk_i) begin
  207. if (!Rst_i) begin
  208. currState <= nextState;
  209. end else begin
  210. currState <= IDLE;
  211. end
  212. end
  213. always @(*) begin
  214. nextState = IDLE;
  215. case(currState)
  216. IDLE : begin
  217. if (enPulseEn) begin
  218. if (zeroDelay) begin
  219. nextState = PULSE;
  220. end else begin
  221. nextState = DELAY;
  222. end
  223. end else begin
  224. nextState = IDLE;
  225. end
  226. end
  227. DELAY : begin
  228. if (delayDone) begin
  229. nextState = PULSE;
  230. end else begin
  231. nextState = DELAY;
  232. end
  233. end
  234. PULSE : begin
  235. if (pulseDone) begin
  236. if (!patternDone) begin
  237. nextState = DELAY;
  238. end else begin
  239. nextState = IDLE;
  240. end
  241. end else begin
  242. nextState = PULSE;
  243. end
  244. end
  245. endcase
  246. end
  247. always @(*) begin
  248. if (!Rst_i) begin
  249. if (Mode_i != 0) begin
  250. case(currState)
  251. IDLE: begin
  252. pulse = 1'b0;
  253. end
  254. DELAY: begin
  255. pulse = 1'b0;
  256. end
  257. PULSE: begin
  258. pulse = 1'b1;
  259. end
  260. default:begin
  261. pulse = 1'b0;
  262. end
  263. endcase
  264. end else begin
  265. pulse = 1'b0;
  266. end
  267. end else begin
  268. pulse = 1'b0;
  269. end
  270. end
  271. endmodule