在clk中间clk ='1'时读取输入值

时间:2014-03-10 08:28:52

标签: vhdl

我知道rising_edge(clk)和clk'event和clk ='1'。 我猜他们会发现边缘。 但是让我说我​​想在clk高和中途时读取输入。我想我能写出我想传达的东西,那么我们怎么做呢? 如果我不对,请解释。 感谢

1 个答案:

答案 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,以及您是否有更快的时钟可用。

例如,给定clkclk_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模型,在模拟中正确进行可能非常棘手,并且需要对实际硬件进行全面测试。我有时会将相位可控时钟用于外部部件,并在选择一个阶段或延迟生产值之前绘制出相位范围。