Vhdl 综合:在FPGA通电时使用计数器实现延迟信号

Vhdl 综合:在FPGA通电时使用计数器实现延迟信号,vhdl,fpga,Vhdl,Fpga,我尝试在FPGA通电时延迟20秒 有一个100Hz的时钟输入,所以如果计数器达到20000,那应该是20秒的延迟。延迟后,应将输出引脚设置为高。然而,由于某些原因,该输出引脚会立即变高,并且在通电时不会变低。这几乎就像跳过了s_计数您键入的代码没有模拟或合成错误,并且在modelsim模拟软件中有正确的结果。(根据上述第一条评论“fru1tbat”) 关于上述评论,我认为如果您正确合成了FPGA板,而设计不起作用(使用重置端口重置输出和可变参数),那么问题与时钟发生器有关。确保时钟生成器并找到正

我尝试在FPGA通电时延迟20秒


有一个100Hz的时钟输入,所以如果计数器达到20000,那应该是20秒的延迟。延迟后,应将输出引脚设置为高。然而,由于某些原因,该输出引脚会立即变高,并且在通电时不会变低。这几乎就像跳过了s_计数您键入的代码没有模拟或合成错误,并且在modelsim模拟软件中有正确的结果。(根据上述第一条评论“fru1tbat”)


关于上述评论,我认为如果您正确合成了FPGA板,而设计不起作用(使用重置端口重置输出和可变参数),那么问题与时钟发生器有关。确保时钟生成器并找到正确的频率。

出于某种原因,通过声明设置初始值似乎是此FPGA/工具集(Sympsis 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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体延迟是
港口
(
pi_时钟:标准_逻辑;
pi_复位:在标准_逻辑中;
延迟完成:输出标准逻辑
);
终端实体;
行为延迟的体系结构是
开始
进程(pi_时钟)
变量s_计数:整数;
开始
如果上升沿(pi时钟),则
如果pi_Reset='1',则
s_计数:=0;

在100Hz=200s,而不是20s时,完成的延迟为20000。您还可以尝试每N个周期切换一次(根据需要而变化),看看是否可以在该输出上生成任何活动。啊,是的,谢谢您指出这一点。我已经确认,我可以切换它的时钟周期,因此,该变量必须正确递增。也许合成错误地优化了我的信号分配,因为计数从未重置为零?您在模拟中尝试过吗?直接转到合成可能会遇到pin映射问题。尝试其他一些事情:为输出设置一个默认值以设置初始状态,添加一个重置(即使您不使用它),确保您的pi_时钟在通电时不会表现不稳定(高频输入尖峰)。此外,请提及这是哪个synth工具和FPGA。仍然有可能一些工具不支持变量的初始值,并且期望传统的重置。我还没有在模拟中尝试过这一点。我很难为情地说,我还没有弄明白如何使用这个工具集的sim卡,我只是在用示波器查看输出引脚。synth工具是Sympsis Synplify,FPGA是Actel A3PN250。我会试试你的建议。Synplicity(Actel/Microsemi Libero 9版)肯定有一些“特点”,这是我的猜测。(项目中期不跳马意味着我还没有试过Libero 11)。完成这项工作后,完全可以接受你自己的答案。此外,sim卡还可以更快地增强信心。(Modelsim可能有点让人望而生畏,如果你不想学习它,还有其他选择,比如ghdl+gtkwave。
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;