FPGA设计基础01——计数器

FPGA设计基础01——计数器

1.计数器的功能就是计数。

2.计数器计的数是时钟脉冲的个数。

3.计数的最大值与位宽有关,位宽为n,则最大数为2的n次方。

4.常用于计算时间,如若FPGA的晶振为50M赫兹,那么他一个时钟的时间就是1/50_000_000=20ns,也就是说每来一个时钟就+20ns,通过多次计数可以得到想要的不同的时间。

5.我们平时写的普通计数器

		always @(posedge clk or negedge rst_n)begin
		    if(!rst_n)begin
		        cnt <= 0;
		    end
		    else if(加一条件)begin
		        if(结束条件)
		            cnt <= 0;
		        else
		            cnt <= cnt + 1;
		    end
		end

6.这里介绍一种明德扬的计数器,只需要记住两个关键:加一条件、结束条件。

	always @(posedge clk or negedge rst_n)begin
		 if(rst_n==1'b0)begin
			cnt<= 0;
		 end
		 else if(add_cnt) begin
			 if(end_cnt)
			 cnt<= 0;
		 else
			 cnt<= cnt + 1;
		 end
	end
	
	assign add_cnt = 1 ;
	assign 结束条件 = add-cnt && cnt== 100-1 ;

add_cnt为加一条件,上述将其致1,意味着一直计数,知道满足我的结束条件为止。

end_cnt为结束条件,上述为计数到第100个时钟(注意从0开始计数,所以要-1),即为100*20ns的时间

6.两个计数器同时使用

	always @(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
		cnt0 <= 0;
		end
		else if(add_cnt0)begin
		if(end_cnt0)
		cnt0 <= 0;
		else
		cnt0 <= cnt0 + 1;
		end
	end
	
	assign add_cnt0 = 1;						//计数器0一直计数
	assign end_cnt0 = add_cnt0 && cnt0== 100-1 ;//计数到100个时钟时结束
	
	always @(posedge clk or negedge rst_n)begin 
		if(!rst_n)begin
		cnt1 <= 0;
		end
		else if(add_cnt1)begin
		if(end_cnt1)
		cnt1 <= 0;
		else
		cnt1 <= cnt1 + 1;
		end
	end
	
	assign add_cnt1 = end_cnt0;					//计数器0计数结束时,计数器1计数一次
	assign end_cnt1 = add_cnt1 && cnt1== 100-1 ;//计数器1计数到100时结束

由上面可知,两个计数器之间的关系为:计数器0计数完一整个周期后,计数器1加一。计数器0数完100个周期后,计数器1完成一个周期。

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值