前言:
Verilog以其简单,但又难以掌握著称。
许多新手看别人写的成千上万行代码,信号满天飞,不知道这个难度到底又多大,无耐放弃。
笔者根据自己多年的实践经验、公司同事的经验以及国内外优秀开源FPGA代码纯逻辑设计层面,总结一些核心高价值代码片段,做成FPGA之Verilog他山之石系列。具体系列能写道多少,多久,本人也无法预料。
这是本人供职的天津大学四川院集成电路中心的网站,所以文章就从这个地方首发,会跟本人在知乎的账号上随想或者文章同步,欢迎FPGA初学者参考。
如果文章代码有错误也请指出,供大家进步。 写作方式: 代码、解析、仿真波形等。
FPGA之Verilog他山之石系列之1 上电启动只运行一次的计数器
我们都知道计数器,我们写循环计数器场合较多,有时我们需要使用只是上电使用一次的计数器,很多初学者不会,请参考如下:
always @ (posedge CLK_i or negedge RST_i)
begin
if (RST_i==1'b0)
cnt1 <= 32'b0 ;
else begin
if(cnt1 < 32'd5000_0000 * 10 -1) // 5000_0000*10=10S
cnt1 <= cnt1 + 1'b1 ;
else
cnt1 <= cnt1 ; // 这种就只一次循环
end
end
与不断循环的计数器比较:
always @ (posedge CLK_i or negedge RST_i)
begin
if (RST_i==1'b0)
cnt1 <= 32'b0 ;
else begin
if(cnt1 < 32'd5000_0000 * 10 -1) // 5000_0000*10=10S
cnt1 <= cnt1 + 1'b1 ;
else
cnt1 <= 32'd0 ; // 这种就只一次循环
end
end
聪明的你一眼就看出就是第一次加到预设值得else处理: 只循环一次的就cnt1 <= cnt1 ,而需要不断循环就计数器清零 cnt1 <= 32’d0 ,是不是很简单
这个只运行一次的代码非常有用,我们很多运行都只是上电运行一次。比如笔者要统计开电次数,就需要这种计数器触发一次事件,另外初始化一些寄存器,也可以使用这个计数器,在另外一个always块中 cnt== 32’dxx 作为触发信号,给不同的地方使用。相关的应用需求还很多。
这个代码段我就不放仿真波形图(以后其他代码段我还是会放)
思考,为什么我们计数器要 把 if(cnt1 < 32’d5000_0000 * 10 -1) 为什么要减1
请提出你的想法,容我们后期分解!!!
发表回复