Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задача
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
go2winner
Я столкнулся с проблемой. Читая форум понял, что нужно сначала реализовать конкретную задачу в симуляторе, а потом (далеко потом) платами баловаться.
Но вот я никак не могу выбрать задачу себе по силам. Может кто-то может дать задачи с линейным ростом в области ЦОС или близкой тематике???

Пробую сей час фильтр реализовать. Вот начинаю с вымышленного ТЗ.
1) Входные данные с АЦП 16 разрядов доп код. А выходные ? какими должны быть выходные? 32 разряда взять?
2) потом попадаю на вопрос: формат и разрядность промежуточных данных. Беру решаю все в фикс. точкой. Вопрос. Как реализовать данную арифметику? Как выбрать сколько разрядов дробные, сколько целочисленные:?
Вот я выбрал формат для коэффициентов, чтобы максимально точно их описать. в VHDL, да и в матлабе я их представляю знаковыми целочисленными числами.

Тут, как я понимаю идет обычная целочисленная арифметика. Но как восстановить выходные данные....я сам как хочу интерпретирую выходные данные ? или есть некое правило по которому я могу интерпретировать выходные данные (сколько разрядов дробных )?


В общем если есть материал по практическому применению ЦОС, особенно в области прием/передачи сигналов буду рад.
Можно ли следующим шагом задуматься об квадратурном модуляторе MSK?


Как я понимаю сначала надо реализовать все в прикладных пакетах (матлаб и т.п.), потом уже на VHDL, потом уже модель VHDL проверяю.
des00
Matlab -> Simulink -> simple QPSK modem (filter, NGC, Carrier/Symbol recovery, IF output-input) -> RTL -> Simulink Co-simulation -> FPGA tools

потом добавить FEC и Equalizer
Maverick
дополню des00
раздел HDL

здесь можно найти готовые модели с последующей гененрацией hdl описания
Vascom
И делай всё в целых числах, не нужны тут дробные части.
bogaev_roman
Цитата(go2winner @ Apr 11 2016, 13:40) *
В общем если есть материал по практическому применению ЦОС, особенно в области прием/передачи сигналов буду рад.
Можно ли следующим шагом задуматься об квадратурном модуляторе MSK?

Как уже советовали - проще всего через симулинк - очень много готовых рабочих моделей (в яндексе на ключевые слова simulink QPSK model выдает сразу несколько вариантов). Если будет реальная борда, то можно даже через симулинк и отлаживаться в режиме реального времени и прошивать, не вникая на начальном этапе, в сложности HDL и конкретного железа(к примеру, временные ограничения не выполняются).
ЗЫ\\ Стоит полноценный лицензионный пакет, правда, как пару разработчиков FPGA и верификаторов за год sm.gif.
go2winner
Немного не в тему(мой сл. вопрос).....но все же. Вышеперечисленное изучу, как примеры.

Вчера модель фильтра в матлаб вбил . По идее сначала вбиваю, как есть, потом уже ввожу ограничения на форматы данных и т.п.

Взял ФНЧ КИХ фильтр 9 порядка, написал функцию фильтрации. Сначала на вход подал единичный импульс - получил коэффициенты фильтра, т.е. ИХ
Взял подал на вход сумму гармонических сигналов на разных частотах с одинаковыми амплитудами 1 (рис. 1 лог масштаб sptool).
И кое-что не получается. Качественно результаты на выходе похожи на правду(рис 5), но путаница с амплитудами.
Беру БПФ от коэффициентов фильтра -получаю АЧХ фильтра с очень малыми амплитудами (около 0.1 не лог масштаб) (рис 4), что не сходится с полученнуми результатами (т.к. при перемножении АЧХ сигнала и фильтра получаются вообще мизерные значения)

На выходе фильтра амплитуды в полосе пропускания стали чуть больше, что у меня, что и с помощью матлабовской функции filter и sptool. (рис 2)
Что я не правильно делаю?

Т.е. у меня по амплитудам АЧХ фильтра не получается нормально получить, остальное вроде бы согласутеся. Привел рисунки АЧХ, и поведения сигнала во времени исходного (зеленный) и фильтрованого (красный мой синий матлаб)

