各种功能的计数器.vhd
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:6k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- MAX+plus II VHDL Example
  2. -- Efficient Counter Inference
  3. -- Copyright (c) 1994 Altera Corporation
  4. -- download from:www.pld.com.cn & www.fpga.com.cn
  5. Library IEEE ;
  6. use IEEE.std_logic_1164.all ;
  7. use IEEE.std_logic_arith.all ;
  8. ENTITY counters IS
  9. PORT
  10. (
  11. d : IN  INTEGER RANGE 0 TO 255;
  12. clk : IN BIT;
  13. clear : IN BIT;
  14. ld : IN BIT;
  15. enable : IN BIT;
  16. up_down : IN BIT;
  17. qa : OUT  INTEGER RANGE 0 TO 255;
  18. qb : OUT  INTEGER RANGE 0 TO 255;
  19. qc : OUT  INTEGER RANGE 0 TO 255;
  20. qd : OUT  INTEGER RANGE 0 TO 255;
  21. qe : OUT  INTEGER RANGE 0 TO 255;
  22. qf : OUT  INTEGER RANGE 0 TO 255;
  23. qg : OUT  INTEGER RANGE 0 TO 255;
  24. qh : OUT  INTEGER RANGE 0 TO 255;
  25. qi : OUT  INTEGER RANGE 0 TO 255;
  26. qj : OUT  INTEGER RANGE 0 TO 255;
  27. qk : OUT  INTEGER RANGE 0 TO 255;
  28. ql : OUT  INTEGER RANGE 0 TO 255;
  29. qm : OUT  INTEGER RANGE 0 TO 255;
  30. qn : OUT  INTEGER RANGE 0 TO 255
  31. );
  32. END counters;
  33. ARCHITECTURE a OF counters IS
  34. BEGIN
  35. -- An enable counter
  36. PROCESS (clk)
  37. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  38. BEGIN
  39. IF (clk'EVENT AND clk = '1') THEN
  40. IF enable = '1' THEN
  41. cnt := cnt + 1;
  42. END IF;
  43. END IF;
  44. qa <= cnt;
  45. END PROCESS;
  46. -- A synchronous load counter
  47. PROCESS (clk)
  48. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  49. BEGIN
  50. IF (clk'EVENT AND clk = '1') THEN
  51. IF ld = '0' THEN
  52. cnt := d;
  53. ELSE
  54. cnt := cnt + 1;
  55. END IF;
  56. END IF;
  57. qb <= cnt;
  58. END PROCESS;
  59. -- A synchronous clear counter
  60. PROCESS (clk)
  61. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  62. BEGIN
  63. IF (clk'EVENT AND clk = '1') THEN
  64. IF clear = '0' THEN
  65. cnt := 0;
  66. ELSE
  67. cnt := cnt + 1;
  68. END IF;
  69. END IF;
  70. qc <= cnt;
  71. END PROCESS;
  72. -- An up/down counter
  73. PROCESS (clk)
  74. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  75. VARIABLE direction  : INTEGER;
  76. BEGIN
  77. IF (up_down = '1') THEN
  78. direction := 1;
  79. ELSE
  80. direction := -1;
  81. END IF;
  82. IF (clk'EVENT AND clk = '1') THEN
  83. cnt := cnt + direction;
  84. END IF;
  85. qd <= cnt;
  86. END PROCESS;
  87. -- A synchronous load enable counter
  88. PROCESS (clk)
  89. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  90. BEGIN
  91. IF (clk'EVENT AND clk = '1') THEN
  92. IF ld = '0' THEN
  93. cnt := d;
  94. ELSE
  95. IF enable = '1' THEN
  96. cnt := cnt + 1;
  97. END IF;
  98. END IF;
  99. END IF;
  100. qe <= cnt;
  101. END PROCESS;
  102. -- An enable up/down counter
  103. PROCESS (clk)
  104. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  105. VARIABLE direction  : INTEGER;
  106. BEGIN
  107. IF (up_down = '1') THEN
  108. direction := 1;
  109. ELSE
  110. direction := -1;
  111. END IF;
  112. IF (clk'EVENT AND clk = '1') THEN
  113. IF enable = '1' THEN
  114. cnt := cnt + direction;
  115. END IF;
  116. END IF;
  117. qf <= cnt;
  118. END PROCESS;
  119. -- A synchronous clear enable counter
  120. PROCESS (clk)
  121. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  122. BEGIN
  123. IF (clk'EVENT AND clk = '1') THEN
  124. IF clear = '0' THEN
  125. cnt := 0;
  126. ELSE
  127. IF enable = '1' THEN
  128. cnt := cnt + 1;
  129. END IF;
  130. END IF;
  131. END IF;
  132. qg <= cnt;
  133. END PROCESS;
  134. -- A synchronous load clear counter
  135. PROCESS (clk)
  136. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  137. BEGIN
  138. IF (clk'EVENT AND clk = '1') THEN
  139. IF clear = '0' THEN
  140. cnt := 0;
  141. ELSE
  142. IF ld = '0' THEN
  143. cnt := d;
  144. ELSE
  145. cnt := cnt + 1;
  146. END IF;
  147. END IF;
  148. END IF;
  149. qh <= cnt;
  150. END PROCESS;
  151. -- A synchronous load up/down counter
  152. PROCESS (clk)
  153. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  154. VARIABLE direction  : INTEGER;
  155. BEGIN
  156. IF (up_down = '1') THEN
  157. direction := 1;
  158. ELSE
  159. direction := -1;
  160. END IF;
  161. IF (clk'EVENT AND clk = '1') THEN
  162. IF ld = '0' THEN
  163. cnt := d;
  164. ELSE
  165. cnt := cnt + direction;
  166. END IF;
  167. END IF;
  168. qi <= cnt;
  169. END PROCESS;
  170. -- A synchronous load enable up/down counter
  171. PROCESS (clk)
  172. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  173. VARIABLE direction  : INTEGER;
  174. BEGIN
  175. IF (up_down = '1') THEN
  176. direction := 1;
  177. ELSE
  178. direction := -1;
  179. END IF;
  180. IF (clk'EVENT AND clk = '1') THEN
  181. IF ld = '0' THEN
  182. cnt := d;
  183. ELSE
  184. IF enable = '1' THEN
  185. cnt := cnt + direction;
  186. END IF;
  187. END IF;
  188. END IF;
  189. qj <= cnt;
  190. END PROCESS;
  191. -- A synchronous clear load enable counter
  192. PROCESS (clk)
  193. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  194. BEGIN
  195. IF (clk'EVENT AND clk = '1') THEN
  196. IF clear = '0' THEN
  197. cnt := 0;
  198. ELSE
  199. IF ld = '0' THEN
  200. cnt := d;
  201. ELSE
  202. IF enable = '1' THEN
  203. cnt := cnt + 1;
  204. END IF;
  205. END IF;
  206. END IF;
  207. END IF;
  208. qk <= cnt;
  209. END PROCESS;
  210. -- A synchronous clear up/down counter
  211. PROCESS (clk)
  212. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  213. VARIABLE direction  : INTEGER;
  214. BEGIN
  215. IF (up_down = '1') THEN
  216. direction := 1;
  217. ELSE
  218. direction := -1;
  219. END IF;
  220. IF (clk'EVENT AND clk = '1') THEN
  221. IF clear = '0' THEN
  222. cnt := 0;
  223. ELSE
  224. cnt := cnt + direction;
  225. END IF;
  226. END IF;
  227. ql <= cnt;
  228. END PROCESS;
  229. -- A synchronous clear enable up/down counter
  230. PROCESS (clk)
  231. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  232. VARIABLE direction  : INTEGER;
  233. BEGIN
  234. IF (up_down = '1') THEN
  235. direction := 1;
  236. ELSE
  237. direction := -1;
  238. END IF;
  239. IF (clk'EVENT AND clk = '1') THEN
  240. IF clear = '0' THEN
  241. cnt := 0;
  242. ELSE
  243. IF enable = '1' THEN
  244. cnt := cnt + direction;
  245. END IF;
  246. END IF;
  247. END IF;
  248. qm <= cnt;
  249. END PROCESS;
  250. -- A modulus 200 up counter
  251. PROCESS (clk)
  252. VARIABLE cnt : INTEGER RANGE 0 TO 255;
  253. CONSTANT modulus  : INTEGER := 200;
  254. BEGIN
  255. IF (clk'EVENT AND clk = '1') THEN
  256. IF cnt = modulus THEN
  257. cnt := 0;
  258. ELSE
  259. cnt := cnt + 1;
  260. END IF;
  261. END IF;
  262. qn <= cnt;
  263. END PROCESS;
  264. END a;