计数器是数字逻辑设计中最常见的的模块,但是也是比较重要的模块,在简单的时序电路中使用较多。
现在要设计一个计数器,能够满足以下要求。
(1):能够根据输入信号,enable_cnt_up,和enable_cnt_dn进行加计数和减计数
(2):如果信号new_cntr_perset为高电平并且保持一个周期,那么计数器就被设置为新的预设值。
(3):在pause-counting有效时,计数器值保持不变。
(4):当计数器值计数到结束比标志时,计数器输出端口ctr_expired有效。
(5):计数器值到达边界时,会自动重新加载预设值并且重新开始计数。
以下是计数器的信号列表:
信号 | I/O | width |
clk | input | 1 |
restb | input | 1 |
new_cntr_perset | input | 1 |
new_cntr_perset_value | input | [7:0] |
enable_cnt_up | input | 1 |
enable_cnt_dn | input | 1 |
pause_counting | input | 1 |
ctr_expired | output | 1 |
以下是计数器实现的Verilig代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76module versat_updown_counter ( clk, restb, new_cntr_perset; new_cntr_perset_value, enable_cnt_up, enable_cnt_dn, pause_counting, ctr_expired ) //********************************************************* input clk; input restb; input new_cntr_perset; input [7:0] new_cntr_perset_value; input enable_cnt_dn; input enable_cnt_up; input pause_counting; output ctr_expired; reg [7:0] count255,count255_nxt; reg [7:0] cnt_perset_stored; wire [7:0] cnt_perset_stored_nxt; reg ctr_expired; wire ctr_expired_nxt; reg enable_cnt_dn_d1,enable_cnt_up_d1; wire enable_cnt_up_risedge,enable_cnt_dn_risedge; //********************************************************** assign enable_cnt_up_risedge = enable_cnt_up&!enable_cnt_up_d1; assign enable_cnt_dn_risedge = enable_cnt_dn&!enable_cnt_dn_d1; assign cnt_perset_stored_nxt = new_cntr_perset?new_cntr_perset_value:cnt_perset_stored_nxt; assign ctr_expired_nxt = enable_cnt_up?(count255_nxt == cnt_perset_stored_nxt): (enable_cnt_dn?(count255_nxt = 'd0):1'b0); always@(*) begin count255_nxt = count255; if(enable_cnt_dn_risedge) count255_nxt = cnt_perset_stored //初始化最大值 else if(enable_cnt_up_risedge) count255_nxt = 'd0; else if(pause_counting) count255_nxt = count255; else if(enable_cnt_dn && ctr_expired) count255_nxt = cnt_perset_stored; else if(enable_cnt_dn) count255_nxt = count255 - 1'b1; else if(enable_cnt_up && ctr_expired) count255_nxt = 'd0; else if(enable_cnt_up) count255_nxt = count255 + 1'b1; end always@(posedge clk or negedge restb) begin if(!restb)begin count255 <= 'd0; cnt_perset_stored <= 'd0; ctr_expired <= 1'b1; enable_cnt_up_d1 <= 1'b0; enable_cnt_dn_d1 <= 1'b0; end else begin count255 <= count255_nxt; cnt_perset_stored <= cnt_perset_stored_nxt; ctr_expired <= ctr_expired_nxt; enable_cnt_dn_d1 <= enable_cnt_dn; enable_cnt_up_d1 <= enable_cnt_up; end end endmodule
最后
以上就是缓慢鸡翅最近收集整理的关于数字逻辑设计基础-加/减法计数器的全部内容,更多相关数字逻辑设计基础-加/减法计数器内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复