【发布时间】:2020-04-23 11:01:08
【问题描述】:
我想知道什么是“最好的”或至少是“好”的方式来实现一个同时作用于总线或通信时钟上的进程。
假设您想提供一个可以发送和接收数据的 FiFo。通常,接收到的数据在其总线“com_clk”的“下降”沿分配,其中发送的数据需要在“com_clk”的上升沿更新,以便在对方分配数据时最稳定下降沿。
对于这种情况,我可以想到多种实现方式,但我无法评估它们在硬件使用、鲁棒性或综合性方面的“好”程度,而且我通常也不知道看起来像这样的好资源.
我的方法看起来像这样,当然是通常的框架:
方法一:
wait until rising_edge(com_clk);
if reading='1' then
wait until com_clk='0';
internal_mem <= bus_data; --read the data from the bus
else
bus_data <= internal_mem ; --write the data to the bus
end if;
方法二:
wait until rising_edge(sys_clk); --should be much faster than "clk" i guess about 10x(?)
if reading='1' then
wait until com_clk='0'; --wait for the com_clk to become '0'
internal_mem <= bus_data; --read the data from the bus
else
wait until com_clk='1'; --wait for the com_clk to become '1'
bus_data <= internal_mem ; --write the data to the bus
end if;
解决方案 2 的派生是为“com_clk”构建一个边缘检测器,并将该信号用于“等待”或“if 子句”。 那么,什么是对 com_clk 信号的两个边缘起作用的“好”或“最佳”方法,我如何自己评估呢?
【问题讨论】:
-
"通常接收到的数据在其总线 "com_clk" 的 "下降" 沿被分配,而发送出去的数据需要在 "com_clk" 的上升沿被更新 " 不,那是不寻常的。通常情况下,一切都从一个时钟沿开始。两个边沿上的时钟不会为您带来任何好处,因为您不妨将一个边沿与两倍快的时钟一起使用。优点是您的时钟不必精确到 50/50。
-
我很确定我现在已经在几个应用笔记中读到了这一点,它在信噪比方面很有意义。在数据变化的同时记录数据并不是一个好主意。
-
这不是一个 VHDL 问题,而是一个设计问题。您可以在 VHDL 中很好地在两个边缘上计时。它只是不可能将它映射到 FPGA(甚至它是一个 asic,而不是你编码的方式)。以 2 倍速率进行时钟是非常正常的 - 然后您在时序规范中设置时钟数据时序,以确保您保持正确的建立/保持时间要求。
-
假设您正在尝试实现类似 UART 的功能?在通常的 FPGA 实现中,此类功能不是由时钟直接触发,而是由用作使能的派生信号触发。 FPGA 通常没有能够在两个时钟边沿触发的硬件。
-
@Tricky 我只关心 VHDL 中的实现,所以我想说这个问题只是关于 VDHL,我不想在两个边缘都计时,问题的核心真的是如何让我的解决方法。当我正确地将 sys_clk 频率提高到至少两倍于 com_clk 时,为 com_clk 构建两个边缘检测器,然后根据边缘检测器状态选择一个动作将是一种选择。我如何确保建立/保持时间,这些是我的架构还是可配置参数的结果?
标签: vhdl