zouyf12 发表于 2012-12-24 17:34:10

关于FPGA里定义的寄存器赋初值的问题。

比如定义一个6位寄存器count, 要给它赋一个初始值5,能否这样下, 如果不是,该如何写? 谢谢

reg count = 6'd5;

XP85118978 发表于 2012-12-24 18:28:44

我经常这么干,也不知合理否。。。

xiaoqingy 发表于 2012-12-24 18:33:36

6是二进制的位数吧
6'b101

zouyf12 发表于 2012-12-24 19:33:36

xiaoqingy 发表于 2012-12-24 18:33 static/image/common/back.gif
6是二进制的位数吧
6'b101

对,d是十进制,6'd5就是把一个6位的5写进去。

pengxin213 发表于 2012-12-24 21:46:08

可以的~

wjfblack 发表于 2012-12-25 08:56:23

做个实验看看,把赋的初值直接送到LED显示。

zouyf12 发表于 2012-12-25 09:32:12

wjfblack 发表于 2012-12-25 08:56 static/image/common/back.gif
做个实验看看,把赋的初值直接送到LED显示。

      刚做了实验,用的是ACTEL的A3P060, 发现这样写不行,上电4个灯都是亮的(说明Count = 4'b1111)

代码如下
// TOP.v
module TOP(
                LED,
                In

            );

output LED;

reg Count = 4'd05;



input In;

always@(negedge In)
begin
    Count = Count + 4'd01;
end
   

assign LED = ~Count;



endmodule

XP85118978 发表于 2012-12-25 10:59:43

zouyf12 发表于 2012-12-25 09:32 static/image/common/back.gif
刚做了实验,用的是ACTEL的A3P060, 发现这样写不行,上电4个灯都是亮的(说明Count = 4'b1111) ...

我在quarters ii 环境下这样用没有问题哦

mayiqing888 发表于 2012-12-25 11:15:15

zouyf12 发表于 2012-12-25 09:32 static/image/common/back.gif
刚做了实验,用的是ACTEL的A3P060, 发现这样写不行,上电4个灯都是亮的(说明Count = 4'b1111) ...

你的In是个什么信号?按键还是时钟?频率高的话,你当然看不到LED的亮灭变化,只能看到4个灯都亮。

mayiqing888 发表于 2012-12-25 11:19:47

quartus下仿真出来的,代码完全没问题

zouyf12 发表于 2012-12-25 11:36:07

XP85118978 发表于 2012-12-25 10:59 static/image/common/back.gif
我在quarters ii 环境下这样用没有问题哦

就是像C语言一样,初始赋个值,那该寄存器里面就在上电以后就是这个数值是吗?   

不过其实我个人是觉得, 如果按照FPGA本来的性质, 不应该可以用这种方法赋初值的, 好比你用FPGA描述了一个类似74HC161的计数器, 那除非有外部信号驱动LOAD脚, 让它把设定值装载进去, 要不然这个芯片绝对不会在没有外部影响下,上电会自己把自己计数器的值变为某个特定值, 如果这样有可能,那单片机之类的东西就不需要上电复位这个东西了。

至于Altera 的芯片有这种功能,个人觉得不排除其FPGA本身具有这种上电后装载初值的功能, 毕竟RAM类型的FPGA本身上电前就需要装载配置芯片里的文件, 在装载是顺带把值改为初始值也不是不可以。   

以上个人愚见。

zouyf12 发表于 2012-12-25 11:41:27

mayiqing888 发表于 2012-12-25 11:15 static/image/common/back.gif
你的In是个什么信号?按键还是时钟?频率高的话,你当然看不到LED的亮灭变化,只能看到4个灯都亮。 ...

按键,而且只是做个样子,实际上从头到尾没有按过,然后 一上电每次都是全亮,偶尔是全灭, 反正没有一次是那个特定的值,如果说上电时,按键的那个IO也会有电压的抖动造成计数器计数的话,那也不大可能每次都是0 和ff,

wjfblack 发表于 2012-12-26 08:46:16

zouyf12 发表于 2012-12-25 09:32 static/image/common/back.gif
刚做了实验,用的是ACTEL的A3P060, 发现这样写不行,上电4个灯都是亮的(说明Count = 4'b1111) ...

module TOP(
                LED,
                In

            );

output LED;

reg Count = 4'd05;

   

assign LED = Count;

直接这样测试看看。

wjfblack 发表于 2012-12-26 08:47:59

mayiqing888 发表于 2012-12-25 11:15 static/image/common/back.gif
你的In是个什么信号?按键还是时钟?频率高的话,你当然看不到LED的亮灭变化,只能看到4个灯都亮。 ...

没错,LED闪烁过快的话,人眼看起来是常亮的。

hell-prototypes 发表于 2012-12-26 09:55:20

Verolog 2000 以后的版本是可以的。
-----------------------------------------------
材料:
http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf

第13页的最后一行:
* Specifying the initial value as part of the variable declaration was added in Verilog-2000

wuyuehang 发表于 2012-12-30 18:22:37

reg赋值只是对仿真有用,对硬件没有影响,a公司的板子上电之后就是高电平。。

Fourier00 发表于 2012-12-30 19:05:18

赋初值其实意义不大,一般有些状态机会有赋初值的要求,很多电路都没有要初值一定要在某个状态的,也就是不管是寄存器或者状态机在什么状态,一段时间之后都能自恢复,还要赋初值可以用复位的方式来做,同步复位异步复位都可以

dr2001 发表于 2012-12-30 19:44:27

遵循以下两点:
1、FPGA的Register是否可以赋初值和硬件结构相关。硬件不支持的就没有必要讨论。一般新的FPGA都能支持。
如果硬件能够支持赋初值,那么初值是绑定在BitStream里边的,完全可以利用之。Xilinx从S2/V2开始就支持寄存器/BlockRAM初值,A家应该从基本同代芯片开始支持。
X家可以用FPGA Editor中看到支持什么样的初值和配置;A家应该有类似工具查看。

2、如果硬件可以支持初值,那么就看综合工具如何支持初值。
早期的综合工具使用属性来支持初值,这个在VHDL支持的比较好,Verilog的属性(* *)是后来加入的功能;近几年的综合工具直接支持REG变量的初值,一个是reg a = blabal这样,另一个是init section的初值,都可以支持。
另外,有的综合工具支持从异步复位信号值中提取初值。
该信息会在综合工具书册中提供。

qswsjs 发表于 2013-1-5 21:34:41

我经常直接赋初值

zrt0546 发表于 2013-6-30 04:37:34

难道!!!!
你们都不知道 reg类型只能在行为描述always语句块里用吗!!!

大笑

zrt0546 发表于 2013-6-30 04:38:28

修改:

难道!!!!
你们都不知道 reg类型只能在行为描述always语句块赋值吗!!!

大笑

yuyu87 发表于 2013-6-30 08:57:37

同意,初始值还是用外部复位来做吧,一点问题也不会有,

RLCIC 发表于 2013-7-1 22:52:24

VHDL貌似不行吧,一般都在复位时赋初值,每个设计都应该有个复位吧{:smile:}
页: [1]
查看完整版本: 关于FPGA里定义的寄存器赋初值的问题。