Djony1987 0 10 мая, 2010 Опубликовано 10 мая, 2010 · Жалоба Здравствуйте! Сейчас остановился на согласованном фильтре, 100 чипов, 2x оверсамплинг - т.е. посути 200 получипов. Появились несколько вопросов: 1) Как коэффициенты хранить/использовать? 2) Как использовать LUT в SliceM в Спартан6? Я так понял, что надо описывать как регистр сдвига, не используя Reset. Спасибо! PS Сейчас буду второй раз читать xapp212 - с первого чот суть реализации не уловил...может вопросы и отпадут) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 10 мая, 2010 Опубликовано 10 мая, 2010 · Жалоба Если использовать SLRC32E (в Spartan6) и Inverse FIR structure, при этом оверсамплинг 2х. Как это описывать чтобы задейстовать SLRC32E(SLR16E) как в документе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Чтобы втянутся в тему, начал с данного примера (хотя он и не правильный СФ): Код: module MF(Clock, Input, Output); input Clock; input Input; output Output; reg coef [0:6]; reg [2:0] sum [0:6]; initial begin coef[0] = 1; coef[1] = 0; coef[2] = 1; coef[3] = 1; coef[4] = 1; coef[5] = 0; coef[6] = 0; sum[0] = 0; sum[1] = 0; sum[2] = 0; sum[3] = 0; sum[4] = 0; sum[5] = 0; sum[6] = 0; end integer i; always @(posedge Clock) begin for(i = 0; i < 7; i = i + 1) begin if(i == 0) begin sum[i] <= Input & coef[i]; end else begin sum[i] <= sum[i - 1] + Input & coef[i]; end end end assign Output = sum[6]; endmodule Логика такая, на вход поступает символ, он умножается на все коэффициенты (я И делаю - для примера) и складывается. При это прибавляется значение на предыдцщем сумматоре. Может неправильно описал...почему-то неправильно работает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Может неправильно описал...почему-то неправильно работает... FIR на цепи сумматоров Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба FIR на цепи сумматоров Сенк! Все таки надо вначале вычислить значения после умножания на коэффициенты... Так норм вроде: module MF(Clock, Input, Output); input Clock; input Input; output [2:0] Output; reg coef [0:6]; reg res [0:6]; reg [2:0] sum [0:6]; initial begin coef[0] = 1; coef[1] = 0; coef[2] = 1; coef[3] = 1; coef[4] = 1; coef[5] = 0; coef[6] = 0; res[0] = 0; res[1] = 0; res[2] = 0; res[3] = 0; res[4] = 0; res[5] = 0; res[6] = 0; sum[0] = 0; sum[1] = 0; sum[2] = 0; sum[3] = 0; sum[4] = 0; sum[5] = 0; sum[6] = 0; end integer i; always @(posedge Clock) begin for(i = 0; i < 7; i = i + 1) begin res[i] <= Input & coef[i]; end for(i = 0; i < 7; i = i + 1) begin if(i == 0) begin sum[i] <= res[i]; end else begin sum[i] <= sum[i - 1] + res[i]; end end end assign Output = sum[6]; endmodule Получил то, что и ожидал :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Согласованный фильтр вроде как по-другому немного делается в классическом варианте, с него бы и начали... out=Sum(input*coeff). Где входной сигнал записывается в сдвиговый регистр и каждое значение перемножается на свой коэффициент. У Вас коэффициент одноразрядный же, берете сигнал Input (0 или 1) и ксорите его с коэффициентом (0 или 1). В данном случае размах сигнала будет по диапазону в два раза меньше чем при перемножении. Если хотите диапазон таким же оставить, то замените умножение на простейшую логику с мультиплексорами. module MF(Clock, Input, Output); input Clock; input Input; output [2:0] Output; parameter [6:0] coef =7'b1011100; reg [6:0] reg_input; integer i; reg [6:0] res; always @(posedge Clock) reg_input<={input, reg_input[6:1]} always @(*) for(i = 0; i < 6; i = i + 1) res[i] = reg_input[i] ^ coef[i]; assign Output = ((res[0]+res[1])+(res[2]+res[3]))+((res[4]+res[5])+res[6]); endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба У Вас коэффициент одноразрядный же, берете сигнал Input (0 или 1) и ксорите его с коэффициентом (0 или 1). А почему нужно ксорить? Разве умножение на 1 - то же, что проинвертировать сигнал? А умножить на 0 - оставить сигнал без изменений? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба А почему нужно ксорить? Разве умножение на 1 - то же, что проинвертировать сигнал? А умножить на 0 - оставить сигнал без изменений? А это уже надо на конкретную плисину смотреть, что выгодней. Вы предлагаете, я так понял, сделать мультиплексор с описанием, типа: if (input[i]) out[i]<=~coef[i]; else out[i]<=coef[i]; Ну просто мне, например, кажется что в общем случае по ресурсам выгодней использовать один XOR или XNOR нежели мультиплексор и инвертор, но могу ошибаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба ...Вы предлагаете, я так понял, сделать мультиплексор... Я предлагаю делать то, что требуется от фильтра. Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть. Если бы нужно было умножить на -1 - проинвертировать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Это согласованный фильтр и его задача сводится к нахождению корреляционного пика - некоторого уровня выше порога. Смысл работы сводится к совпадению некоей последовательности с эталонной. Возможны только два варианта: либо текущий отсчет совпал с эталоном, либо нет. Если касаться одноразрядной работы, то вопрос сводится к тому, нужно или нет прибавлять единицу, а это пораждает простейший мультиплексор - Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть., я же предлагал заменить мультиплексор вентилем XOR, утверждая что это будет менее ресурсоемким (хотя зависит от конкретной плисины). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Это согласованный фильтр и его задача сводится к нахождению корреляционного пика - некоторого уровня выше порога. Попробуйте посчитать нарисованный на картинке фильтр по вашему алгоритму. У меня не получилось пика корреляции. С каким порогом будете сравнивать? У Вас получается не "нужно прибавлять единицу, или нет", а "прибавить единицу или отнять". upd. Нет, пожалуй, и не так - как-то "размазывается" по времени, точнее не подберу слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 11 мая, 2010 Опубликовано 11 мая, 2010 (изменено) · Жалоба to ViKo Я уже упоминал несколькими постами выше, что это не классическая структура. Она будет классической, если все линии задержки перенести в верхнюю линию, а из кучи сумматоров сделать один общий по всем отводам. Приведенный мною код именно под классическую схему. У меня не получилось пика корреляции. С каким порогом будете сравнивать? Если это действительно согласованный фильтр, то в данном случае корреляционный максимум должен быть равен 7 (это будет означать что входная последовательность полностью совпала с эталонной), порог выбирается по конктретной задаче и действительно здесь ни причем. У Вас получается не "нужно прибавлять единицу, или нет", а "прибавить единицу или отнять". Ну и в каком месте Вы это увидели? always @(*) for(i = 0; i < 6; i = i + 1) res[i] = reg_input[i] ^ coef[i]; assign Output = ((res[0]+res[1])+(res[2]+res[3]))+((res[4]+res[5])+res[6]); Если сигналы одноразрядные, то да - нужно прибавлять единицу, или нет. Если двухразрядные, то прибавить единицу или отнять от общей суммы. Именно так по моим представлениям и должен работать согласованный фильтр. И, по моим представлениям, совпал сигнал с эталоном или нет можно с помощью мультиплексора: case({input[i],coeff[i])} 2'b11:sum[i]<=1'b1; 2'b00:sum[i]<=1'b1; default:sum[i]<=1'b0; endcase Или с помощью XNOR Насчет приведенной схемы - да, это фильтр, но не согласованный. И будет согласованным, если на схеме кружочки трактовать не как умножить на 1 или 0, а как суммирование по модулю два со значениями в центре круга. PS Код свой не проверял, симулятор полетел, проверю - доложу, если и ошибся то в мелочи, таких схем на ловлю ПШС уже много делал... Изменено 11 мая, 2010 пользователем bogaev_roman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Верно, будет работать фильтр и на xor. Только пик пойдет вниз, к нулю. Когда входная последовательность совпадает с коэффициентами фильтра, все xor дадут 0, и сумма станет равна 0. В-принципе, что xor, что !xor, что and дают одинаковую разницу на выходе фильтра между отсутствием сигнала и присутствием. Вы правы. И на ПЛИС реализация тоже одинаковая - все равно через LUT пропускать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 12 мая, 2010 Опубликовано 12 мая, 2010 · Жалоба Я предлагаю делать то, что требуется от фильтра. Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть. Если бы нужно было умножить на -1 - проинвертировать :) Если входной сигнал у фильта знаковый, то в опорной последовательности 0 означает +1, а 1 -- -1. Соответственно, отсчёт сигнала либо прибавляется, либо вычитается. Иначе корреляционного пика вы не получите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 12 мая, 2010 Опубликовано 12 мая, 2010 · Жалоба Согласованный фильтр вроде как по-другому немного делается в классическом варианте, с него бы и начали... out=Sum(input*coeff). Где входной сигнал записывается в сдвиговый регистр и каждое значение перемножается на свой коэффициент. У Вас коэффициент одноразрядный же, берете сигнал Input (0 или 1) и ксорите его с коэффициентом (0 или 1). В данном случае размах сигнала будет по диапазону в два раза меньше чем при перемножении. Если хотите диапазон таким же оставить, то замените умножение на простейшую логику с мультиплексорами. Ага...надо было с класического, не подумал. Это пример только для начала, чтобы посмтортеть работу. Теперь насчет самого СФ: пока непонятно сколько свободных ресурсов на кристалле остается - решили брать только знак, 0 - положит. , 1 - отрицат. (или наоборот сделать как в Варакине) (пройгрышь 2 дБ по сравнению с бесконечностью) Если смотерть на ЛСФ, который в книгах описывается, там использвуется 1 и -1. И там значения получаются и положит, и отрицательные. Примеры из Simulink. (токо это не преамбула - просто избавление от расширения спектра) Преамбула вот: Я вот не знаю, ДСФ норм если оставить, или лучше заюзать SL32С и несколько разрядов, именно по ресурасм. Ведь с помощью SL32С можно в перспективе работать) ЗЫ: Немного исправил код: module MF(Clock, Input, Output); input Clock; input Input; output [2:0] Output; reg [6:0] coef =7'b0011101; reg [6:0] reg_input = 0; integer i; reg [6:0] res = 0; always @(posedge Clock) reg_input <= {Input, reg_input[6:1]}; always @(*) for(i = 0; i < 7; i = i + 1) res[i] = reg_input[i] ~^ coef[i]; assign Output = res[0] + res[1] + res[2] + res[3] + res[4] + res[5] + res[6]; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться