我试图在FPGA上电时延迟20秒。
有一个100Hz的时钟输入,所以如果一个计数器达到20,000,那应该是20秒的延迟。延迟后,应将输出引脚设置为高电平。但是,出于某种原因,这个输出引脚立即变高,并且在上电时根本不会变低。它几乎就像完全跳过s_count< = 20000一样。
这是我的代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity delay is
port
(
pi_Clock : in std_logic;
po_Delay_Done : out std_logic
);
end entity;
architecture behavioral of delay is
begin
process(pi_Clock)
variable s_count : integer := 0;
begin
if rising_edge(pi_Clock) then
if s_count <= 20000 then
s_count := s_count + 1;
po_Delay_Done <= '0';
else
po_Delay_Done <= '1';
end if;
end if;
end process;
end architecture;
我已将20000增加到最大整数值,只是为了查看我的时钟是否不正确但结果相同。
顶级文件中没有此信号的其他驱动程序。
任何人都能看到我做错了什么?
答案 0 :(得分:2)
出于某种原因,通过声明设置初始值似乎是这个FPGA /工具集(概要Synplify和FPGA是Actel A3PN250)的问题,即使它在modelsim仿真中有效。
以下代码可以满足我的需求 - 在FPGA打开20秒后将输出设置为高电平:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity delay is
port
(
pi_Clock : in std_logic;
pi_Reset : in std_logic;
po_Delay_Done : out std_logic
);
end entity;
architecture behavioral of delay is
begin
process(pi_Clock)
variable s_count: integer;
begin
if rising_edge(pi_Clock) then
if pi_Reset = '1' then
s_count := 0;
po_Delay_Done <= '0';
else
if s_count < 2000 then
s_count := s_count + 1;
else
po_Delay_Done <= '1';
end if;
end if;
end if;
end process;
end architecture;
问题在于,微控制器现在在FPGA启动后向FPGA发送复位信号(pi_Reset ='1')。
希望这对未来的任何人都有帮助,感谢Quantum Ripple和Brian特别建议硬重置。如果你有答案我会接受它。
答案 1 :(得分:0)
您输入的代码没有模拟或综合错误,并且在modelsim仿真软件中具有正确的结果。 (根据上面的第一条评论“fru1tbat”)
关于上述评论,我认为如果您正确合成FPGA板并且设计不起作用(应用复位端口来复位输出和可变参数),则问题与时钟发生器有关。确保时钟发生器并找到正确的频率。