我想写其中,一个进程得到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秒(也就是,你将永远不会需要处理的十分之一,毫秒,等等)。 然后,您的时基可以秒。 所以,你需要弄清楚如何从一个时钟周期(持续时间)到第二转换。
让我们假设你有一个25MHz的时钟。 这意味着有在第二25e6时钟。 这意味着你需要数到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
是一个常量,它是在你的赫兹时钟频率 -
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