博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
verilog中初值定义
阅读量:7154 次
发布时间:2019-06-29

本文共 2181 字,大约阅读时间需要 7 分钟。

在利用verilog进行开发时,往往需要对某些寄存器进行赋初值,下面根据笔者在设计中遇到的情况进行分析。

          例如下面是实现流水灯(4个led),代码如下:

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,初始化FPGA,FPGA正常工作。而初始化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 <variable_name> = <initial_value>;

  

如果在写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(奋斗的小孩郝旭帅):746833924,QQ群:173560979。

 

转载于:https://www.cnblogs.com/fendoudexiaohai/p/9645642.html

你可能感兴趣的文章
linux系统查看命令
查看>>
JAVA推荐网站
查看>>
我的友情链接
查看>>
插件开发常见问题整理
查看>>
HTML5从零开始构建HTML 5 Web页面
查看>>
centos新增网卡未见到
查看>>
实体机关闭后再启动,kvm中虚拟机无法启动的问题
查看>>
日期正则表达式
查看>>
Maven多模块设置保持JDK版本一致
查看>>
PHP5.2X 升级到PHP5.3.X之后注意事项
查看>>
oracle控制文件的一点研究
查看>>
Spring Boot log backed logstash
查看>>
(六):TCP的连接建立与释放过程
查看>>
酷派新机型只做3G是一种勇气
查看>>
yum 错误
查看>>
Linux命令之ls
查看>>
gcc --hash-style
查看>>
PHP 显示表格(需要输入数量)
查看>>
根据颜色值获取颜色常量名: ColorToIdent
查看>>
再学 GDI+[14]: DrawBeziers - 绘制一组贝塞尔线
查看>>