реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> синтез частоты, не работает(
mcaffee
сообщение Mar 11 2013, 19:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 9-10-12
Пользователь №: 73 873



Всем доброго времени суток!
На работе пытаемся организовать такой процесс(синтез частоты путем 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% улучшению. Если так сделать, например, суммирование по фронту, а сравнение по спаду, то в итоге получались правильные результаты из таблицы синусов,но только на пол периода. Точнее,когда у нас идет спад, должно появляться значение из таблицы синусов,но оно появлялось неверным, а при фронте такта появляется верное значение из таблицы синусов,хотя оно вообще появляться не должно!в коде прописано,что сравнение по спаду!Как так?Помогите разобраться!;)
Причина редактирования: используйте теги для оформления кода (с) модератор
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Mar 12 2013, 04:18
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 747
Регистрация: 11-04-07
Пользователь №: 26 933



Что за ПЛИС, какая тактовая, заданы ли констрейнты? Я не понял зачем городить мультиплексор для синуса, если можно взять для этого блочную память, в современных плис она везде есть. Работа по двум фронтам только усложняет синтез схемы и увеличивает вероятность метастабильности. Если констрейнты не сходятся можно попробовать вставить в схему промежуточные регистры для улучшения временных характеристик.


--------------------
Go to the top of the page
 
+Quote Post
mcaffee
сообщение Mar 12 2013, 05:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 9-10-12
Пользователь №: 73 873



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

микросхема PA APA300, 208PQFP. Тактовая частота 20 МГц.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 12 2013, 07:38
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(mcaffee @ Mar 11 2013, 23:23) *
С выхода сумматора от получившейся суммы берутся 10 старших разрядов и они сравниваются с таблицей синусов.

Можно в таблицу загрузить разность между синусом и линейной частью - "горбушку", а синус получать на сумматоре...
И вместо case поставить блок памяти + сумматор...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Maverick
сообщение Mar 12 2013, 08:04
Сообщение #5


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



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

Еще здесь гляньте, может поможет....


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
mcaffee
сообщение Mar 13 2013, 15:19
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 9-10-12
Пользователь №: 73 873



А подскажите, почему если суммирование делать по фронту, а сравнение по спаду, то в итоге получались правильные результаты из таблицы синусов,но только на пол периода. Точнее: когда у нас идет спад, должно появляться значение из таблицы синусов,но оно появлялось неверным, а при фронте такта появляется верное значение из таблицы синусов,хотя оно вообще появляться не должно!в коде прописано,что сравнение по спаду! wacko.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 12:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016