Управление скоростью передачи данных АЦП с помощью ПЛИС

#vhdl #fpga #xilinx #adc #xilinx-ise

Вопрос:

Мне нужно контролировать частоту дискретизации АЦП, подключенных к моей ПЛИС.

  1. Я могу использовать АЦП с разрешением 50 Мбит / с, 14 бит. а затем с помощью DCM разделить тактовую частоту источника FPGA 50 МГц на 1 МГц, 2 МГц и 5 МГц и каждый раз использовать эти частоты в качестве тактовой частоты моих АЦП. или я могу использовать АЦП с разрешением 20 Мбит / с, 16 бит и выбрать меньшее соотношение дискретизации в DCM. какой из них предпочтительнее? Является ли это правильным способом мышления?
  2. Я могу придумать что-то вроде:

    если ((скорость передачи данных=1 МС / с и rising_edge(clk_1M)) или (скорость передачи данных=2 мс / с и rising_edge(clk_2M)) или
    (скорость передачи данных=5 мс / с и rising_edge(clk_5M))), то //сохраните образцы данных АЦП с подзапросами ADCDATA1(13 до 0);

это плохое кодирование?! или совершенно неправильно и не сработает?

Ответ №1:

Вы не сказали, какое семейство или P/N ПЛИС вы используете, но, исходя из опыта, существует нижний предел частоты большинства DCM. Вам нужно будет ознакомиться с паспортом данных вашего устройства, чтобы найти минимальную выходную частоту. Это может быть всего 5 или 6 МГц, поэтому достижение 1 МГц или 2 МГц может быть проблемой. То, что я делал в прошлом для низкочастотных интерфейсов АЦП (или любого низкоскоростного параллельного/последовательного интерфейса), — это запускал свои процессы FPGA vhdl, скажем, с удобным целым числом, кратным частоте дискретизации АЦП, как вы предлагаете (скажем, 20 МГц), а затем создавал счетчик, также работающий на частоте 20 МГц, который выдает сигнал включения один раз за период дискретизации АЦП. Для частоты дискретизации 1 МГц это означает, что счетчик будет считать от 0 до 19, а затем сбросить обратно на ноль и повторить последовательность подсчета. Когда значение вашего счета достигнет 19, выведите импульс и назовите его «clock_enable». Затем в процессе выборки АЦП сделайте свой список чувствительности процесса чувствительным только к clk_20M и используйте только rising_edge(clk_20M) в теле вашего процесса следующим образом:

 MY_CLK_ENABLER : process(clk_20M)
begin
    if rising_edge(clk_20M) then
        if (clk_en_count = "10011") then    -- count to 19 the reset
            clk_en_count <= "00000";
            clk_enable <= '1';
        else
            clk_en_count <= clk_en_count   '1';
            clk_enable <= '0';
        end if;
    end if;
end process;


MY_SUB_SMPL : process(clk_20M)
begin
    if rising_edge(clk_20M) then
        if (clk_enable = '1') then
            ADCDATA1(13 downto 0)<= Data_in(13 downto 0);
        end if;
    end if;
end process;

 

Кроме того, если вы используете 16-битный АЦП, я бы хотел использовать все биты, но, похоже, вы каким-то образом ограничены использованием только 14 из 16 битов. Если это верно, и ваш сигнал, подаваемый на вход АЦП, занимает полный диапазон входного напряжения устройства, вы, вероятно, захотите уменьшить разряды с 15 до 2, а не с 13 до 0, потому что использование младших разрядов только с полномасштабным входом приведет к обрезанной цифровой форме сигнала.