Перейти к содержанию
    

Quartus, SV, массивы

накидал полифазный фильтр-интерполятор:

module fir_interp_poly
/********************************************************************************
*****************/
#(parameter dw = 10, cw = 10, R = 16, bank_size = 3)
/********************************************************************************
*****************/
(
   input   clk,
   input   reset_n,
   input   dv,
   input   signed [dw-1:0] data_in,
   output  reg signed [dw+cw+$clog2(bank_size)-1:0] data_out
);
/********************************************************************************
*****************/
typedef reg signed [dw+cw+$clog2(bank_size)-1:0] b_type;
/********************************************************************************
*****************/
localparam logic signed[cw-1:0] coef_mem [0:R*bank_size-1] =
'{
   -3,
   -2,
   -2,
   -1,
    1,
    4,
    8,
   14,
   22,
   32,
   45,
   60,
   77,
   96,
  116,
  137,
  158,
  179,
  199,
  217,
  232,
  244,
  252,
  256,
  256,
  252,
  244,
  232,
  217,
  199,
  179,
  158,
  137,
  116,
   96,
   77,
   60,
   45,
   32,
   22,
   14,
    8,
    4,
    1,
   -1,
   -2,
   -2,
   -3
};
/********************************************************************************
*****************/
b_type reg_bank [R*bank_size-1:0];
reg signed [dw-1:0] data_reg [0:bank_size-1];
reg [$clog2( R) -1:0] bank_sel;
integer i;
/********************************************************************************
*****************/
always_ff @(posedge clk)
begin
   if (!reset_n) begin
       bank_sel <= '0;
   end
   if (dv) begin
       data_reg[0] <= data_in;
       for (i=1;i<bank_size;i++) begin
           data_reg[i] <= data_reg[i-1];
       end
       bank_sel <= '0;
   end
   else begin
       bank_sel <= bank_sel + 1;
   end
end
/********************************************************************************
*****************/
always_ff @(posedge clk)
begin
   reg_bank[bank_sel] <= coef_mem[R-bank_sel-1]*data_reg[0];
   for (i=1;i<bank_size;i++) begin
       reg_bank[bank_sel+i*R] <= reg_bank[bank_sel+(i-1)*R] + coef_mem[(i+1)*R-bank_sel-1]*data_reg[0];
   end
end
/********************************************************************************
*****************/
always_ff @(posedge clk)
begin
   if (!reset_n)
       data_out <= '0;
   else
       data_out <= reg_bank[bank_sel+2*R];
end
/********************************************************************************
*****************/
endmodule

нормально симулируется и синтезируется. но квартус кидает:

Warning (10027): Verilog HDL or VHDL warning at the fir_interp_poly.sv(93): index expression is not wide enough to address all of the elements in the array
относительно строки reg_bank[bank_sel+i*R] <= reg_bank[bank_sel+(i-1)*R] + coef_mem[(i+1)*R-bank_sel-1]*data_reg[0];. не пойму, что ему не нравится

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

reg [$clog2®-1:0] bank_sel;

Что там после двоечки? проделки Интернет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не пойму, что ему не нравится

видимо вот это

b_type reg_bank [R*bank_size-1:0];

....

reg [$clog2( R) -1:0] bank_sel;

 

 

PS. я бы не стал выносить параметры, которые могут нарушить работу модуля, в область, где они могут быть легко изменены неправильным инстансом %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

for (i=1;i<bank_size;i++)

bank_size у вас 3, а i будет принимать значения только 1 и 2 - может здесь причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в чем криминал? конкретно в этом примере R=16.

В данном примере, вы адресуете пространство на 48 адресов, с помощью 4-х битной переменной. О чем вас ква и предупреждает. хотя вашему фильтру это не мешает %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данном примере, вы адресуете пространство на 48 адресов, с помощью 4-х битной переменной. О чем вас ква и предупреждает. хотя вашему фильтру это не мешает %)

т.е. это выражение bank_sel+i*R не преобразуется в подходящую размерность? странно, ведь i - integer, я думал это выражение в int преобразуется.

еще вопросик, почему квартус не хочет константы в блочную память запихать? (все легло на логику и умножители после синтеза). ну и быстродействие меня не порадовало, пор-ка 100МГц, критические пути между bank_sel и reg_bank. как бы это пооптимизировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. это выражение bank_sel+i*R не преобразуется в подходящую размерность? странно, ведь i - integer, я думал это выражение в int преобразуется.

думаю что ругается он вот на что reg_bank[bank_sel] <= coef_mem[R-bank_sel-1]*data_reg[0]; а номер выцепляет не правильно.

 

еще вопросик, почему квартус не хочет константы в блочную память запихать? (все легло на логику и умножители после синтеза). ну и быстродействие меня не порадовало, пор-ка 100МГц, критические пути между bank_sel и reg_bank. как бы это пооптимизировать?

не выгодна при вашем подходе память, просядет все еще ниже.

 

и еще, вы уверены что при ваших коэффициентах вам вообще нужен такой полифазник? На таких коэффициентах можно и фир в лоб сделать, но если бьетесь за ресурс, тогда делайте полифазность по данным и по коэффициентам на памяти, будет очень компактно : общая логика управление + 3 МАКа + 3 брама + 2 сумматора %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думаю что ругается он вот на что reg_bank[bank_sel] <= coef_mem[R-bank_sel-1]*data_reg[0]; а номер выцепляет не правильно.

он ругался и на нее, потом перестал (уж не помню, что менял). в общем пес с ним, все равно переделывать

и еще, вы уверены что при ваших коэффициентах вам вообще нужен такой полифазник? На таких коэффициентах можно и фир в лоб сделать, но если бьетесь за ресурс, тогда делайте полифазность по данным и по коэффициентам на памяти, будет очень компактно : общая логика управление + 3 МАКа + 3 брама + 2 сумматора %)

коэффициенты от фонаря, чисто для проверки. я и хотел в общем что-то вроде

общая логика управление + 3 МАКа + 3 брама + 2 сумматора
(насчет кол-ва брамов не уверен, хотел по всякому попробовать). поясните, что значит "полифазность по данным".

 

//это продолжение старой темы про интерполяторы, тогда я остановился на CIC. но выяснилось, что без компенсатора он сильно гадит характеристики, а с компенсатором - проще уж один полифазник нормальный сообразить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поясните, что значит "полифазность по данным".

Для дециматора : фильтр это свертка, вам нужна каждая Rая свертка, на брамах делаете сдвиговый регистр и раз в 16 тактов рассчитываете свертку на параллельных модулях. Но для вашего случая децимация на 16ть думаю что хватит фильтра 32 го порядка.

В интерполяторе все проще

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

des00, а есть какое-нибудь чтиво по разным архитектурам фильтров в приложении к FPGA? компромиссы там всякие и т.п.? то, что попадалось, ориентировано в основном на high-end типа стратиксов - там сама структура DSP-блоков намекает, как делать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

des00, а есть какое-нибудь чтиво по разным архитектурам фильтров в приложении к FPGA? компромиссы там всякие и т.п.? то, что попадалось, ориентировано в основном на high-end типа стратиксов - там сама структура DSP-блоков намекает, как делать

на ум приходит разве что книга DSPwithFPGA, так ее и не прочитал. Делал разные архитектуры фильтров самостоятельно. Их там всего то штук 5-6 основных, остальные вариации %) В вашем случае лучше начать с фильтра Rго порядка, для децимации на R. Делается на 1 браме и одном маке, потом переложил бы его на две фазы и на N фаз %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...