Я пытаюсь интегрировать (суммировать) 14-битный сигнал АЦП на частоте 50 МГц.Интеграция начинается с нарастающего фронта сигнала «триггер».Если интеграл достигает определенного порога (6000000), цифровой сигнал («dout») должен быть установлен в 0 (который стал 1 с «триггером», становящимся 1).Пока задача довольно легкая.Хотя на самом оборудовании (Cyclone V) я понял странное поведение.Хотя я держал уровень напряжения на постоянном АЦП, ширина импульса выходного сигнала «dout» иногда колеблется (хотя он должен оставаться почти постоянным для постоянного 14-разрядного значения на АЦП, который имеет низкий уровень шума).Ширина импульса уменьшается с ростом уровня напряжения, поэтому сама интеграция работает нормально.Но он продолжает колебаться.
Вот мой код:
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
entity integrator is
port(
trigger: in std_logic;
adc: in std_logic_vector(13 downto 0);
clk: in std_logic;
dout: out std_logic);
end integrator ;
architecture rtl of integrator is
signal sum : integer;
begin
process(clk) is
begin
if rising_edge(clk) then
if (trigger='1') and (sum<6000000) then
sum<=sum+to_integer(unsigned(adc));
dout<='1';
else
dout<='0';
if (trigger='0') then
sum<=0;
end if;
end if;
end if;
end process;
end rtl;
Я проверил сигналы, используя SignalTab II от Quartus Prime.Я понял, что значение «сумма» растет, но не совсем правильно (по сравнению с суммой, которую я вычислил вручную по значениям «АЦП».
Я использовал ФАПЧ для сдвига фазы тактового сигнала 50 МГц ("clk ") около 90 градусов. Полученные часы послужили входом для тактовых импульсов АЦП. Я пропустил ФАПЧ и значение" сумма "совпало. Тем не менее я вижу колебания в сигнале" dout "(осциллограф).
Еще более странно: я изменил тип "суммы" на unsigned и, наконец, флуктуации исчезли. Но только без использования PLL! Но при внесении изменений в код ниже флуктуации вернулись. Может быть, сумма целых и беззнаковых этилированныхв другое время?!?
Теперь возникают вопросы: - Почему значение «сумма» является неправильным при использовании PLL (хотя значение «adc» должно оставаться постоянным в течение половины такта при сдвиге фазы90 градусов)? - Почему я вижу колебания в "dout"? Что-то не так с кодом?
EDIT1: Добавить testbench
Вот мой тестовый стенд:
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
entity testbench is
end testbench;
architecture tb of testbench is
component integrator is
port(
trigger: in std_logic;
adc: in std_logic_vector(13 downto 0);
clk: in std_logic;
dout: out std_logic);
end component;
signal trigger_in, clk_in, dout_out: std_logic;
signal adc_in: std_logic_vector(13 downto 0);
begin
DUT: integrator port map(trigger_in, adc_in, clk_in, dout_out);
process
begin
for I in 1 to 4500 loop
clk_in <= '0';
wait for 10 ns;
clk_in <= '1';
wait for 10 ns;
end loop;
wait;
end process;
process
begin
trigger_in <= '0';
wait for 10 us;
trigger_in <= '1';
wait for 30 us;
trigger_in <= '0';
wait for 10 us;
trigger_in <= '1';
wait for 30 us;
trigger_in <= '0';
wait for 10 us;
wait;
end process;
process
begin
adc_in <= (others => '0');
wait for 10 us;
adc_in <= std_logic_vector(to_unsigned(6000, 14));
wait for 30 us;
adc_in <= (others => '0');
wait for 10 us;
adc_in <= std_logic_vector(to_unsigned(6000, 14));
wait for 30 us;
adc_in <= (others => '0');
wait for 10 us;
wait;
end process;
end tb;
И полученный результат: