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

概述

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

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

(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代码:

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

 

最后

以上就是缓慢鸡翅为你收集整理的数字逻辑设计基础-加/减法计数器的全部内容,希望文章能够帮你解决数字逻辑设计基础-加/减法计数器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部