我有2个模块使用相同的时钟,但是在不同的文件中,当我对来自模块B中的模块A的信号进行采样时,在波形模拟中它不会像应该的那样在一个时钟周期后得到样本,它表明是同一上升沿的样本(适合异步实例的行为)。
我被告知它发生了,因为Active-HDL认为它是2个不同的时钟因为不同的组件,这就是为什么它在相同的上升沿采样(因为信号从A到B的增量时间)。
我如何定义Active-HDL会理解它们在相同区域使用相同的时钟?
答案 0 :(得分:2)
这与您的模拟器无关。我假设你正在做这样的事情:
+----------+ +----------+
| |-- clk --->| |
clk --->| Module A | | Module B |
| |-- data -->| |
+----------+ +----------+
你应该做那样的事情:
+----------+ +----------+
| | | |
clk -+->| Module A |-- data -->| Module B |
| | | | |
| +----------+ | |
| | |
+-----------------------> | |
+----------+
第一种配置的问题在于,当时钟信号通过模块A时,它会延迟一个或多个增量周期。因此,它可以在与数据信号相同或更晚的增量周期中切换。这是你在模拟器的波形视图中看不到的东西(除非它有扩展delta周期的选项),但你可以查看列表视图以确切了解delta时间内发生的情况。
答案 1 :(得分:2)
在芯片内和模拟环境中处理时钟需要您在进行电路板设计时采取相同的谨慎态度。特别是时钟偏差必须始终小于最小传播延迟。
在RTL仿真环境中,信号的所有延迟都是根据增量周期(当您不使用之后的任何信号分配的默认延迟)来测量的。通过端口不会产生任何增量周期。但是,对信号的每次分配都会导致增量循环延迟。
确保成功传输数据的一种方法是确保设计中的所有时钟在使用时都是三角形循环对齐的。确保发生这种情况的最简单方法是确保没有任何块对它们使用的时钟进行分配。因此,请勿执行以下任何操作:
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 ;
还有其他方法可以解决这个问题。