q20005 发表于 2010-11-3 19:08:13

FPGA如何硬件延时?

各位 我现在有一段程序需要延时 比如一个信号进来后使A端口输出0 然后过500ns使端口B输出1 请教各位 我该如何做?本人新手 希望各位说的尽量详细一些 谢谢!

NJ8888 发表于 2010-11-3 19:10:39

500ns,如果你用移位寄存器,假设你有个时钟20M,在第十个输出端出来再反相

zzjjhh250 发表于 2010-11-3 20:35:10

计数器计数就好了!

q20005 发表于 2010-11-4 14:47:56

回复【2楼】zzjjhh250 华电电子
计数器计数就好了!
-----------------------------------------------------------------------

能说的详细一点么 新手不太明白

crom 发表于 2010-11-4 15:04:06

你的时钟是多少的?
假如你的时钟是20M,那么时钟周期就是50ns,你需要500ns,那好,你做一个计数器,在信号进来时开始计数,开始数时钟信号的上升沿或者下降沿,数到十个,就够500ns了,将你的B端口置1即可。
这样做的问题是如果A是非同步的,A和B时间差大概是500-550ns之间,为了精确一点,可以将A也做成同步的,可以在时钟信号的上升沿将A置零,然后开始上升沿计数。这样A和B的时间差也就是你用的FPGA管脚之间的延时差+500ns了,误差多数也就是几个到十几个ns。
消耗的资源看你时钟的频率了。如果是20M,计数器也就是4位,用不了几个门。
我也是新手,如果有讲的不当的地方,请大家批评指正,谢谢。

lanqilove 发表于 2010-11-5 14:50:24

“比如一个信号进来后使A端口输出0”假设你所需要的一个信号为c,假设你需要在c上升沿改变A,假设你的时钟是20MHZ
signal en:std_logic;
signal cnt:std_logic_vector(3 downto 0);
process(c)
begin
if c'event and c='1' then
   A<='0';
   en<='1';
end if;
end process;

process(clk,en)
begin
if clk'event and clk ='1' then
   if en='1' then
    if cnt="1010" then
   B<='1';
   en<='0';
   cnt<="0000";
   else cnt<=cnt+1;
end if;
end if;
end if;
end process;

这只是个示范性的,真正运行起来还有逻辑问题,楼主参考一下

YFM_LMM 发表于 2010-11-7 11:28:05

用时钟同步

470036398 发表于 2010-11-24 13:47:58

大家能否讨论一下组合逻辑电路怎样延时?用多个反相器串联的话会被综合器优化掉,不知道有没有好的办法,请高手指教!!

ngzhang 发表于 2010-11-24 14:04:28

FPGA组合逻辑延时不准的,而且也不是良好的设计手段。
页: [1]
查看完整版本: FPGA如何硬件延时?