我知道rising_edge(clk)和clk'event和clk ='1'。 我猜他们会发现边缘。 但是让我说我想在clk高和中途时读取输入。我想我能写出我想传达的东西,那么我们怎么做呢? 如果我不对,请解释。 感谢
答案 0 :(得分:1)
在测试平台中,还是可以合成到真正的硬件中?
假设你的时钟有句号clk_period,声明类似
constant clk_period : time := 100 ns; -- for 10 MHz
clk <= not clk after clk_period/2;
您可以编写像
这样的测试平台代码wait until rising_edge(clk);
wait for clk_period/4;
value <= my_input;
然而,这是不可合成的。在真实硬件中,您需要一种不同的方法。大多数FPGA具有时钟生成模块(PLL,DLL,DCM),可以生成相移或反相时钟,您可以使用这样的块来完成任务。更具体的建议取决于您使用的实际FPGA,以及您是否有更快的时钟可用。
例如,给定clk
和clk_2x
相位对齐(以便每个clk边缘是clk_2x上升沿),您可以使用clk_2x的下降沿,而clk为高。
process(clk_2x)
begin -- capture data
if falling_edge(clk_2x) then
if clk = '1' then
temp <= data_in;
end if;
end if;
end process;
process(clk)
begin -- resynch to main clock domain
if rising_edge(clk) then
value <= temp;
end if;
end process;
替代方法可能涉及通过延迟,反相或其他修改时钟为ADC提供时钟,或者在输入数据上使用IOB中的可选延迟,以便(延迟)数据在时钟边沿期间保持稳定。
这是 - 如果没有非常好的外部部件的SIM模型,在模拟中正确进行可能非常棘手,并且需要对实际硬件进行全面测试。我有时会将相位可控时钟用于外部部件,并在选择一个阶段或延迟生产值之前绘制出相位范围。