如何用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;
https://stackoverflow.com/questions/37609493
复制相似问题