6149|2

122

帖子

0

TA的资源

版主

楼主
 

verilog中初值定义 [复制链接]




此内容由EEWORLD论坛网友郝旭帅原创,如需转载或用于商业用途需征得作者同意并注明出处

在利用verilog进行开发时,往往需要对某些寄存器进行赋初值,下面根据笔者在设计中遇到的情况进行分析。
          例如下面是实现流水灯(4led),代码如下:
module ledrun (
    input   wire                clk,
    input   wire                rst_n,
   
    output  reg     [3:0]       led
);
    parameter T_1s =            50_000_000;
   
    reg             [25:0]      cnt;
   
    always @ (posedge clk, negedge rst_n) begin
        if (rst_n == 0)
            cnt <= 0;
        else
            if (cnt < T_1s - 1)
                cnt <= cnt + 1'b1;
            else
                cnt <= 0;
    end
   
    wire    flag_1s= (cnt == T_1s - 1);
   
    always @ (posedge clk, negedge rst_n) begin
        if (rst_n == 0)
            led <= 4'b1110;
        else
            if (flag_1s)
                led <= {led[2:0],led[3]};
            else
                led <= led;
    end
   
endmodule
          在上述模块中,利用复位基于了led寄存器初值,然后下板之后,板子能够按照我们所设计的方式来进行工作。但是,注意到一个问题,初值怎么给的呢?我们下板之后并没有按下复位按键。开发板上电时间已经足够长了,上电复位电路早已经不能够起到任何作用了。初值怎么来的呢?
          笔者记得在一片文章上在叙述配置FPGA时,共分为三个步骤,配置FPGA,初始化FPGAFPGA正常工作。而初始化FPGA,就应该把这个初值赋值给led寄存器了,所以导致不复位也可以正常工作。
          如果把代码改成以下模式呢?
   
    initial led = 4'b1110;
   
    always @ (posedge clk) begin
        if (flag_1s)
            led <= {led[2:0],led[3]};
        else
            led <= led;
    end
          initial语句到底能否被综合呢?很多的网友说,initial语句只是在仿真时有用,只是为了给仿真一个初值,是不能综合的。另外在读文件时,也只是在综合器综合时,把文件值赋值给对应存储器。但是把上述代码,配置到开发板中,initial语句赋值的初值,是可以被配置到开发板中的,经过赋值不同的值,会有不同的流水灯。
        下面是在quartus 中的模板代码中的说明。是可以利用下述模式进行赋初值的,VHDL中,大多都是用此方法进行赋初值的。initial语句和下面语句是等效的。
   

    // Scalar reg with initial value.  If the variable has no assigned value,
    // Quartus Prime Integrated Synthesis will use the initial value.  Integrated
    // Synthesis will also infer power-up conditions for registers and memories
    // from the initial value.
    reg = ;

    如果在写verilog时,同时用复位赋初值,也用initial赋初值,那么综合器就会报出警告,说明赋值重复,并且按照复位赋初值的方式进行。
   
    initial led = 4'b1110;
   
    always @ (posedge clk, negedge rst_n) begin
        if (rst_n == 0)
            led <= 4'b0001;
        else
            if (flag_1s)
                led <= {led[2:0],led[3]};
            else
                led <= led;
    end


        Critical Warning (18061): Ignored Power-Up Level option on the following registers
        Critical Warning (18010): Register led[0]~reg0 will power up to High
        Critical Warning (18010): Register led[1]~reg0 will power up to Low
        Critical Warning (18010): Register led[2]~reg0 will power up to Low
        Critical Warning (18010): Register led[3]~reg0 will power up to Low

所以,initial语句可以认为是一个可综合语句,不单单用来仿真时使用。
笔者水平有限,如果设计中,有什么不妥的地方,恳请大佬们指出来。

  欢迎加好友探讨QQ(奋斗的小孩郝旭帅):746833924QQ群:173560979

此帖出自模拟电子论坛

最新回复

写的很用心 不错  详情 回复 发表于 2018-9-15 18:50
点赞 关注(1)

回复
举报

10

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
写的很用心 不错
此帖出自模拟电子论坛

点评

谢谢  详情 回复 发表于 2018-9-16 17:44
 
 

回复

122

帖子

0

TA的资源

版主

板凳
 

谢谢
此帖出自模拟电子论坛
 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表