为测试台生成具有比率的时钟
Generate clocks with ratio for testbench
我想为我的 I2S 解复用器模块生成测试激励。激励包含来自 ADC 测量的值。 I2S 标准提供了两种时钟:LRCLOCK 和 BITCLOCK。在我的例子中,LRCLOCK 的频率为 48kHz(这也是采样率),而 BITCLOCK 为 64*LRCLOCK,这导致时钟为 3.072MHz。
在测试台中创建时钟时,LRCLOCK 和 BITLCOCK 之间始终存在偏移。而且我无法解释这个偏移量来自哪里。
我试图根据这个post创建一个时钟生成程序: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 的偏移量。
一个 3.072MHz 时钟的周期为 325.5208333...ns,模拟器必须在某处中继该周期,并且它可能与您的其他时钟不在同一数字上。
尝试类似的方法:
signal i2s_lrclock : std_logic := '0';
signal i2s_bitclock : std_logic := '0';
begin
i2s_lrclock <= not(i2s_lrclock) after 10416640 ps; -- 64 * 325.520 ns / 2
i2s_bitclock <= not(i2s_bitclock) after 162760 ps ; -- 325.520 ns / 2
模拟中时钟的实际值不是很重要。他们之间的比例是。
我想为我的 I2S 解复用器模块生成测试激励。激励包含来自 ADC 测量的值。 I2S 标准提供了两种时钟:LRCLOCK 和 BITCLOCK。在我的例子中,LRCLOCK 的频率为 48kHz(这也是采样率),而 BITCLOCK 为 64*LRCLOCK,这导致时钟为 3.072MHz。
在测试台中创建时钟时,LRCLOCK 和 BITLCOCK 之间始终存在偏移。而且我无法解释这个偏移量来自哪里。
我试图根据这个post创建一个时钟生成程序: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 的偏移量。
一个 3.072MHz 时钟的周期为 325.5208333...ns,模拟器必须在某处中继该周期,并且它可能与您的其他时钟不在同一数字上。
尝试类似的方法:
signal i2s_lrclock : std_logic := '0';
signal i2s_bitclock : std_logic := '0';
begin
i2s_lrclock <= not(i2s_lrclock) after 10416640 ps; -- 64 * 325.520 ns / 2
i2s_bitclock <= not(i2s_bitclock) after 162760 ps ; -- 325.520 ns / 2
模拟中时钟的实际值不是很重要。他们之间的比例是。