fpga_fresh 发表于 2010-10-1 18:05:53

关于fpga上电复位的问题

本人初学fpga,有个问题搞不清楚,就是fpga上电后寄存器型变量初值是什么?因为有时候需要初值进行判断,,有人说可以写个reset,在reset中赋值,,,可reset指定的引脚没有复位信号上电能复位寄存器的值么?也就是说该如何定义寄存器初始值呢?(initial最好不用)
module temp(clk,rst_n,led_c);

input clk,rst_n;
output led;
regcnt;
reg led;
always@(posedge clk or negedge rst_n)
begin
   if(!rst_n) cnt<=0;
   else if(cnt<2)
    begin
    led<=0;
    end
   else led<=1;
end
endmodule
这个例子中led是1还是0呢?是否和cnt的初始值有关系呢?

8210zbb1 发表于 2010-10-1 22:56:49

ALTERA的CPLD上电后初值是“1”,其它的不清楚。

NJ8888 发表于 2010-10-2 09:34:36

有初值要求老老实实写代码

fpga_fresh 发表于 2010-10-3 14:08:20

我的问题就是如何赋初值呢?在哪赋呢?代码如何写呢?
比如:单片机之类上电后自动从0地址处开始工作,这样我给变量赋了初始值,之后就顺序执行了。而fpga上电后要等待条件,当某条件满足后才能进行赋值,比如来了复位电平,而我又不能每次都手动给出复位信号,所以就想找到一个fpga上电自动执行赋值的方法,或者说在代码里如何实现。望高手给出解答谢谢

NJ8888 发表于 2010-10-3 22:06:10

回复【3楼】fpga_fresh
-----------------------------------------------------------------------

你在外面用个RC+整形电路,如果有MCU,用MCU的IO来控制复位

fpga_fresh 发表于 2010-10-4 07:48:00

那楼上的意思就是必须加外部复位电路才能赋初值了?

NJ8888 发表于 2010-10-4 08:40:43

回复【5楼】fpga_fresh
那楼上的意思就是必须加外部复位电路才能赋初值了?
-----------------------------------------------------------------------

FPGA也可以构造ROM表,表中放你要的数据,然后写语言,当晶体工作,有个计数器计数,数字少于比如10,那就用初始值,数字大于10后就维持不在计数,而你的系统接管这些控制(类似带可预置数据的触发器),则前面相当于INIT

fpga_fresh 发表于 2010-10-5 15:55:57

非常感谢楼上的热心回复,其实我可能就需要对几个寄存器(比如计数器)赋初值,所以感觉不需要用rom表,我现在用的altera的fpga是上电寄存器默认为0,所以相当于上电自动赋初值为0,也可以满足我的设计需要,但我不知道上电默认为零是否可以作为一个可靠的条件?是否和综合器有关系呢?

Jigsaw 发表于 2010-10-6 08:27:19

问题在于如果你想在复位时置初值,就难免不会碰到赋值和操作该寄存器的进程不在同一个进程内,这样做综合的时候就会报错。
这个才是问题所在。

fpga_fresh 发表于 2010-10-6 08:50:20

楼上的意思不是很明白,但我可以把这个寄存器放在一个always里赋值和操作所以不会出现无法综合。我的问题在七楼,望高手回复

Jigsaw 发表于 2010-10-6 09:22:03

刚才提出了一个很笨的问题,呵呵,因为昨晚才碰到过,后来合并成一个很长的always块才解决。


上电默认的状态应该不可以作为可靠条件,就和单片机的IO口一样,和电路结构有关

fpga_fresh 发表于 2010-10-6 16:28:44

呵呵…楼上的平时如何赋初值呢?比如上电后延时10ms再执行程序,用verilog来实现?

fpga_fresh 发表于 2010-10-6 16:36:01

呵呵…楼上的平时如何赋初值呢?比如上电后延时10ms再执行程序,用verilog来实现?

NJ8888 发表于 2010-10-6 17:47:44

我们系统不是FPGA一个芯片,还有MCU,靠MCU完成FPGA的配置和初始化

Jigsaw 发表于 2010-10-6 18:00:47

回复【11楼】fpga_fresh
呵呵…楼上的平时如何赋初值呢?比如上电后延时10ms再执行程序,用verilog来实现?
-----------------------------------------------------------------------

还是菜鸟,我的方法是在进程内加入以复位信号为触发的赋值代码。

但是verilog综合后是硬件结构,不是程序了,自身是没有办法延时执行的。
毕竟verilog是为解决硬件描述而诞生的,不是为了程序。

NJ8888 发表于 2010-10-6 19:24:42

比如上电后延时10ms再执行程序----------FPGA与初始设置值有关的动作时在MCU控制下进行的,其他可以自由动的行为,比如分频那就让他自己动。我会评估并行运行的行为对系统动作的影响,当然也能完全控制FPGA的行为

fpga_fresh 发表于 2010-10-6 22:04:36

感谢楼上的回答,如果我一个只有fpga的系统,需要赋初值的话,就需要一个可靠的复位电路,有没有专门的复位芯片介绍?

holycat 发表于 2010-10-7 20:01:27

有时钟就行。
下面的代码在25MHz时钟CLK下,用22位计数器,做成约168ms宽度的复位信号RESET,相当于一块复位芯片的参数。

signal RESET_CNT: std_logic_vector(21 downto 0) := (others => '1');
signal RESET:   std_logic := '1';

process(CLK)   -- System reset
begin
if (CLK'event and (CLK = '1')) then
    if (RESET_CNT /= 0) then
      RESET_CNT <= RESET_CNT - 1;
    else
      RESET <= '0';
    end if;
end if;
end process;
页: [1]
查看完整版本: 关于fpga上电复位的问题