[英]Synthesis: Implementing a delay signal using a counter on power-up of FPGA
我试图将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增加到最大整数值,只是为了查看我的时钟是否不正确但结果相同。
顶级文件中没有该信号的其他驱动程序。
有人看到我在做什么错吗?
由于某种原因,即使通过模型声明仿真工作,该FPGA /工具集(概要Synplify和FPGA是Actel A3PN250)也可能是通过声明设置初始值的问题。
以下代码实现了我想要的-在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发送复位信号(pi_Reset ='1')。
希望这对将来的任何人有帮助,这要归功于Quantum Ripple和Brian提出的硬重置建议。 如果您有答案,我会接受。
您键入的代码没有仿真或综合错误,并且在modelsim仿真软件中具有正确的结果。 (根据上述第一条评论“ fru1tbat”)
关于上述评论,我认为如果您正确地合成了FPGA板而设计不起作用(使用复位端口来复位输出和可变参数),则问题与时钟发生器有关。 确保有关时钟发生器,并找到正确的频率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.