如何用Xilinx软件在VHDL编程中检测两个不同时钟(不同频率)的上升边缘同步?
有一个频率为31.845 Mhz的主时钟和另一个频率为29.972 Mhz的时钟。因此,基本目标是在两个时钟的上升边缘之间同步时触发一个动作。我们尝试使用触发器实现它,但是我们只能实现级别同步,而不能实现边缘同步。
我们无法比较两个不同时钟的上升边,如IF
和WAIT
在vhdl中,所以这是不可能的。
我们正试图用计数器来计数脉冲。为此,每当进行边缘匹配时,我们都需要停止计数。我们正在尝试实现一种叫做“游标插值”的方法。
IF
语句中进行比较,所以我们不得不删除它。
if(rising_edge(clk0)=rising_edge(clk1)) then wait;
WAIT
语句(wait until
),但失败了。发布于 2017-10-11 16:49:08
首先,我不知道你为什么要这么做。你将得到一个新的时钟,在两个时钟之间的拍频。
正确的方法是使用至少是最高期望输入频率两倍的另一个时钟对两个时钟进行采样。您可以使用设备中的一个PLL来生成这个更高的时钟。x2是最小值。理想情况下,使用比两个采样时钟都高得多的时钟。
请记住,VHDL不是一种语言,它是一种真实硬件的综合描述。因此,仅仅说Rising_Edge(clk1) = Rising_Edge(clk2)并不能使“软件”检测边缘。Rising_Edge真正做的所有功能就是告诉硬件将clk信号连接到触发器的时钟输入。
适当的解决方案是在一个过程中采样两个“时钟”,由一个样本时钟来时钟,寻找边缘(一个边是随后的两个不同的样本),然后是结果和锁存(如果需要)。
示例代码(未经测试,很抱歉现在没有时间)。
entity twoclocks is
port (
op : out std_logic;
clk1 : in std_logic;
clk2 : in std_logic;
sample_clk : in std_logic);
end entity;
architecture RTL of twoclocks is
begin
process sample(sample_clock, clk1, clk2):
begin
if rising_edge(sample_clock):
clk1_d <= clk1;
clk2_d <= clk1;
if clk1_d != clk1 and clk2_d != clk2 then
op <= '1';
else
op <= '0';
end if;
end if;
end process;
end architecture;
发布于 2017-10-12 12:44:59
您想要构建的游标内插器需要使用非常严格的时间限制,因此您可能无法单独使用VHDL。您需要(很多)设备特定的资源位置和时间限制。
请查一下A.Aloisio等人的工作。。阿洛西奥和他的同事使用特定的Xilinx延迟元件构建了游标内插器。
标准的VHDL综合主要适用于寄存器传输级描述。即时钟/同步逻辑。但是要比较这两个输入,您需要在两个频率中最不常见的倍数上对它们进行采样。对于31.845 MHz和29.972 MHz,这是一个巨大的954.458340 MHz,这是很多。不过,我在FPGA逻辑中看到了这种速度。..。但我想你甚至需要加倍因为尼奎斯特。也许现在FPGA逻辑可以处理2 GHz的采样率。但我不确定。
可能会为此使用GT收发器,但由于这将是这样一个收发器的非标准使用,这可能很难实现。
https://stackoverflow.com/questions/37609493
复制相似问题