我有两个模块使用相同的时钟,但在不同的文件中,当我采样来自模块B中的模块A的信号时,在波形模拟中,它在一个时钟周期后没有像它应该的那样获得采样,它显示在相同上升沿的采样(适合异步复位的行为)。
我被告知这是因为Active-HDL认为它是2个不同的时钟,因为不同的组件,这就是为什么它在相同的上升沿采样(因为信号从A到B的增量时间)。
如何定义Active-HDL才能理解它们在相同区域中使用相同时钟?
发布于 2013-10-07 15:41:19
这与你的模拟器无关。我假设您正在做这样的事情:
+----------+ +----------+
| |-- clk --->| |
clk --->| Module A | | Module B |
| |-- data -->| |
+----------+ +----------+你应该做这样的事情:
+----------+ +----------+
| | | |
clk -+->| Module A |-- data -->| Module B |
| | | | |
| +----------+ | |
| | |
+-----------------------> | |
+----------+第一种配置的问题是,当时钟信号通过模块A时,它会延迟一个或多个增量周期。因此,时钟信号可能在与数据信号相同或更晚的增量周期中切换。这是您在模拟器的波形视图中看不到的东西(除非它具有展开增量周期的选项),但是您可以查看列表视图,以查看增量时间中到底发生了什么。
发布于 2013-10-08 08:59:53
在芯片和模拟环境中处理时钟需要的注意事项与进行电路板设计时需要注意的事项相同。特别地,时钟偏差必须始终小于最小传播延迟。
在RTL仿真环境中,信号上的所有延迟都是以增量周期(不使用after时任何信号分配的默认延迟)来测量的。通过端口不会导致任何增量周期。然而,对信号的每次赋值都会导致增量周期延迟。
确保成功传输数据的一种方法是确保设计中的所有时钟在使用时都是增量周期对齐的。要确保发生这种情况,最简单的方法是确保没有任何块对它们使用的时钟进行赋值。因此,请不要执行以下任何操作:
LocalClk <= PortClk ; -- each assignment causes a delta cycle of clock skew
GatedClk <= Clk and Enable ; -- clock gates are bad. See alternative below一般来说,我们很少使用时钟门--然后我们只在它是我们方法论中认可的部分时才使用它(通常不是针对FPGA)。在设计中不使用门控时钟,而是使用数据路径启用:
process (Clk)
begin
if rising_edge(Clk) then
if Enable = '1' then
Q <= D ;
end if ;
end if ;
end process ; 还有其他方法可以解决这个问题。
https://stackoverflow.com/questions/13178195
复制相似问题