【问题标题】:Synthesis: Implementing a delay signal using a counter on power-up of FPGA综合:在 FPGA 上电时使用计数器实现延迟信号
【发布时间】:2014-12-03 01:47:36
【问题描述】:

我试图在 FPGA 上电时延迟 20 秒。

有一个 100Hz 的时钟输入,所以如果计数器达到 20,000,那应该是 20 秒的延迟。延迟后,它应该将输出引脚设置为高电平。然而,由于某种原因,这个输出引脚会立即变高,并且在上电时根本不会变低。就好像它完全跳过了 s_count

这是我的代码:

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 增加到最大整数值,只是为了查看我的时钟是否不正确但结果相同。

顶层文件中没有此信号的其他驱动程序。

有人知道我做错了吗?

【问题讨论】:

  • 20,000 @ 100Hz = 200 秒,而不是 20 秒。您还可以尝试每 N 个周期切换一次(根据需要而变化),看看您是否可以在该输出上生成任何活动。
  • 啊,是的,感谢您指出这一点。我已经确认我可以用时钟周期切换它,因此该变量必须正确递增。也许合成错误地优化了我的信号分配,因为计数从未重置为零?
  • 你在模拟中试过了吗?直接进行综合可能会遇到引脚映射问题。一些其他的尝试:为输出设置一个默认值以设置初始状态,添加一个重置(即使你不使用它),确保你的 pi_Clock 在上电时没有表现异常(高频输入尖峰)起来。
  • 另外,请提及这是哪个合成工具和 FPGA。仍然有可能某些工具不支持变量的初始值,并期望进行传统的重置。
  • 我还没有在模拟中尝试过这个。我很尴尬地说我还没有弄清楚如何使用这个工具集来使用 sim,我只是在使用示波器来查看输出引脚。合成器工具是 Synopsis Synplify,FPGA 是 Actel A3PN250。我会尝试你的建议。

标签: vhdl fpga


【解决方案1】:

由于某种原因,通过声明设置初始值似乎是这个 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 发送复位信号 (pi_Reset = '1')。

希望这对未来的任何人都有帮助,特别感谢 Quantum Ripple 和 Brian 提出的硬重置建议。如果你有答案,我会接受。

【讨论】:

  • Synplicity(Actel/Microsemi Libero 9 版)肯定有一些“功能”,我猜想。 (在项目中不跳马意味着我没有尝试过 Libero 11)。完成工作后,接受您自己的答案是完全可以的。此外,sim 会更快地赋予信心。 (Modelsim 可能有点吓人,如果你不想学,还有其他选择,比如 ghdl+gtkwave。sourceforge.net/projects/ghdl-updates/?source=navbar
【解决方案2】:

您键入的代码没有仿真或综合错误,并且在 modelsim 仿真软件中具有正确的结果。 (根据上面第一条评论“fru1tbat”)

关于上述cmets,我认为如果您正确合成了FPGA板并且设计不起作用(应用复位端口来复位输出和可变参数),则问题与时钟发生器有关。确定时钟发生器并找到正确的频率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多