关于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的初始值有关系呢? ALTERA的CPLD上电后初值是“1”,其它的不清楚。 有初值要求老老实实写代码 我的问题就是如何赋初值呢?在哪赋呢?代码如何写呢?
比如:单片机之类上电后自动从0地址处开始工作,这样我给变量赋了初始值,之后就顺序执行了。而fpga上电后要等待条件,当某条件满足后才能进行赋值,比如来了复位电平,而我又不能每次都手动给出复位信号,所以就想找到一个fpga上电自动执行赋值的方法,或者说在代码里如何实现。望高手给出解答谢谢 回复【3楼】fpga_fresh
-----------------------------------------------------------------------
你在外面用个RC+整形电路,如果有MCU,用MCU的IO来控制复位 那楼上的意思就是必须加外部复位电路才能赋初值了? 回复【5楼】fpga_fresh
那楼上的意思就是必须加外部复位电路才能赋初值了?
-----------------------------------------------------------------------
FPGA也可以构造ROM表,表中放你要的数据,然后写语言,当晶体工作,有个计数器计数,数字少于比如10,那就用初始值,数字大于10后就维持不在计数,而你的系统接管这些控制(类似带可预置数据的触发器),则前面相当于INIT 非常感谢楼上的热心回复,其实我可能就需要对几个寄存器(比如计数器)赋初值,所以感觉不需要用rom表,我现在用的altera的fpga是上电寄存器默认为0,所以相当于上电自动赋初值为0,也可以满足我的设计需要,但我不知道上电默认为零是否可以作为一个可靠的条件?是否和综合器有关系呢? 问题在于如果你想在复位时置初值,就难免不会碰到赋值和操作该寄存器的进程不在同一个进程内,这样做综合的时候就会报错。
这个才是问题所在。 楼上的意思不是很明白,但我可以把这个寄存器放在一个always里赋值和操作所以不会出现无法综合。我的问题在七楼,望高手回复 刚才提出了一个很笨的问题,呵呵,因为昨晚才碰到过,后来合并成一个很长的always块才解决。
上电默认的状态应该不可以作为可靠条件,就和单片机的IO口一样,和电路结构有关 呵呵…楼上的平时如何赋初值呢?比如上电后延时10ms再执行程序,用verilog来实现? 呵呵…楼上的平时如何赋初值呢?比如上电后延时10ms再执行程序,用verilog来实现? 我们系统不是FPGA一个芯片,还有MCU,靠MCU完成FPGA的配置和初始化 回复【11楼】fpga_fresh
呵呵…楼上的平时如何赋初值呢?比如上电后延时10ms再执行程序,用verilog来实现?
-----------------------------------------------------------------------
还是菜鸟,我的方法是在进程内加入以复位信号为触发的赋值代码。
但是verilog综合后是硬件结构,不是程序了,自身是没有办法延时执行的。
毕竟verilog是为解决硬件描述而诞生的,不是为了程序。 比如上电后延时10ms再执行程序----------FPGA与初始设置值有关的动作时在MCU控制下进行的,其他可以自由动的行为,比如分频那就让他自己动。我会评估并行运行的行为对系统动作的影响,当然也能完全控制FPGA的行为 感谢楼上的回答,如果我一个只有fpga的系统,需要赋初值的话,就需要一个可靠的复位电路,有没有专门的复位芯片介绍? 有时钟就行。
下面的代码在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]