我想写一个设计,其中一个过程在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分钟的延迟。
答案 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