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

Как бы вычислить модуль разности побыстрее?

Значение из последнего выражения должно быть готово к приходу следующей выборки, первой из следующего интервала. А они, выборки, идут непрерывным потоком, через 4 нс.

О, понял! Вы правы, сравнивать-то можно в конце интервала. Спасибо!!

pipeline должен решить проблему

Реализовываете выражение конвеером.

Ставите pipeline задержку для входных данных.

Производите сравнение.

Выдаете результат.

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


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

pipeline должен решить проблему

Реализовываете выражение конвеером.

Ставите pipeline задержку для входных данных.

Производите сравнение.

Выдаете результат.

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

Timmy предложил отличное решение. Буду его творить. :rolleyes:

 

P.S. И, все же, быстрое вычисление модуля разности остается вызовом для ума. Казалось бы, по двухмерной таблице можно мгновенно найти результат. Нет ли чего-нибудь из "трюков числовых"?

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


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

Сделал.

/*!****************************************************************************
*
 @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

post-10362-1467391719_thumb.jpg

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


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

Сделал.

Мне кажется, можно к MinGap и MaxGap добавить знаковый бит, и обойтись только их знаковым сравнением, без отдельных High и Low, которые, кстати, будут равны знаковым битам MinGap и MaxGap.

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


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

Мне кажется, можно к MinGap и MaxGap добавить знаковый бит, и обойтись только их знаковым сравнением, без отдельных High и Low, которые, кстати, будут равны знаковым битам MinGap и MaxGap.

Возможно. Но у меня всё беззнаковое. А результат синтеза будет одинаковым, я думаю.

В них еще переполнения возникают при вычислении. На картинке видно. Но в этом случае работают Low и High.

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


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

Возможно. Но у меня всё беззнаковое. А результат синтеза будет одинаковым, я думаю.

В них еще переполнения возникают при вычислении. На картинке видно. Но в этом случае работают Low и High.

На умность и оптимизацию синтезатора я бы не расчитывал. Если знаковый результат вычитания двух беззнаковых чисел будет на один бит длиннее, переполнение никогда не возникнет. А исходный текст значительно сократится, и результат синтеза, вероятно, тоже.

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


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

На умность и оптимизацию синтезатора я бы не расчитывал. Если знаковый результат вычитания двух беззнаковых чисел будет на один бит длиннее, переполнение никогда не возникнет. А исходный текст значительно сократится, и результат синтеза, вероятно, тоже.

Те самые биты, на которые длиннее, и есть эквиваленты 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 % )

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


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

Те самые биты, на которые длиннее, и есть эквиваленты 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

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


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

Работает! И ресурсов забирает меньше!

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 требовало большего. Может, из-за того, что в вычитании с сравнении переменные стояли наоборот.

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


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

Работает! И ресурсов забирает меньше!

Пока не разбирался, за счет чего вышло сокращение. Видимо, у меня вычисление разности и сравнение с Peak требовало большего. Может, из-за того, что в вычитании с сравнении переменные стояли наоборот.

Меньше ресурсов, потому что в моём варианте ушли независимые компараторы для вычисления High и Low(-16 LE) но добавилось по биту к двум вычитателям, итого как раз -14 LE. А Квартус сам не догадался объединить компараторы с вычитателями.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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