赞
踩
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完成一个周期。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。