在利用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。

verilog中初值定义的更多相关文章

  1. verilog中参数传递与参数定义中#的作用(二)

    一.module内部有效的定义 用parameter来定义一个标志符代表一个常量,称作符号常量,他可以提高程序的可读性和可维护性.parameter是参数型数据的关键字,在每一个赋值语句的右边都必须是 ...

  2. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  3. Verilog中变量位宽注意

    Verilog中,变量定义方式可以为:reg[位宽-1:0] 数据名:reg[位宽:1] 数据名.其他变量也类似. 以reg变量cnt为例,当cnt位宽为4时,可定义为reg[3:0] cnt,或者定 ...

  4. verilog中signed的使用

    1.在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其 ...

  5. Verilog中的阻塞与非阻塞

    这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...

  6. Verilog中的有符号计算之认知补码

    Verilog中的有符号计数,一般是自己定义的而不是像C语言之类的定义一个有符号变量就好了.所以,要想在FPGA的世界里随心所欲的进行有符号运算,必须先对补码有一个很好的认知,然后再注意Verilog ...

  7. Verilog中使用'include实现参数化设计

    前段时间在FPGA上用Verilog写了一个多端口以太网的数据分发模块,因为每个网口需要独立的MAC地址和IP地址,为了便于后期修改,在设计中使用parameter来定义这些地址和数据总线的位宽等常量 ...

  8. Verilog中的Timescale作用

    很多时候,我们拿到已有的东西理所当然的用了,其实,你真的对你所使用的东西了解吗? 再次犯下这样的错误,是因为在把代码从Altera 的CycloneV移植到Xilinx的Spartan6上,我遇到了非 ...

  9. C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理

    这里的问题实质是我们在头文件中直接定义全局变量或者函数,却分别在主函数和对应的cpp文件中包含了两次,于是在编译的时候这个变量或者函数被定义了两次,问题就出现了,因此,我们应该形成一种编码风格,即: ...

随机推荐

  1. Java学习---Java代码编写规范

    编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...

  2. Linux 下Shell的学习3-优秀demo

    优秀的DEMO cat /etc/init.d/functions   -->里面有颜色定义cat /etc/rc.d/rc.sysinit cat /etc/init.d/nfscat /et ...

  3. database design three form

    https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html

  4. 使用ESP8266连接到Azure

    很多同学在问我,ESP8266如何连接到Azure,因为官方只有Spark Fun之类的DevKit(开发套件)出了教程(我只找到了套件的文档). 先上视频:http://v.youku.com/v_ ...

  5. sqlserver-一次updlock和withnolock和with check option 的报错原因分析

    接口程序一直运行的很稳定,其中有一天进行了数据库的整改,导致程序不断报错, 报错信息如下 原因: 程序代码写入以下代码 select * from ViewName with(updlock) whe ...

  6. 死磕salt系列-salt API 使用

    启用salt-api 服务 这里简单的说明下,SaltStack官方支持三种REST API,分别是rest_cherry; rest_tonado和rest_wsgi, 本文选择使用rest_che ...

  7. 2018-2019-2 网络对抗技术 20165322 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165322 Exp6 信息搜集与漏洞扫描 目录 实验原理 实验内容与步骤 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术 漏洞扫描 基础问题 ...

  8. 内核调试工具——strace

    简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...

  9. LeetCode34.在排序数组中查找元素的第一个和最后一个位置 JavaScript

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  10. emmet完整收录(html,css)

    emmet官网 https://emmet.io/ 语法篇 Child: > nav>ul>li <nav> <ul> <li></li&g ...