我是靠谱客的博主 缓慢鸡翅,这篇文章主要介绍数字逻辑设计基础-加/减法计数器,现在分享给大家,希望可以做个参考。

计数器是数字逻辑设计中最常见的的模块,但是也是比较重要的模块,在简单的时序电路中使用较多。

现在要设计一个计数器,能够满足以下要求。

(1):能够根据输入信号,enable_cnt_up,和enable_cnt_dn进行加计数和减计数

(2):如果信号new_cntr_perset为高电平并且保持一个周期,那么计数器就被设置为新的预设值。

(3):在pause-counting有效时,计数器值保持不变。

(4):当计数器值计数到结束比标志时,计数器输出端口ctr_expired有效。

(5):计数器值到达边界时,会自动重新加载预设值并且重新开始计数。

以下是计数器的信号列表:

信号I/Owidth
clkinput1
restbinput1
new_cntr_persetinput1
new_cntr_perset_valueinput[7:0]
enable_cnt_upinput1
enable_cnt_dninput1
pause_countinginput1
ctr_expiredoutput1

以下是计数器实现的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
76
module 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

 

最后

以上就是缓慢鸡翅最近收集整理的关于数字逻辑设计基础-加/减法计数器的全部内容,更多相关数字逻辑设计基础-加/减法计数器内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部