Получение АЧХ КИХ
Код
%NFFT = 100
%s- коэффициенты фильтра, ИХ
d=abs(fft(s,NFFT))/NFFT;
d=fftshift(d);


Коэффициенты КИХ
Код
-0.0099    0.0787    0.1166    0.1647    0.1946    0.1946    0.1647    0.1166    0.0787   -0.0099









Vascom
Без комментариев к картинкам - ни чего не понятно.
Так же приводи все команды, которыми получены те или иные графики, весь исходный код.
Tausinov
вот скриптик для наглядности

Код
close all
clear
clc

IR          = [-0.0099    0.0787    0.1166    0.1647    0.1946 ...  
                0.1946    0.1647    0.1166    0.0787   -0.0099];

% fvtool(IR) - удобный вариант для просмотра ИХ

Fs          = 120e6;
F0          = 0e6;  % исходная частота
step        = 1e6;
freq_num    = 10;
N           = 1e4;
A           = 2^15 - 1;

F_vect      = F0 : step : F0 + step * (freq_num - 1);
signal_matr = zeros(freq_num, N);

for i = 1:freq_num
    % формируем исходные сигналы и
    signal_matr(i, :) = round(A*cos(2*pi*(F_vect(i)/Fs)*(1:N)));
    % смотрим их спектр, нажимая пробел
%     fft_plot(signal_matr(i, :), Fs, 'db')
%     pause
end;

res_sig     = sum(signal_matr);
% fft_plot(res_sig, Fs, 'db')

filter_out  = upfirdn(res_sig, IR, 1, 1);
% filter_out  = filter(res_sig, 1, IR);

fft_plot(filter_out, Fs, 'db') % видно затухание по мере удаления от постоянной составляющей
%и оно совпадает с fvtool


Код
function [] = fft_plot(signal, Fs, mode)
    N       = length(signal);
    win     = hanning(length(signal));
    signal  = signal.*win.';
    if mod(N,2) == 1
        f = ((0:N-1) - floor(N/2))/N*Fs;
    else
        f = ((0:N-1) - N/2)/N*Fs;
    end;
    Y       = fftshift(fft(signal,length(signal)));
    Y_ampl  = 2*abs(Y)./N;
    Y_db    = 20*log10(abs(Y));
    if (strcmp(mode, 'db'))
        plot(f, Y_db - max(Y_db))
%         plot(f, Y_db)
        set(gca,'XLim',[min(f), max(f)])
        xlabel('Frequency (Hz)')
        ylabel('dB')
        title('20*log10(|Y|)')
    else
        plot(f, Y_ampl)
        set(gca,'XLim',[min(f), max(f)])
        xlabel('Frequency (Hz)')
        title('Amplitude')
    end;
end


В этой же папке надо поместить эту функцию.
Maverick
Цитата(Tausinov @ Apr 12 2016, 19:30) *


Цитата(go2winner @ Apr 12 2016, 16:15) *


Вы что в команде работаете?
Xln
To go2winner.

То, что вы начали изучение ЦОС в FPGA с нерекурсивных цифровых фильтров это правильно.
Эти фильтры и не сложные для новичка, и применяются достаточно широко.
Рекурсивные цифровые фильтры отбросьте в сторону, они на архитектуру FPGA ложатся плохо, у них повышенные требования к разрядностям сумматоров и умножителей.

Что изучать дальше зависит от того, какие задачи вы собираетесь решать.

Если, например, двигаться в сторону Software Defined Radio, то стоит присмотреться к Digital Down Converter и Digital Up Converter, ещё нужно поразбираться с децимацией и интерполяцией сигналов.

Всё что написано ниже относится к FPGA Xilinx, и мне трудно сказать, насколько это справедливо для Альтеры и др. производителей.

По цифровым фильтрам.
В современных FPGA на программируемой логике обычно фильтры не делают, для этого используют DSP-блоки.
Например, в Spartan-6, реализованы DSP-блоки DSP48A1 (это просто наименование примитива, в зависимости от семейства FPGA эти примитивы немного различаются между собой). Этот DSP блок содержит целочисленный умножитель 18x18 с 36-битным выводом результата и 48-битный аккумулятор (вспомогательные регистры, предсумматор я опустил).
Для вас сейчас главное, что разрядности умножителей 18x18 -> 36, умножители целочисленные, никакой плавающей точки в DSP блоках нет. От этой разрядности можно плясать дальше.
Например в 7-й серии FPGA (Virtex-7, Kintex-7, Artix-7) DSP блоки более функциональны, в том числе умножители вида 18x25 -> 43, большие точности можно получить.

По вашему примеру применительно к Spartan-6.
16-битный сигнал с АЦП нужно расширить до 18 бит (здесь должно быть именно знаковое расширение) перед подачей на DSP блоки.
По коэффициентам.
Все коэффициенты, которые приводились выше, а именно,
Код
-0.0099    0.0787    0.1166    0.1647    0.1946    0.1946    0.1647    0.1166    0.0787    -0.0099

лежат в диапазоне -1 … 1. Т.о. для коэффициентов можно использовать представление чисел с фиксированной точкой 1.17. Один старший разряд, на это указывает единица перед точкой, это целая часть, по сути знак коэффициента, а остальные 17 разрядов (число после десятичной точки) – дробная часть.
В 16-ричной системе счисления коэффициенты будут выглядеть так:
Код
0x3FAEE    0x0284B    0x03BB3    0x05454    0x063A3    0x063A3    0x05454    0x03BB3    0x0284B    0x3FAEE

Они же в десятичной:
Код
-1298    10315    15283    21588    25507    25507    21588    15283    10315    -1298

По сути, коэффициенты были просто домножены на 2^17 = 131072 и округлены.
Теперь отсчёты сигнала и пересчитанные коэффициенты можно подавать на DSP блоки.
Что будет на выходе.
При умножении 18-битного целого на число с фиксированной точкой 1.17 результат будет 19.17, т.е. у нас 19 разрядов целой части числа и 17 дробной части. После суммирований результатов умножений ничего не изменяется и младшие 17 разрядов по-прежнему дробная часть.
Собственно и всё. Дальше результат можно округлить и оставить столько разрядов сколько нужно.
Надеюсь, не слишком туманно выразился.

В качестве простенькой программки расчёта КИХ фильтров могу предложить Iowa Hills FIR Filter Designer, коэффициенты можно получить за несколько кликов мышкой и в ней же увидеть характеристики фильтра.
Скачать можно здесь:
http://www.iowahills.com/8DownloadPage.html
http://www.iowahills.com/5FIRFiltersPage.html
go2winner
Графики и пояснения исправлю завтра и коды прикреплю (хотя имхо вопрос не в этом )

XLN, спасибо за ответ. Многое из написанного знал, но не все. Пока хочу довести и поиграться в матлабе с моделью, а потом уже на VHDL писать.
step -by-step.
Пока вопросы с реализацией дальнейшей опущу, лучше сам подумаю. biggrin.gif
go2winner
Проблема оказалась в том, что коэффициенты как-то хитро получены. Если взять просто ДПФ без взвешивающего множителя NFFT, то получаю нормальную АЧХ с правильными значениями по модулю, что и видно на рисунке.
всем спасибо.
Koluchiy
Полуофф.
А почему ПЛИСы?
А не ЦСП.
Xln
Цитата
Проблема оказалась в том, что коэффициенты как-то хитро получены.

Могу предположить, что фильтр с этими коэффициентами синтезирован с помощью Remez Exchange Algorithm.
Почему предполагаю – в полосе подавления у нас три лепестка и все равной амплитуды (на основе скриншотов из 6-го поста), т.е. мы имеем Equiripple Low Pass Filter. Этим свойством обладают фильтры, синтезированные алгоритмом Ремеза.
Мне встретился PDF, в нём в конце даже пример синтеза таких фильтров на матлабе приведён, может, будет вам полезен. Сам в матлабе не силён.

A Practical Method to Design Equiripple FIR Filters
http://www.geocities.ws/pablogomezr/papers...ppleFilters.pdf

Цитата
Полуофф.
А почему ПЛИСы?
А не ЦСП.

Просто здесь речь идёт о цифровых фильтрах и их реализации в ПЛИС, а не на ЦСП.
agregat
Цитата(Koluchiy @ Apr 14 2016, 15:27) *
А не ЦСП.

офф набираю в гугле
ЦСП = Цементно стружечная плита
DSP = Цифровой сигнальный процессор

Прикольно...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.