FPGA之Verilog他山之石系列1

Posted by

前言:

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

请提出你的想法,容我们后期分解!!!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

我们将24小时内回复。
取消