概述
计数器是数字逻辑设计中最常见的的模块,但是也是比较重要的模块,在简单的时序电路中使用较多。
现在要设计一个计数器,能够满足以下要求。
(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代码:
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
最后
以上就是缓慢鸡翅为你收集整理的数字逻辑设计基础-加/减法计数器的全部内容,希望文章能够帮你解决数字逻辑设计基础-加/减法计数器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复