我有 2 个模块使用相同的时钟但在不同的文件中,当我在模块 B 中对来自模块 A 的信号进行采样时,在波形模拟中,它不会像应该的那样在一个时钟周期后获得样本,它表明这是样本相同的上升沿(适合异步实例化的行为)。
有人告诉我这是因为 Active-HDL 由于组件不同而将其视为 2 个不同的时钟,这就是为什么它在相同的上升沿进行采样(因为信号从 A 到 B 的增量时间)。
我如何定义 Active-HDL 将理解它们都在同一区域使用相同的时钟?
我有 2 个模块使用相同的时钟但在不同的文件中,当我在模块 B 中对来自模块 A 的信号进行采样时,在波形模拟中,它不会像应该的那样在一个时钟周期后获得样本,它表明这是样本相同的上升沿(适合异步实例化的行为)。
有人告诉我这是因为 Active-HDL 由于组件不同而将其视为 2 个不同的时钟,这就是为什么它在相同的上升沿进行采样(因为信号从 A 到 B 的增量时间)。
我如何定义 Active-HDL 将理解它们都在同一区域使用相同的时钟?
在您的芯片和仿真环境中处理时钟需要与您在进行电路板设计时所采取的相同类型的注意。特别是时钟偏差必须始终小于最小传播延迟。
在 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 ;
还有其他方法可以解决这个问题。
这与您的模拟器无关。我假设你正在做这样的事情:
+----------+ +----------+
| |-- clk --->| |
clk --->| Module A | | Module B |
| |-- data -->| |
+----------+ +----------+
你应该在哪里做这样的事情:
+----------+ +----------+
| | | |
clk -+->| Module A |-- data -->| Module B |
| | | | |
| +----------+ | |
| | |
+-----------------------> | |
+----------+
第一种配置的问题在于,当您的时钟信号通过模块 A 时,它会延迟一个或多个增量周期。因此,它可能会在与数据信号相同或较晚的增量周期中切换。这是您在模拟器的波形视图中看不到的东西(除非它具有扩展增量周期的选项),但您可以查看列表视图以准确了解增量时间中发生的情况。