Генерация часов с соотношением для тестового стенда - PullRequest
0 голосов
/ 24 мая 2019

Я хочу создать тестовый стимул для моего модуля I2S demux.Стимул содержит значения из измерения АЦП.Стандарт I2S предусматривает два тактовых сигнала: LRCLOCK и BITCLOCK.В моем случае LRCLOCK имеет частоту 48 кГц (что также является частотой дискретизации), а BITCLOCK равен 64 * LRCLOCK, что дает тактовую частоту 3,072 МГц.

При создании тактовых импульсов в тестовом стенде всегда естьсмещение между LRCLOCK и BITLCOCK.И я не могу объяснить, откуда исходит это смещение.

Я пытался создать процедуру генерации часов в соответствии с этим постом: VHDL - Как мне создать часы в тестовом стенде?

Оба предложенных решения демонстрируют одинаковое поведение.Я работаю с 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;

Я ожидаю, что края обоих часов равныбудьте синхронными, но смещение ips_bitclock составляет 26 сек. до i2s_lrclock.

1 Ответ

0 голосов
/ 24 мая 2019

Часы с тактовой частотой 3,072 МГц имеют период 325,5208333 ... нс, симулятор должен где-то транкировать период, и он, вероятно, не совпадает с цифрой для других ваших часов.

Попробуйте что-нибудь подобное:

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

Реальная стоимость часов в симуляции не очень важна. Соотношение между ними составляет.

...