微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog定义reg时的初值问题

verilog定义reg时的初值问题

时间:10-02 整理:3721RD 点击:
想定义一个reg,但不希望这个信号被全局复位,这时它的初值该怎么赋值?我同事中有两种说法,
第一种是在定义的时候就给初值,如:
reg temp_r = 4'h1;
always @ (posedge i_clk)
    temp_r <= 一堆运算;
另一种说不管在初始定义是什么,上电后的初值都是0,无法去定义其他的初值。
请问,究竟哪种说法是正确的呢?根据是什么?

就你上面的两种说法第一种还靠谱点,REG的初始值是你在代码中赋予的,复位后不都是0, 你可以给定是0活着1,如果不给定初始值, 复位后就是不定态,这个不定态就会在复位后逐级传递到后面。

只能复位时给初值。
always @( posedge clk )
if(rst)
a <= 123;
else
a<= ...;
FPGA不是软件,定义时给的初值只在仿真时有意义。

持第一观点的同事告诉我,他在之前用xilinx的器件的时候直接赋值的,在上板后测试的时候,该寄存器确实是这个值。
我使用的lattice的FPGA器件,刚刚我用diamond生成了后仿用的.vo文件,仿真的结果也是在上电后就保持我赋的初值。
这是怎么回事呢?


对FPGA来说, 初始化语句是可以被综合到网表里的,不过会增加一些逻辑资源去实现。好像在Altera的手册里看到过,没有复位和初始化的寄存器上电后默认为0。

FPGA上电之后有个初始化,所有的模块都会赋值为0 。另外如果你的代码中定义reg a = VALUE 的,也可以。

xilinx的器件:
可以实现reg [3:0] temp_r = 4'h1;
因为他们的器件有GSR网络可以来配置INT0,INT1。确定在逻辑加成完成后,reg的初始值是什么。
altera的器件:没研究过,暂时不能回答。

所有FPGA都可以通过Initial赋上电后的初值,不会增加逻辑。不过赋了初值之后不能通过异步复位赋一个相反的值了。
比如:
reg dff=1;
always@(posedge clk or negedge rstn)
if(!rstn)
   dff<=0;
  else
.......
这样就不行了,至少赋的初值会被Ignore掉,并报Warning。

3楼正解,硬件电路,复位前的状态都是不定态

学习了,FPGA是可以声明的时候赋初值的!




    你编译一下就知道,那个上电的初值是经过逻辑门的搭出来的。一般上电是0,如果是1的话要加非门,如果有多个寄存器初值为1的话,逻辑资源占用比较明显。我在CPLD上做过类似的初始化。
http://www.alteraforum.com/forum/showthread.php?t=6602

哦,确实没有干过这个事情,,上电的时候给一个值,,但是在IC里面怎么办啊?

寄存器的值初始有2种:
1.fpga上电起来后,寄存器是有个值,这个值是通过 reg a = xx ,来赋值的。
2.复位后,寄存器的值由代码的复位逻辑决定的,例如:
always@(posedge clk or negedge rstn)
if(!rstn)
    reg <= xx;

学习了!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top