Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: синтез частоты
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
mcaffee
Всем доброго времени суток!
На работе пытаемся организовать такой процесс(синтез частоты путем 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;

vihod подается на выходной порт и по нему смотрится итоговый результат.
Сумматор также складывает с каждым приходящим фронтом (rising_edge) тактовой частоты.
Была попытка разнести суммирование и сравнение по фронту и спаду такта,но она тоже не привела к 100% улучшению. Если так сделать, например, суммирование по фронту, а сравнение по спаду, то в итоге получались правильные результаты из таблицы синусов,но только на пол периода. Точнее,когда у нас идет спад, должно появляться значение из таблицы синусов,но оно появлялось неверным, а при фронте такта появляется верное значение из таблицы синусов,хотя оно вообще появляться не должно!в коде прописано,что сравнение по спаду!Как так?Помогите разобраться!;)
dm.pogrebnoy
Что за ПЛИС, какая тактовая, заданы ли констрейнты? Я не понял зачем городить мультиплексор для синуса, если можно взять для этого блочную память, в современных плис она везде есть. Работа по двум фронтам только усложняет синтез схемы и увеличивает вероятность метастабильности. Если констрейнты не сходятся можно попробовать вставить в схему промежуточные регистры для улучшения временных характеристик.
mcaffee
Цитата(dm.pogrebnoy @ Mar 12 2013, 08:18) *
Что за ПЛИС, какая тактовая, заданы ли констрейнты? Я не понял зачем городить мультиплексор для синуса, если можно взять для этого блочную память, в современных плис она везде есть. Работа по двум фронтам только усложняет синтез схемы и увеличивает вероятность метастабильности. Если констрейнты не сходятся можно попробовать вставить в схему промежуточные регистры для улучшения временных характеристик.

микросхема PA APA300, 208PQFP. Тактовая частота 20 МГц.
iosifk
Цитата(mcaffee @ Mar 11 2013, 23:23) *
С выхода сумматора от получившейся суммы берутся 10 старших разрядов и они сравниваются с таблицей синусов.

Можно в таблицу загрузить разность между синусом и линейной частью - "горбушку", а синус получать на сумматоре...
И вместо case поставить блок памяти + сумматор...
Maverick
Есть замечательная книга: U. Meyer-Baese "Digital Signal Processing with Field Programmable Gate Arrays". В ней, в главе 2.8 (3rd edition) подробно расписан CORDIC с примерами на VHDL. Рекомендую.

Еще здесь гляньте, может поможет....
mcaffee
А подскажите, почему если суммирование делать по фронту, а сравнение по спаду, то в итоге получались правильные результаты из таблицы синусов,но только на пол периода. Точнее: когда у нас идет спад, должно появляться значение из таблицы синусов,но оно появлялось неверным, а при фронте такта появляется верное значение из таблицы синусов,хотя оно вообще появляться не должно!в коде прописано,что сравнение по спаду! wacko.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.