На работе пытаемся организовать такой процесс(синтез частоты путем DDS) :через spi загружается 40 разрядный входной код. Этот код поступает в сумматор. С выхода сумматора от получившейся суммы берутся 10 старших разрядов и они сравниваются с таблицей синусов. На выходе соответственно получается 10 разрядов кода синуса. Предполагается далее подать это на цап и увидеть синус. Но возникла проблема.( При проверки правильности работы плис обнаружилось,что сумматор работает правильно,это подтвердилось проверкой на осциллографе и в ModelSIm, а вот сравнение по таблице синусов дает сбой( Выдает неправильные значения из таблицы,некоторых в таблице даже нет! Очень странно(
Вот фрагменты кода, отвечающего за сравнение по таблице синусов:
Код
mkk : PROCESS ( clock )
BEGIN
if Clr = '1' then
sout <= "0000000000";
ELSIF true THEN
IF rising_edge( clock ) THEN
case S_out2(39 downto 30) is
when "0000000000" =>
sout <= "0000000000";
when "0000000001" =>
sout <= "0000000011";
when "0000000010" =>
sout <= "0000000110";
........и т.д. всего 1024 раза
when "1111111111"=>
Sout <= "1111111011";
when others => null;
END CASE;
END IF;
END IF;
vihod <= Sout;
END PROCESS;
BEGIN
if Clr = '1' then
sout <= "0000000000";
ELSIF true THEN
IF rising_edge( clock ) THEN
case S_out2(39 downto 30) is
when "0000000000" =>
sout <= "0000000000";
when "0000000001" =>
sout <= "0000000011";
when "0000000010" =>
sout <= "0000000110";
........и т.д. всего 1024 раза
when "1111111111"=>
Sout <= "1111111011";
when others => null;
END CASE;
END IF;
END IF;
vihod <= Sout;
END PROCESS;
vihod подается на выходной порт и по нему смотрится итоговый результат.
Сумматор также складывает с каждым приходящим фронтом (rising_edge) тактовой частоты.
Была попытка разнести суммирование и сравнение по фронту и спаду такта,но она тоже не привела к 100% улучшению. Если так сделать, например, суммирование по фронту, а сравнение по спаду, то в итоге получались правильные результаты из таблицы синусов,но только на пол периода. Точнее,когда у нас идет спад, должно появляться значение из таблицы синусов,но оно появлялось неверным, а при фронте такта появляется верное значение из таблицы синусов,хотя оно вообще появляться не должно!в коде прописано,что сравнение по спаду!Как так?Помогите разобраться!;)