Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer: Larry Qu
  5. //
  6. // Create Date: 23:26:35 01/13/2020
  7. // Design Name:
  8. // Module Name: swcounter
  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 swcounter(
  22. //inputs
  23. SEL, ADJ, RST_S, PSE_S, CLK1, CLK2,
  24.  
  25. //outputs
  26. M_H, M_L, S_H, S_L
  27. //seconds
  28. );
  29.  
  30.  
  31. output reg[2:0] M_H = 3'b0; //tens digit of minutes
  32. output reg[3:0] M_L = 4'b0; //ones digit of minutes
  33. output reg[2:0] S_H = 3'b0; //tens digit of seconds
  34. output reg[3:0] S_L = 4'b0; //ones digit of seconds
  35.  
  36.  
  37. input SEL; //select button
  38. input ADJ; //adjust button
  39. input RST_S; //reset button
  40. input PSE_S; //pause button
  41. input CLK1; //1 Hz clock
  42. input CLK2; //2 Hz clock
  43.  
  44. //output[11:0] seconds;
  45. //reg[11:0] seconds = 12'b0; //register to store 0 to 3599
  46.  
  47. reg[0:0] pause = 1'b0; //register to store pause value
  48.  
  49. //use one always block for everything, use conditionals to separate
  50. always @(posedge PSE_S or posedge RST_S or posedge CLK1 or posedge CLK2)
  51. begin
  52. //if pause button is hit
  53. if(PSE_S)
  54. begin
  55. pause <= ~pause;
  56. end
  57.  
  58. //if reset button is hit
  59. else if(RST_S)
  60. begin
  61. S_L <= 4'b0;
  62. S_H <= 3'b0;
  63. M_L <= 4'b0;
  64. M_H <= 3'b0;
  65. end
  66.  
  67.  
  68. //if adjustment is high, run adjustment mode
  69. else if(ADJ && !pause && CLK2)
  70. begin
  71. //if(!pause && CLK2) //if not paused and adj is selected, enter adjustment mode, otherwise do nothing
  72. //begin
  73. if(SEL) //is SEL == 1, then increment seconds, otherwise increment minutes
  74. begin
  75. if (M_H == 3'b101 && M_L == 4'b1001 && S_H == 3'b101 && S_L == 4'b1000) //if we hit 59:59, pause
  76. begin
  77. S_L = 4'b1001;
  78. pause <= 1'b1;
  79. end
  80. else
  81. begin
  82. if(S_L == 4'b1001) //otherwise, increment
  83. begin
  84. S_L = 4'b0;
  85. if(S_H == 3'b101) //seconds high
  86. begin
  87. S_H = 3'b0;
  88. if(M_L == 4'b1001) //minutes low
  89. begin
  90. M_L = 4'b0;
  91. if(M_H == 3'b101) //minutes high
  92. begin
  93. pause = 1;
  94. end
  95. else
  96. begin
  97. M_H = M_H + 1;
  98. end
  99. end
  100. else
  101. begin
  102. M_L = M_L + 1;
  103. end
  104. end
  105. else
  106. begin
  107. S_H = S_H + 1;
  108. end
  109. end
  110. else
  111. begin
  112. S_L = S_L + 1;
  113. end
  114. end
  115. if (M_H == 3'b101 && M_L == 4'b1001 && S_H == 3'b101 && S_L == 4'b1000) //if we hit 59:59, pause
  116. begin
  117. S_L = 4'b1001;
  118. pause <= 1'b1;
  119. end
  120. else
  121. begin
  122. if(S_L == 4'b1001) //otherwise, increment
  123. begin
  124. S_L = 4'b0;
  125. if(S_H == 3'b101) //seconds high
  126. begin
  127. S_H = 3'b0;
  128. if(M_L == 4'b1001) //minutes low
  129. begin
  130. M_L = 4'b0;
  131. if(M_H == 3'b101) //minutes high
  132. begin
  133. pause = 1;
  134. end
  135. else
  136. begin
  137. M_H = M_H + 1;
  138. end
  139. end
  140. else
  141. begin
  142. M_L = M_L + 1;
  143. end
  144. end
  145. else
  146. begin
  147. S_H = S_H + 1;
  148. end
  149. end
  150. else
  151. begin
  152. S_L = S_L + 1;
  153. end
  154. end
  155. end
  156. else
  157. begin
  158. if (M_H == 3'b101 && (M_L == 4'b1001) ) //if we hit 58:xx or 59:xx, pause
  159. begin
  160. M_L = 4'b1001;
  161. pause <= 1'b1;
  162. end
  163. else
  164. begin
  165. if(M_L == 4'b1000) //minutes low
  166. begin
  167. M_L = 4'b0;
  168. if(M_H == 3'b101) //minutes high
  169. begin
  170. pause = 1;
  171. end
  172. else
  173. begin
  174. M_H = M_H + 1;
  175. end
  176. end
  177. else
  178. begin
  179. M_L = M_L + 1;
  180. end
  181. end
  182. if (M_H == 3'b101 && (M_L == 4'b1001) ) //if we hit 58:xx or 59:xx, pause
  183. begin
  184. M_L = 4'b1001;
  185. pause <= 1'b1;
  186. end
  187. else
  188. begin
  189. if(M_L == 4'b1000) //minutes low
  190. begin
  191. M_L = 4'b0;
  192. if(M_H == 3'b101) //minutes high
  193. begin
  194. pause = 1;
  195. end
  196. else
  197. begin
  198. M_H = M_H + 1;
  199. end
  200. end
  201. else
  202. begin
  203. M_L = M_L + 1;
  204. end
  205. end
  206. end
  207. //end
  208. end
  209.  
  210.  
  211. //otherwise run normally on regular clock pulse
  212. else if(!ADJ && CLK1 && !pause)
  213. begin
  214. //if(!pause && !ADJ) //if not paused and not in adjustment mode, run normally
  215. //begin
  216. if (M_H == 3'b101 && M_L == 4'b1001 && S_H == 3'b101 && S_L == 4'b1000) //if we hit 59:59, pause
  217. begin
  218. S_L = 4'b1001;
  219. pause <= 1'b1;
  220. end
  221. else
  222. begin
  223. if(S_L == 4'b1001) //otherwise, increment
  224. begin
  225. S_L = 4'b0;
  226. if(S_H == 3'b101) //seconds high
  227. begin
  228. S_H = 3'b0;
  229. if(M_L == 4'b1001) //minutes low
  230. begin
  231. M_L = 4'b0;
  232. if(M_H == 3'b101) //minutes high
  233. begin
  234. pause = 1;
  235. end
  236. else
  237. begin
  238. M_H = M_H + 1;
  239. end
  240. end
  241. else
  242. begin
  243. M_L = M_L + 1;
  244. end
  245. end
  246. else
  247. begin
  248. S_H = S_H + 1;
  249. end
  250. end
  251. else
  252. begin
  253. S_L = S_L + 1;
  254. end
  255. end
  256. //end
  257. end
  258.  
  259. else
  260. begin
  261. end
  262.  
  263. end
  264.  
  265. /*
  266. //pause button
  267. always @(posedge PSE_S) //every time we press the pause button, change value of pause
  268. begin
  269. pause <= ~pause;
  270. end
  271. */
  272.  
  273. /*
  274. //reset button
  275. always @(posedge RST_S)
  276. begin
  277. seconds <= 12'b0;
  278. end
  279. */
  280.  
  281. /*
  282. //standard counting
  283. always @(posedge CLK1)
  284. begin
  285. if(!pause && !ADJ) //if not paused and not in adjustment mode, run normally
  286. begin
  287. if (seconds == 12'b111000001111) //if we hit 59:59, pause
  288. begin
  289. seconds <= seconds;
  290. pause <= 1'b1;
  291. end
  292. else
  293. begin
  294. seconds <= seconds + 1; //otherwise, increment
  295. end
  296. end
  297. end
  298. */
  299.  
  300. /*
  301. //fast counting for adjustment, always clk2, use enable
  302. always @(posedge CLK2)
  303. begin
  304. if(!pause && ADJ) //if not paused and adj is selected, enter adjustment mode, otherwise do nothing
  305. begin
  306. if(SEL) //is SEL == 1, then increment seconds, otherwise increment minutes
  307. begin
  308. seconds <= seconds + 2;
  309. if (seconds >= 12'b111000001111) //if we hit 59:59, pause
  310. begin
  311. seconds <= 12'b111000001111;
  312. pause <= 1'b1;
  313. end
  314. end
  315. else
  316. begin
  317. seconds <= seconds + 60;
  318. if (seconds >= 12'b111000001111) //if we hit 59:59, pause
  319. begin
  320. seconds <= 12'b111000001111;
  321. pause <= 1'b1;
  322. end
  323. end
  324. end
  325. end
  326. */
  327.  
  328. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement