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

 
 
> Фильтр из Matlab'a не компилируется в quartus'е
S.Mishutina
сообщение Aug 27 2011, 17:03
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 20-08-11
Из: Санкт-Петербург
Пользователь №: 66 795



С помощью Matlab сделала БИХ-фильтр нижних частот (фильтр Баттерворта). Matlab сгенерировал Verilog HDL, который прекрасно компилируется и работает в ModelSim. Но verilog-код не компилируется в quartusII: "real variable data type are not suppotred", также не поддерживаются директивы $bitstoreal и $realtobits.
Правильно я понимаю, что такой код в реальном устройстве работать не будет и следует написать другой код?
Где найти примеры (книги, коды) IIR фильтров, которые скомпилируются в квартусе и смогут работать в реальном устройстве?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Methane
сообщение Aug 27 2011, 17:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(S.Mishutina @ Aug 27 2011, 20:03) *
С помощью Matlab сделала БИХ-фильтр нижних частот (фильтр Баттерворта).

Сгенерируйте в матлабе только коэффициенты фильтра.
Go to the top of the page
 
+Quote Post
Гяук
сообщение Aug 28 2011, 11:57
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 6-12-04
Из: г. Таганрог
Пользователь №: 1 346



Цитата(S.Mishutina @ Aug 27 2011, 21:03) *
Правильно я понимаю, что такой код в реальном устройстве работать не будет и следует написать другой код?

Да, правильно
Цитата(S.Mishutina @ Aug 27 2011, 21:03) *
Где найти примеры (книги, коды) IIR фильтров, которые скомпилируются в квартусе и смогут работать в реальном устройстве?

http://www.google.ru/search?q=iir+fpga
А по поводу коэффициентов Methane вам уже подсказал. sm.gif
Go to the top of the page
 
+Quote Post
Чиповод
сообщение Aug 28 2011, 15:45
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160



Цитата(S.Mishutina @ Aug 27 2011, 21:03) *
Правильно я понимаю, что такой код в реальном устройстве работать не будет и следует написать другой код?

Матлаб позволяет получить код, пригодный для синтеза в ПЛИСке. Проверял в железе, код работает. Для этого надо перевести коэффициенты вашего фильтра из вещественного типа в целочисленный. Тут об этом немного. http://www.chipovod.ru/plis/proektirovanie-filtrov-plis/

Сообщение отредактировал Чиповод - Aug 28 2011, 15:46
Go to the top of the page
 
+Quote Post
Methane
сообщение Aug 28 2011, 15:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Чиповод @ Aug 28 2011, 18:45) *
Матлаб позволяет получить код, пригодный для синтеза в ПЛИСке.

Но зрелище получается, душераздирающим...
Go to the top of the page
 
+Quote Post
Чиповод
сообщение Aug 28 2011, 17:20
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160



Цитата(Methane @ Aug 28 2011, 19:59) *
Но зрелище получается, душераздирающим...
Ага, особенно аккумулятор, но если надо вчера...
Go to the top of the page
 
+Quote Post
Methane
сообщение Aug 28 2011, 18:03
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Чиповод @ Aug 28 2011, 20:20) *
Ага, особенно аккумулятор, но если надо вчера...

Умножители. Они будут ужосом. Но если нада вчера, в очень толстую ПЛИСину, и частота 20мигагерц, устроит, то все нормально. А если оно нада "для галочки", то это вообще самый оптимальный вариант.

Вообще, с генережем матлабом верилога, у меня, есть некоторые сомнения. С одной стороны, CIC фильтр, выглядел вполне вменяемым, но я его не пробовал по серьезному в железе тестировать. Для FIR фильтров в квартусе есть готовые макрофункции, куда можно только коэффициенты загрузить. Для IIR скорее всего тоже. Даже плавающая точка в квартусе в общем-то есть.
Go to the top of the page
 
+Quote Post
Чиповод
сообщение Aug 29 2011, 06:22
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160



Цитата(Methane @ Aug 28 2011, 22:03) *
Умножители. Они будут ужосом.
С этим вроде стало полегче. В опциях Матлаба можно настроить, чтобы умножение в HDL коде выполнялось с помощью оператора умножения *. Ну а дальше Квартус или другая среда разложит его на аппаратных умножителях, которые есть в любой современной ПЛИСине.

Цитата(Methane @ Aug 28 2011, 22:03) *
Даже плавающая точка в квартусе в общем-то есть.
Интересно, а в каком виде?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2011, 06:46
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Чиповод @ Aug 29 2011, 09:22) *
Интересно, а в каком виде?

В Quartus 9.1 я только что насчитал 13 мегафункций, начинающихся с ALTFP_. Угадайте, что это за функции. sm.gif
Go to the top of the page
 
+Quote Post
Чиповод
сообщение Aug 29 2011, 07:31
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 11-01-11
Из: Москва
Пользователь №: 62 160



Цитата(ViKo @ Aug 29 2011, 10:46) *
В Quartus 9.1 я только что насчитал 13 мегафункций, начинающихся с ALTFP_. Угадайте, что это за функции. sm.gif
А, понятно. Я почему то подумал, что квартус начал синтезировать тип real.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2011, 07:39
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Чиповод @ Aug 29 2011, 10:31) *
А, понятно. Я почему то подумал, что квартус начал синтезировать тип real.

Я сам не пользовался, но мне кажется, что именно так и есть. 13 функций...
Go to the top of the page
 
+Quote Post
S.Mishutina
сообщение Aug 29 2011, 17:43
Сообщение #12





Группа: Участник
Сообщений: 10
Регистрация: 20-08-11
Из: Санкт-Петербург
Пользователь №: 66 795



Цитата(ViKo @ Aug 29 2011, 10:46) *
В Quartus 9.1 я только что насчитал 13 мегафункций, начинающихся с ALTFP_. Угадайте, что это за функции. sm.gif


ViKo, ALTFP_ - это мегафункции для работы с плавающей точкой, но если у меня входные отсчеты фильтра с фиксированной точкой?
То есть, нужно перевести число из формата с фиксированной точкой в формат с плавающей точкой?

Цитата(Чиповод @ Aug 28 2011, 19:45) *

Чиповод, спасибо за ссылку, полученный код в квартусе действительно компилируется! Но не работает в ModelSim. Почти все сигналы - хххххх. На выходе также хххххх. И в силу сложности кода пока не разберусь, что нужно исправить.

Найден компромисс: из коэффициентов, полученных в Matlab, по образцу из учебника написан БИХ-фильтр:
Код
module filter (data_in, data_out, clock, reset);
    output reg  [15:0]  data_out=16'b0;
    input          [15:0]   data_in;
    input                clock, reset;

    reg  [15:0]  sample_in=16'b0;
    reg  [15:0]  sample_out=16'b0;
    always@(posedge clock)
  begin
    if(reset==1'b1)
          data_out<=16'b0;
    else
        data_out<=((data_in+sample_in)*3-sample_out)/5;
      //i.e.    y = 0.6*x(n) + 0.6*x(n-1) - 0.2*y(n-1)
                
    always@(posedge clock)
        begin
        if(reset==1'b1)
          begin
             sample_in<=0;
             sample_out<=0;
          end
        else
          begin
             sample_in<=data_in;
             sample_out<=data_out;
          end
        end        
endmodule


Все прекрасно работает в Квартусе и ModelSim'е,
но моему руководителю дико не нравится деление на 5: ((data_in+sample_in)*3-sample_out)/5.
требует переделать в целочисленную арифметику, или найти другой способ.
Вопрос: как следует осуществлять "деление" в таких случаях?
Или: как в этом случае воспользоваться мегафункциями ALTFP_??
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Aug 30 2011, 08:47
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Ну, например, как gcc поступает в таких случаях:

a/5 = a * 65536 / 5 / 65536 = a * (65536/5) / 65536 = a * 13107 / 65536

То есть, свелось к умножению на константу со сдвигом. Устраивает?
Go to the top of the page
 
+Quote Post
S.Mishutina
сообщение Aug 30 2011, 18:07
Сообщение #14





Группа: Участник
Сообщений: 10
Регистрация: 20-08-11
Из: Санкт-Петербург
Пользователь №: 66 795



Цитата(Hoodwin @ Aug 30 2011, 12:47) *
Ну, например, как gcc поступает в таких случаях:

a/5 = a * 65536 / 5 / 65536 = a * (65536/5) / 65536 = a * 13107 / 65536

То есть, свелось к умножению на константу со сдвигом. Устраивает?


Hoodwin, а те 16 отсчетов, на которые мы сдвинули результат при делении на 2^16, мы используем при вычислении следующих отсчетов фильтра как дробную часть?
То есть, получаются дополнительные 16 отсчетов для дробной части и, например, 16 для целой?
И точность расчета выходного сигнала повышается в зависимости от количества битов дробной части?
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Aug 30 2011, 19:59
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Я не думаю, что все так радужно. 16 младших битов придется выкинуть, потому что нужно согласовывать типы данных. В приведенном тексте сигналы представлены 16-разрядными числами без дробных частей. Умножение на 13107 делает из 16 битного числа 32-битное, которое затем вновь становится 16-битным после откидывания младших битов. Чтобы повысить точность, нужно в целом перейти к вычислению с большей разрядностью, только зачем?

Кстати, по поводу самого кода. Умножение на 3, конечно, вполне тривиально преобразовывается в сложение, но вот при более сложных коэффициентах, по-видимому, придется делать аппаратный умножитель. Записать его можно так же, но нужно помнить, что для получения хорошего быстродействия аппаратного умножителя и вход и выход должны быть регистрами, что потребует некоторой структурной переработки данного кода. Если частота будет приемлемой, то можно ничего не менять.

Еще из структурных соображений я бы выдал на выход не data_out, а sample_out, так как это выходы регистров, которые легко таскать по кристаллу не снижая быстродействия.
Go to the top of the page
 
+Quote Post

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

 


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


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