Maverick_ 15 29 июня, 2016 Опубликовано 29 июня, 2016 · Жалоба Значение из последнего выражения должно быть готово к приходу следующей выборки, первой из следующего интервала. А они, выборки, идут непрерывным потоком, через 4 нс. О, понял! Вы правы, сравнивать-то можно в конце интервала. Спасибо!! pipeline должен решить проблему Реализовываете выражение конвеером. Ставите pipeline задержку для входных данных. Производите сравнение. Выдаете результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 июня, 2016 Опубликовано 29 июня, 2016 · Жалоба pipeline должен решить проблему Реализовываете выражение конвеером. Ставите pipeline задержку для входных данных. Производите сравнение. Выдаете результат. Определение минимума и максимума должно выполняться по каждой выборке, за такт. Потому, что через такт придет следующая выборка, требующая такого же сравнения. Timmy предложил отличное решение. Буду его творить. :rolleyes: P.S. И, все же, быстрое вычисление модуля разности остается вызовом для ума. Казалось бы, по двухмерной таблице можно мгновенно найти результат. Нет ли чего-нибудь из "трюков числовых"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 1 июля, 2016 Опубликовано 1 июля, 2016 · Жалоба Сделал. /*!**************************************************************************** * @brief Peak Detector relative past peak @note Не пропускает пики, успевает по времени, из-за сдвига на еще один такт */ module PeakDetector #(parameter WIDTH = 8) ( input bit Clk, // fast Clock input bit TBas, // TimeBase pulse input bit [WIDTH-1 : 0] SDat, // Samples Data output bit [WIDTH-1 : 0] PDet // Peak Detector output ); bit TBS, TBSS; // shifted Timebase bit [WIDTH-1 : 0] Min; // Minimum on interval bit [WIDTH-1 : 0] Max; // Maximum on interval bit [WIDTH-1 : 0] MinFix; // Minimum Fixed at end interval bit [WIDTH-1 : 0] MaxFix; // Maximum Fixed at end interval /* Найти и запомнить экстремальные значения на интервале */ always_ff @(posedge Clk) begin if (SDat < Min || TBas) Min <= SDat; if (SDat > Max || TBas) Max <= SDat; if (TBas) begin MinFix <= Min; MaxFix <= Max; end TBS <= TBas; TBSS <= TBS; end bit Low; // data Low than past peak bit High; // data High than past peak bit [WIDTH-1 : 0] Peak; // past Peak detected data bit [WIDTH-1 : 0] MinGap; // Gap past peak to fixed Minimum bit [WIDTH-1 : 0] MaxGap; // Gap fixed Maximum to past peak always_ff @(posedge Clk) begin if (MaxFix < Peak) Low <= 1; else Low <= 0; if (MinFix > Peak) High <= 1; else High <= 0; MinGap <= Peak - MinFix; MaxGap <= MaxFix - Peak; end always_ff @(posedge Clk) begin if (TBSS) if (Low) Peak <= MinFix; else if (High) Peak <= MaxFix; else begin if (MinGap > MaxGap) Peak <= MinFix; else Peak <= MaxFix; end end always_ff @(posedge Clk) if (TBas) PDet <= Peak; endmodule : PeakDetector Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 1 июля, 2016 Опубликовано 1 июля, 2016 · Жалоба Сделал. Мне кажется, можно к MinGap и MaxGap добавить знаковый бит, и обойтись только их знаковым сравнением, без отдельных High и Low, которые, кстати, будут равны знаковым битам MinGap и MaxGap. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 1 июля, 2016 Опубликовано 1 июля, 2016 · Жалоба Мне кажется, можно к MinGap и MaxGap добавить знаковый бит, и обойтись только их знаковым сравнением, без отдельных High и Low, которые, кстати, будут равны знаковым битам MinGap и MaxGap. Возможно. Но у меня всё беззнаковое. А результат синтеза будет одинаковым, я думаю. В них еще переполнения возникают при вычислении. На картинке видно. Но в этом случае работают Low и High. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 4 июля, 2016 Опубликовано 4 июля, 2016 · Жалоба Возможно. Но у меня всё беззнаковое. А результат синтеза будет одинаковым, я думаю. В них еще переполнения возникают при вычислении. На картинке видно. Но в этом случае работают Low и High. На умность и оптимизацию синтезатора я бы не расчитывал. Если знаковый результат вычитания двух беззнаковых чисел будет на один бит длиннее, переполнение никогда не возникнет. А исходный текст значительно сократится, и результат синтеза, вероятно, тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 июля, 2016 Опубликовано 4 июля, 2016 · Жалоба На умность и оптимизацию синтезатора я бы не расчитывал. Если знаковый результат вычитания двух беззнаковых чисел будет на один бит длиннее, переполнение никогда не возникнет. А исходный текст значительно сократится, и результат синтеза, вероятно, тоже. Те самые биты, на которые длиннее, и есть эквиваленты Low и High. Если интересно, поправьте мой исходник. Обещаю прогнать через Quartus. У меня сейчас результаты такие: Total logic elements 91 / 5,136 ( 2 % ) Total combinational functions 67 / 5,136 ( 1 % ) Dedicated logic registers 60 / 5,136 ( 1 % ) Total registers 68 Total pins 18 / 95 ( 19 % ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 4 июля, 2016 Опубликовано 4 июля, 2016 · Жалоба Те самые биты, на которые длиннее, и есть эквиваленты Low и High. Если интересно, поправьте мой исходник. Обещаю прогнать через Quartus. Вот так: /*!**************************************************************************** * @brief Peak Detector relative past peak @note Не пропускает пики, успевает по времени, из-за сдвига на еще один такт */ module PeakDetector #(parameter WIDTH = 8) ( input bit Clk, // fast Clock input bit TBas, // TimeBase pulse input bit [WIDTH-1 : 0] SDat, // Samples Data output bit [WIDTH-1 : 0] PDet // Peak Detector output ); bit TBS, TBSS; // shifted Timebase bit [WIDTH-1 : 0] Min; // Minimum on interval bit [WIDTH-1 : 0] Max; // Maximum on interval bit [WIDTH-1 : 0] MinFix; // Minimum Fixed at end interval bit [WIDTH-1 : 0] MaxFix; // Maximum Fixed at end interval /* Найти и запомнить экстремальные значения на интервале */ always_ff @(posedge Clk) begin if (SDat < Min || TBas) Min <= SDat; if (SDat > Max || TBas) Max <= SDat; if (TBas) begin MinFix <= Min; MaxFix <= Max; end TBS <= TBas; TBSS <= TBS; end bit Low; // data Low than past peak bit High; // data High than past peak bit [WIDTH-1 : 0] Peak; // past Peak detected data bit signed [WIDTH-0 : 0] MinGap; // Gap past peak to fixed Minimum bit signed [WIDTH-0 : 0] MaxGap; // Gap fixed Maximum to past peak always_ff @(posedge Clk) begin //if (MaxFix < Peak) Low <= 1; //else Low <= 0; //if (MinFix > Peak) High <= 1; //else High <= 0; MinGap <= Peak - MinFix; MaxGap <= MaxFix - Peak; end always_ff @(posedge Clk) begin if (TBSS) //if (Low) Peak <= MinFix; //else if (High) Peak <= MaxFix; //else begin if (MinGap > MaxGap) Peak <= MinFix; else Peak <= MaxFix; //end end always_ff @(posedge Clk) if (TBas) PDet <= Peak; endmodule : PeakDetector Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 июля, 2016 Опубликовано 4 июля, 2016 · Жалоба Работает! И ресурсов забирает меньше! Total logic elements 78 / 5,136 ( 2 % ) Total combinational functions 53 / 5,136 ( 1 % ) Dedicated logic registers 60 / 5,136 ( 1 % ) Total registers 68 Total pins 18 / 95 ( 19 % ) Спасибо, Timmy! Пока не разбирался, за счет чего вышло сокращение. Видимо, у меня вычисление разности и сравнение с Peak требовало большего. Может, из-за того, что в вычитании с сравнении переменные стояли наоборот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 4 июля, 2016 Опубликовано 4 июля, 2016 · Жалоба Работает! И ресурсов забирает меньше! Пока не разбирался, за счет чего вышло сокращение. Видимо, у меня вычисление разности и сравнение с Peak требовало большего. Может, из-за того, что в вычитании с сравнении переменные стояли наоборот. Меньше ресурсов, потому что в моём варианте ушли независимые компараторы для вычисления High и Low(-16 LE) но добавилось по биту к двум вычитателям, итого как раз -14 LE. А Квартус сам не догадался объединить компараторы с вычитателями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться