【发布时间】:2019-10-10 22:05:21
【问题描述】:
我想为我的 I2S 解复用模块生成一个测试激励。激励包含来自 ADC 测量的值。 I2S 标准提供两个时钟:LRCLOCK 和 BITCLOCK。在我的例子中,LRCLOCK 的频率为 48kHz(这也是采样率),而 BITCLOCK 为 64*LRCLOCK,这导致时钟为 3.072MHz。
在测试台中创建时钟时,LRCLOCK 和 BITLCOCK 之间始终存在偏移。而且我无法解释这个偏移量是从哪里来的。
我尝试根据这篇帖子创建一个时钟生成程序:VHDL - How should I create a clock in a testbench?
两种建议的解决方案都表现出相同的行为。 我使用VIVADO 2016.4,模拟器分辨率为1ps
程序:
procedure clk_gen(signal clk : out std_logic; constant FREQ : real) is
constant PERIOD : time := 1 sec / FREQ; -- Full period
constant HIGH_TIME : time := PERIOD / 2; -- High time
constant LOW_TIME : time := PERIOD - HIGH_TIME; -- Low time; always >= HIGH_TIME
begin
-- Check the arguments
assert (HIGH_TIME /= 0 fs) report "clk_plain: High time is zero; time resolution to large for frequency" severity FAILURE;
-- Generate a clock cycle
loop
clk <= '1';
wait for HIGH_TIME;
clk <= '0';
wait for LOW_TIME;
end loop;
end procedure;
时钟分配:
process
begin
i2s_lrclock <= '1';
wait until reset /= '1';
clk_gen(i2s_lrclock,48.0e3);
end process;
process
begin
i2s_bitclock <= '1';
wait until reset /= '1';
clk_gen(i2s_bitclock,48.0e3*64);
end process;
我希望两个时钟的边沿是同步的,但是从 i2s_bitclock 到 i2s_lrclock 的偏移量为 26ps。
【问题讨论】:
-
谁的模拟器将整数抽象文字隐式转换为浮点类型,或者您的意思是第二个过程中的 64.0? REAL 类型是实数的近似值,受尾数精度的限制。从一个时钟推导出另一个时钟,不要乱用 REAL。
-
感谢您的提示。模拟器没有抱怨这一点。我使用了下面建议的解决方案,它现在可以工作了。
-
接受的答案并未反映时钟在硬件中的相关性。期望模拟器报告两个时钟之间未指定和未经测试的关系的错误是不现实的。有一个基本假设你知道 REAL 语义,特别是“近似”位。