关于FPGA里定义的寄存器赋初值的问题。
比如定义一个6位寄存器count, 要给它赋一个初始值5,能否这样下, 如果不是,该如何写? 谢谢reg count = 6'd5; 我经常这么干,也不知合理否。。。 6是二进制的位数吧
6'b101 xiaoqingy 发表于 2012-12-24 18:33 static/image/common/back.gif
6是二进制的位数吧
6'b101
对,d是十进制,6'd5就是把一个6位的5写进去。 可以的~ 做个实验看看,把赋的初值直接送到LED显示。 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
zouyf12 发表于 2012-12-25 09:32 static/image/common/back.gif
刚做了实验,用的是ACTEL的A3P060, 发现这样写不行,上电4个灯都是亮的(说明Count = 4'b1111) ...
我在quarters ii 环境下这样用没有问题哦 zouyf12 发表于 2012-12-25 09:32 static/image/common/back.gif
刚做了实验,用的是ACTEL的A3P060, 发现这样写不行,上电4个灯都是亮的(说明Count = 4'b1111) ...
你的In是个什么信号?按键还是时钟?频率高的话,你当然看不到LED的亮灭变化,只能看到4个灯都亮。 quartus下仿真出来的,代码完全没问题 XP85118978 发表于 2012-12-25 10:59 static/image/common/back.gif
我在quarters ii 环境下这样用没有问题哦
就是像C语言一样,初始赋个值,那该寄存器里面就在上电以后就是这个数值是吗?
不过其实我个人是觉得, 如果按照FPGA本来的性质, 不应该可以用这种方法赋初值的, 好比你用FPGA描述了一个类似74HC161的计数器, 那除非有外部信号驱动LOAD脚, 让它把设定值装载进去, 要不然这个芯片绝对不会在没有外部影响下,上电会自己把自己计数器的值变为某个特定值, 如果这样有可能,那单片机之类的东西就不需要上电复位这个东西了。
至于Altera 的芯片有这种功能,个人觉得不排除其FPGA本身具有这种上电后装载初值的功能, 毕竟RAM类型的FPGA本身上电前就需要装载配置芯片里的文件, 在装载是顺带把值改为初始值也不是不可以。
以上个人愚见。 mayiqing888 发表于 2012-12-25 11:15 static/image/common/back.gif
你的In是个什么信号?按键还是时钟?频率高的话,你当然看不到LED的亮灭变化,只能看到4个灯都亮。 ...
按键,而且只是做个样子,实际上从头到尾没有按过,然后 一上电每次都是全亮,偶尔是全灭, 反正没有一次是那个特定的值,如果说上电时,按键的那个IO也会有电压的抖动造成计数器计数的话,那也不大可能每次都是0 和ff, 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;
直接这样测试看看。 mayiqing888 发表于 2012-12-25 11:15 static/image/common/back.gif
你的In是个什么信号?按键还是时钟?频率高的话,你当然看不到LED的亮灭变化,只能看到4个灯都亮。 ...
没错,LED闪烁过快的话,人眼看起来是常亮的。 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 reg赋值只是对仿真有用,对硬件没有影响,a公司的板子上电之后就是高电平。。 赋初值其实意义不大,一般有些状态机会有赋初值的要求,很多电路都没有要初值一定要在某个状态的,也就是不管是寄存器或者状态机在什么状态,一段时间之后都能自恢复,还要赋初值可以用复位的方式来做,同步复位异步复位都可以 遵循以下两点:
1、FPGA的Register是否可以赋初值和硬件结构相关。硬件不支持的就没有必要讨论。一般新的FPGA都能支持。
如果硬件能够支持赋初值,那么初值是绑定在BitStream里边的,完全可以利用之。Xilinx从S2/V2开始就支持寄存器/BlockRAM初值,A家应该从基本同代芯片开始支持。
X家可以用FPGA Editor中看到支持什么样的初值和配置;A家应该有类似工具查看。
2、如果硬件可以支持初值,那么就看综合工具如何支持初值。
早期的综合工具使用属性来支持初值,这个在VHDL支持的比较好,Verilog的属性(* *)是后来加入的功能;近几年的综合工具直接支持REG变量的初值,一个是reg a = blabal这样,另一个是init section的初值,都可以支持。
另外,有的综合工具支持从异步复位信号值中提取初值。
该信息会在综合工具书册中提供。
我经常直接赋初值 难道!!!!
你们都不知道 reg类型只能在行为描述always语句块里用吗!!!
大笑 修改:
难道!!!!
你们都不知道 reg类型只能在行为描述always语句块赋值吗!!!
大笑 同意,初始值还是用外部复位来做吧,一点问题也不会有, VHDL貌似不行吧,一般都在复位时赋初值,每个设计都应该有个复位吧{:smile:}
页:
[1]