在Vhdl中创建实时延迟

时间:2015-04-29 15:39:47

标签: vhdl

我想写一个设计,其中一个过程在1分钟后完全激活。

我创建了另一个进程来使用计数器增量创建延迟,并切换信号,并将该信号提供给必须延迟的进程的敏感性列表。

signal delay_over : std_logic;

process ( delay_over )
begin 
     if clk'event and clk '1' then
         --design
     end if;
end process;

delay:process ( clk )
variable counter : integer := 0;
begin 
--design to create delay
end process;

我应该使用什么样的值或类型来创建精确1分钟的延迟。

1 个答案:

答案 0 :(得分:2)

在同步设计中等待实时延迟(任何带时钟的设计)就像计算时钟一样简单,或计数通过计数生成的时基的启用时钟。

例如,假设你需要处理的最小实时单位是1秒(也就是说,你永远不需要处理十分之一,毫秒等)。您的时基可以是几秒钟。 因此,您需要弄清楚如何将单个时钟的周期(持续时间)转换为秒。

假设你有一个25MHz的时钟。这意味着一秒钟内有25个6个时钟。这意味着您需要计数最多25e6(或(25e6)-1,具体取决于您的设置),将计数器重置为零,然后重新开始计数。每次计数器达到0(或25e6,或计数中的任何其他单个值)时,您可以在一个时钟周期内脉冲使能。 启用是您的“秒”时基。

所有其他逻辑都可以参考“秒”时基启用。要创建10秒的实时延迟,您只需要计算秒时基启用的10个脉冲。

以下是一个示例的片段,为您提供这个想法:

   timebase : process (I_CLK) is
   begin
      if (rising_edge(I_CLK)) then
         counter_1sec_en <= '0';
         if (counter < COUNTS_IN_1_SEC-1) then
            counter <= counter + 1;
         else
            counter_1sec_en <= '1';
            counter         <= (others => '0');
         end if;
      end if;
   end process timebase;

   delay : process (I_CLK) is
   begin
      if (rising_edge(I_CLK)) then
         seconds_delay_done <= '0';
         if (counter_1sec_en = '1') then
            if (seconds_delay < NUM_SECONDS_TO_DELAY-1) then
               seconds_delay <= seconds_delay + 1;
            else
               seconds_delay_done <= '1';
               seconds_delay <= (others => '0');
            end if;
         end if;
      end if;
   end process delay;

使用此代码段的一些注意事项:

  • 一切都与您的时钟同步,I_CLK
  • COUNTS_IN_1_SEC是一个常数,即以Hz为单位的时钟频率
  • counter_1sec_en每秒脉冲一次,单个I_CLK周期
  • NUM_SECONDS_TO_DELAY是您想要延迟的几秒钟。例如,60秒。
  • 当延迟完成时,
  • seconds_delay_done个脉冲持续I_CLK个周期。
  • 您可能需要更多控制何时布防/启用延迟,并可能控制延迟的秒数(即NUM_SECONDS_TO_DELAY可能不是常数)。

在您的情况下,如果您希望在1分钟后“激活”某些内容,则可以使用seconds_delay_done启用“启动”您要启动的任何内容。

另外,对于另一个问题,请参阅此几乎相同的答案:https://stackoverflow.com/a/29948250/561560