vadimuzzz 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба накидал полифазный фильтр-интерполятор: 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];. не пойму, что ему не нравится Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба reg [$clog2®-1:0] bank_sel; Что там после двоечки? проделки Интернет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба видимо, "фича" движка форума. подправил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба не пойму, что ему не нравится видимо вот это b_type reg_bank [R*bank_size-1:0]; .... reg [$clog2( R) -1:0] bank_sel; PS. я бы не стал выносить параметры, которые могут нарушить работу модуля, в область, где они могут быть легко изменены неправильным инстансом %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба видимо вот это а в чем криминал? конкретно в этом примере R=16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба for (i=1;i<bank_size;i++) bank_size у вас 3, а i будет принимать значения только 1 и 2 - может здесь причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба а в чем криминал? конкретно в этом примере R=16. В данном примере, вы адресуете пространство на 48 адресов, с помощью 4-х битной переменной. О чем вас ква и предупреждает. хотя вашему фильтру это не мешает %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба В данном примере, вы адресуете пространство на 48 адресов, с помощью 4-х битной переменной. О чем вас ква и предупреждает. хотя вашему фильтру это не мешает %) т.е. это выражение bank_sel+i*R не преобразуется в подходящую размерность? странно, ведь i - integer, я думал это выражение в int преобразуется. еще вопросик, почему квартус не хочет константы в блочную память запихать? (все легло на логику и умножители после синтеза). ну и быстродействие меня не порадовало, пор-ка 100МГц, критические пути между bank_sel и reg_bank. как бы это пооптимизировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба т.е. это выражение 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 сумматора %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба думаю что ругается он вот на что reg_bank[bank_sel] <= coef_mem[R-bank_sel-1]*data_reg[0]; а номер выцепляет не правильно. он ругался и на нее, потом перестал (уж не помню, что менял). в общем пес с ним, все равно переделывать и еще, вы уверены что при ваших коэффициентах вам вообще нужен такой полифазник? На таких коэффициентах можно и фир в лоб сделать, но если бьетесь за ресурс, тогда делайте полифазность по данным и по коэффициентам на памяти, будет очень компактно : общая логика управление + 3 МАКа + 3 брама + 2 сумматора %) коэффициенты от фонаря, чисто для проверки. я и хотел в общем что-то вроде общая логика управление + 3 МАКа + 3 брама + 2 сумматора (насчет кол-ва брамов не уверен, хотел по всякому попробовать). поясните, что значит "полифазность по данным". //это продолжение старой темы про интерполяторы, тогда я остановился на CIC. но выяснилось, что без компенсатора он сильно гадит характеристики, а с компенсатором - проще уж один полифазник нормальный сообразить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба поясните, что значит "полифазность по данным". Для дециматора : фильтр это свертка, вам нужна каждая Rая свертка, на брамах делаете сдвиговый регистр и раз в 16 тактов рассчитываете свертку на параллельных модулях. Но для вашего случая децимация на 16ть думаю что хватит фильтра 32 го порядка. В интерполяторе все проще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба des00, а есть какое-нибудь чтиво по разным архитектурам фильтров в приложении к FPGA? компромиссы там всякие и т.п.? то, что попадалось, ориентировано в основном на high-end типа стратиксов - там сама структура DSP-блоков намекает, как делать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба des00, а есть какое-нибудь чтиво по разным архитектурам фильтров в приложении к FPGA? компромиссы там всякие и т.п.? то, что попадалось, ориентировано в основном на high-end типа стратиксов - там сама структура DSP-блоков намекает, как делать на ум приходит разве что книга DSPwithFPGA, так ее и не прочитал. Делал разные архитектуры фильтров самостоятельно. Их там всего то штук 5-6 основных, остальные вариации %) В вашем случае лучше начать с фильтра Rго порядка, для децимации на R. Делается на 1 браме и одном маке, потом переложил бы его на две фазы и на N фаз %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться