verilog中初值定义
在利用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中初值定义的更多相关文章
- verilog中参数传递与参数定义中#的作用(二)
一.module内部有效的定义 用parameter来定义一个标志符代表一个常量,称作符号常量,他可以提高程序的可读性和可维护性.parameter是参数型数据的关键字,在每一个赋值语句的右边都必须是 ...
- 关于Verilog 中的for语句的探讨
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- Verilog中变量位宽注意
Verilog中,变量定义方式可以为:reg[位宽-1:0] 数据名:reg[位宽:1] 数据名.其他变量也类似. 以reg变量cnt为例,当cnt位宽为4时,可定义为reg[3:0] cnt,或者定 ...
- verilog中signed的使用
1.在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其 ...
- Verilog中的阻塞与非阻塞
这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...
- Verilog中的有符号计算之认知补码
Verilog中的有符号计数,一般是自己定义的而不是像C语言之类的定义一个有符号变量就好了.所以,要想在FPGA的世界里随心所欲的进行有符号运算,必须先对补码有一个很好的认知,然后再注意Verilog ...
- Verilog中使用'include实现参数化设计
前段时间在FPGA上用Verilog写了一个多端口以太网的数据分发模块,因为每个网口需要独立的MAC地址和IP地址,为了便于后期修改,在设计中使用parameter来定义这些地址和数据总线的位宽等常量 ...
- Verilog中的Timescale作用
很多时候,我们拿到已有的东西理所当然的用了,其实,你真的对你所使用的东西了解吗? 再次犯下这样的错误,是因为在把代码从Altera 的CycloneV移植到Xilinx的Spartan6上,我遇到了非 ...
- C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理
这里的问题实质是我们在头文件中直接定义全局变量或者函数,却分别在主函数和对应的cpp文件中包含了两次,于是在编译的时候这个变量或者函数被定义了两次,问题就出现了,因此,我们应该形成一种编码风格,即: ...
随机推荐
- Mysql常用的锁机制
一.引言 ...
- CentOS 6 各种启动文件损坏及修复
stage1 mbr的破坏和恢复 清空mbr 前446字节 dd if=/dev/zero of=/dev/sda bs=1 count=446 如果没有挂载启动光盘,会显示这样 如果启动前挂载了光盘 ...
- nginx+lvs+keepalived安装
安装nginx 配置文件和之前的一样 user nobody nobody; #定义Nginx运行的用户和用户组 worker_processes 4; #nginx进程数,建议设置为等于 ...
- 021.3 IO流——字节流-FileInputStream读取字节
内容:文件读取方法,读取方法例子,read(buf)方法中buf的取值,字节流缓冲区对象—提高读取速度/// 文件读取方法:fis.read(),fis.read(buf),具体看例子 例子:文件读取 ...
- 2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用
2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用 目录 实验内容与步骤 一个主动攻击实践 MS08-067(失败) ms17_010_psexec(成功且唯一) 一个针 ...
- python中执行shell命令
查看输出结果 import os output = os.popen('cat 6018_gap_5_predict/solusion2/solusion2_0-1.txt | wc -l') pri ...
- Apollo2.5摄像头安装
前言:在Apollo美研团队和长沙CiDi团队的支持下,最近完成了Apollo推荐的摄像头AR023ZWDR(Rev663F12)调试,在这里对Apollo的笔记做一个补充,希望以后的开发者不用在踩我 ...
- [转]对象映射类AutoMapper的使用
由于原文太长了,此处就直接贴上原文的超链接,大家自行学习. codeproject中的一篇文章: AutoMapper
- Dubbo实践(十三)Export
Spring在启动Dubbo服务端应用时,会实例化ServiceBean<T>并设置配置属性,然后调用export方法: @SuppressWarnings({"unchecke ...
- haproxy原理理解
1.haproxy使用最需要注意的点: 1.1连接数: 前端maxconn默认值为2000,非常有必要将其增加几倍. 1.2超时时间 timeout connect 60s # haproxy和服务端 ...