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文件中包含了两次,于是在编译的时候这个变量或者函数被定义了两次,问题就出现了,因此,我们应该形成一种编码风格,即: ...
随机推荐
- Azure 登录设置
转自 http://blog.csdn.net/azure_nonofficial/article/details/38095459 这是我们Azure非官方的第一篇博文,欢迎大家各种拍砖. 微软云计 ...
- December 21st 2016 Week 52nd Wednesday
Keep conscience clear, then never fear. 问心无愧,永不畏惧. I find it is very difficult for me to keep consci ...
- ZT A2DP协议笔记
A2DP协议笔记 (2013-07-30 10:07:54) 转载▼ 标签: a2dp bluetooth src sink 分类: Bluetooth 1.概述 A2DP(Advanced ...
- Cookies的各方面知识(基础/高级)深度了解
Cookies想必所有人都了解本文将围绕Cookies基础知识(什么是Cookies/Cookies如何传递/Cookies如何存储/Cookies如何查看)Cookies高级知识/Cookie的限制 ...
- ecshop hash登录 + wordpress mysql盲注字段
delete_cart_goods.php post id=a * sq_xfkjbd 暴库and(select 1 from(select count(*),concat((select (se ...
- ubuntu服务器下tomcat安装(不推荐使用apt-get)
最近在阿里云服务器上装tomcat,一开始为了省事直接使用了apt-get安装,结果整个程序被拆开散到了好多地方,尤其是像网上说要把打包好了.war文件放到webapps文件夹下,但是开始并没有在/u ...
- Kali-linux Gerix Wifi Cracker破解无线网络
Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具.本节将介绍使用该工具破解无线网络及创建假的接入点. 9.3.1 Gerix破解WEP加密的无线网络 在前面介 ...
- java把行政区划放到一个节点树形中
作者原创:转载请注明出处.https://www.cnblogs.com/yunqing/p/9486923.html 先放数据,t_city表 //津京冀地区行政区划数据 SET FOREIGN_K ...
- Exp6 信息收集与漏洞扫描 20164314
一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务 ...
- PAT——1063. 计算谱半径
在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界.换言之,对于给定的n个复数空间的特征值{a1+b1i, ..., an+bni},它们的模为实部与虚部的平方和的开方,而“谱半径”就是最大模. ...