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

Прошу помощи в повышении тактовой частоты модуля

Мне остался по наследству модуль

module alg_integrator_smart (clk, reset, start, base, data_in, data_slow, ready_const, clk_const, addr_const, data_const, tdpp, data_out, int_out, int_diff, tau_out);

	input clk, reset, start;
	input signed [15:0] data_in; 
	input signed [47:0] data_slow;
	input signed [23:0] base;
	input ready_const, clk_const;
	input [5:0] addr_const;
	input [15:0] data_const;
	input signed [15:0] tdpp;
	
	output signed [47:0] data_out;
	output signed [15:0] int_out;
	output signed [15:0] int_diff;
	output signed [23:0] tau_out;


reg signed [23:0] r_base = 24'sd51200;
reg signed [47:0] resalt_r, sample_data;
reg signed [63:0] resalt, resalt_i; 
reg [1:0] front_start;
reg signed [23:0] tau_coeff = 24'sd117500;// 917.97 *128
reg signed [23:0] tau_calc = 24'sd117500;// 917.97 *128
reg signed [16:0] k1 = 17'sd0;   
reg signed [16:0] k2 = 17'sd0;
reg tau_calc_en = 1'b0;// default 
reg signed [39:0] tau_acc;
reg signed [16:0] tdpp_delta;  

//*******************************************************
reg signed [23:0] fifo_amp [2:0];
reg signed [47:0] buf2;
reg start_prev = 1'b0;
reg signed [63:0] int_prev;
reg signed [63:0] delta;
//*******************************************************

// process for update constants 
always @(posedge clk_const)
begin
	if (ready_const) 
		case (addr_const)
		6'd2: tau_coeff[15:0] <= data_const;
		6'd3: tau_coeff[23:16] <= data_const[7:0];
		6'd23: tau_calc_en <= data_const[3];// customize[3]	-> + 8
		6'd25: begin k2[15:0] <= data_const; k2[16] <= 1'b0; end// coefficient (top_discriminator)
		6'd26: begin k1[15:0] <= data_const; k1[16] <= 1'b0; end// base temperature (bottom_discriminator)
		default:
			begin
				tau_coeff <= tau_coeff;
				tau_calc_en <= tau_calc_en;
				k2 <= k2;
				k1 <= k1;
			end 
		endcase
end

// process tau calculation
always@(negedge clk)
begin
	tdpp_delta <= tdpp - k1;
	if (tau_calc_en == 1'b1)
	begin
		if (k1 > 0)
//			tau_calc <= tau_acc >>> 16;
			tau_calc <= tau_acc >>> 15;
		 else
			tau_calc <= tau_coeff;
	end
	 else
		tau_calc <= tau_coeff;
end

always@(posedge clk)
begin
//	tau_acc <= (tau_coeff <<< 16) + k2 * tdpp_delta;
	tau_acc <= (tau_coeff <<< 15) + k2 * tdpp_delta;
end


// main process of integrator
always@(posedge clk or negedge reset)
begin
	if(reset == 1'b0)
		begin : resetting 
			resalt <= 64'sd0;
			resalt_i <= 64'sd0;
			//resalt_r <= 48'sd0;
			buf2 <= 48'sd0;
		end
	else 
		begin : calculating
			// input signal buffer
			fifo_amp[0] <= (data_in <<< 8) - r_base;
			fifo_amp[1] <= fifo_amp[0];
			fifo_amp[2] <= fifo_amp[1];
			
//			buf2 <= fifo_amp[0] * tau_coeff;
			buf2 <= fifo_amp[0] * tau_calc;
			
			if ((start_prev == 1'b1) & (start == 1'b0))
				resalt_i <= resalt_i + buf2 - sample_data; 
			else
				resalt_i <= resalt_i + buf2; 

			resalt <= resalt_i + (fifo_amp[2] <<< 22);
		end	
end


always@(posedge clk or negedge reset)
	if(reset == 1'b0)
		r_base <= r_base;
	else
		if ((start_prev == 1'b1) & (start == 1'b0))
			r_base <= base;
		else
			r_base <= r_base;


// process for update slow data
always@(posedge clk or negedge reset)
	if (reset == 1'b0)
		sample_data <= 48'd0;
	else
		sample_data <= data_slow;

// process for generate start vector
always@(posedge clk)
begin
	//front_start[0] <= start;
	//front_start[1] <= front_start[0];
	start_prev <= start;
end

// process for calculate delta INT
always@(posedge clk)
begin
	delta <= resalt - int_prev;
	int_prev <= resalt;
end

// connect outputs
assign data_out = resalt;
assign int_out = resalt_i >>> 30;
assign int_diff = delta >>> 30;
assign tau_out = tau_calc;

endmodule

естественно разработчика я не застал, мои попытки увеличить тактовую хотя бы на 30-40 МГц не принесли результатов

проблема в арифметике:

buf2 <= fifo_amp[0] * tau_calc;
			
if ((start_prev == 1'b1) & (start == 1'b0))
	resalt_i <= resalt_i + buf2 - sample_data; 
else
	resalt_i <= resalt_i + buf2; 
resalt <= resalt_i + (fifo_amp[2] <<< 22);

Квартус 18.1 для циклон5 дает 102MHz ...

Да описание написано лет десять назад... работало на циклон3

я смог добиться 114МГц

module alg_integrator_smart (clk, tau_coeff,k1,k2,tau_calc_en, reset, start, base, data_in, data_slow, ready_const, addr_const, data_const, tdpp, data_out, int_out, int_diff, tau_out);

	input clk, reset, start;
	input signed [15:0] data_in; 
	input signed [47:0] data_slow;
	input signed [23:0] base;
	
	input ready_const;
	input [5:0] addr_const;
	input [15:0] data_const;
	
	input signed [23:0] tau_coeff; // = 24'sd117500;// 917.97 *128
	input signed [16:0] k1;			 // = 17'sd0;   
	input signed [16:0] k2;			 // = 17'sd0;
	input tau_calc_en;				 // = 1'b0;// default 
	
	input signed [15:0] tdpp;
	
	output signed [47:0] data_out;
	output signed [15:0] int_out;
	output signed [15:0] int_diff;
	output signed [23:0] tau_out;


reg signed [47:0] reg_data_slow;	
reg signed [23:0] r_base = 24'sd51200;
reg signed [47:0] resalt_r, sample_data;
reg signed [63:0] resalt, resalt_i;
reg signed [63:0] resalt_a, resalt_b; 

reg signed [47:0] resalt0;

reg [1:0] front_start;
//reg signed [23:0] tau_coeff = 24'sd117500;// 917.97 *128
reg signed [23:0] tau_calc = 24'sd117500;// 917.97 *128
//reg signed [16:0] k1 = 17'sd0;   
//reg signed [16:0] k2 = 17'sd0;
//reg tau_calc_en = 1'b0;// default 
reg signed [39:0] tau_acc;

reg signed [31:0] tau_acc0;
reg signed [31:0] tau_acc1;

reg signed [16:0] tdpp_delta;  

//*******************************************************
reg signed [23:0] fifo_amp [2:0];
reg signed [47:0] buf2;
reg start_prev = 1'b0;
reg signed [63:0] int_prev;
reg signed [63:0] delta;
//*******************************************************

// process for update constants 
//always @(posedge clk) //clk_const
//begin
//	if (ready_const) 
//		case (addr_const)
//		6'd2: tau_coeff[15:0] <= data_const;
//		6'd3: tau_coeff[23:16] <= data_const[7:0];
//		6'd23: tau_calc_en <= data_const[3];// customize[3]	-> + 8
//		6'd25: begin k2[15:0] <= data_const; k2[16] <= 1'b0; end// coefficient (top_discriminator)
//		6'd26: begin k1[15:0] <= data_const; k1[16] <= 1'b0; end// base temperature (bottom_discriminator)
//		default:
//			begin
//				tau_coeff <= tau_coeff;
//				tau_calc_en <= tau_calc_en;
//				k2 <= k2;
//				k1 <= k1;
//			end 
//		endcase
//end

// process tau calculation
always@(negedge clk)
begin
	tdpp_delta <= tdpp - k1;
	if (tau_calc_en == 1'b1)
	begin
		if (k1 > 0)
//			tau_calc <= tau_acc >>> 16;
			tau_calc <= tau_acc >>> 15;
		 else
			tau_calc <= tau_coeff;
	end
	 else
		tau_calc <= tau_coeff;
end

always@(posedge clk)
begin
//	tau_acc <= (tau_coeff <<< 16) + k2 * tdpp_delta;
	//tau_acc <= (tau_coeff <<< 15) + k2 * tdpp_delta;
	 tau_acc <= tau_acc0 + tau_acc1;
end

always @( posedge clk)
  begin
    tau_acc0 <= tau_coeff <<< 15;
  end

always @( posedge clk)
  begin
    tau_acc1 <= k2 * tdpp_delta;
  end

// main process of integrator
always@(posedge clk or negedge reset)
begin
	if(reset == 1'b0)
		begin : resetting 
			resalt <= 64'sd0;
			resalt_i <= 64'sd0;
			//resalt_r <= 48'sd0;
			//buf2 <= 48'sd0;
		end
	else 
		begin : calculating
			// input signal buffer
			fifo_amp[0] <= (data_in <<< 8) - r_base;
			fifo_amp[1] <= fifo_amp[0];
			fifo_amp[2] <= fifo_amp[1];
			
//			buf2 <= fifo_amp[0] * tau_coeff;
			
			
			if ((start_prev == 1'b1) & (start == 1'b0))
				//resalt_i <= resalt_i + buf2 - sample_data; 
				resalt_i <= resalt_a;
			else
				resalt_i <= resalt_b; 

			resalt <= resalt_i + (fifo_amp[2] <<< 22);
		end	
end


always @( posedge clk)
  begin
    resalt_a <= resalt_a + resalt0; //sample_data;
  end
  
always @( posedge clk)
  begin
    resalt_b <= resalt_b + buf2;  //sample_data;
  end  


always @( posedge clk)
  begin
	 //reg_data_slow <= data_slow;	
    resalt0 <= buf2 - data_slow; //sample_data;
  end


always @( posedge clk)
  begin
   buf2 = fifo_amp[0] * tau_calc;
  end
  
always@(posedge clk or negedge reset)
	if(reset == 1'b0)
		r_base <= r_base;
	else
		if ((start_prev == 1'b1) & (start == 1'b0))
			r_base <= base;
		else
			r_base <= r_base;


//// process for update slow data
//always@(posedge clk or negedge reset)
//	if (reset == 1'b0)
//		sample_data <= 48'd0;
//	else
//		sample_data <= data_slow;

// process for generate start vector
always@(posedge clk)
begin
	//front_start[0] <= start;
	//front_start[1] <= front_start[0];
	start_prev <= start;
end

// process for calculate delta INT
always@(posedge clk)
begin
	delta <= resalt - int_prev;
	int_prev <= resalt;
end

// connect outputs
assign data_out = resalt;
assign int_out = resalt_i >>> 30;
assign int_diff = delta >>> 30;
assign tau_out = tau_calc;

endmodule

и то я изменил немного матемтику она не соответствует первоначальной (это видно в моем описании выше):

if ((start_prev == 1'b1) & (start == 1'b0))
                resalt_i <= resalt_i + buf2 - sample_data;
            else
                resalt_i <= resalt_i + buf2;

я сделал вычисления в условиях независимыми, что есть не совсем правильным

этот always я уберу - эти регистры будут инициализироваться по авлон ММ шине в одном модуле - в этот модуль будут приходить как входные данные (в моем варианте этот процесс уже закоментирован):

// process for update constants 
always @(posedge clk_const)
begin
	if (ready_const) 
		case (addr_const)
		6'd2: tau_coeff[15:0] <= data_const;
		6'd3: tau_coeff[23:16] <= data_const[7:0];
		6'd23: tau_calc_en <= data_const[3];// customize[3]	-> + 8
		6'd25: begin k2[15:0] <= data_const; k2[16] <= 1'b0; end// coefficient (top_discriminator)
		6'd26: begin k1[15:0] <= data_const; k1[16] <= 1'b0; end// base temperature (bottom_discriminator)
		default:
			begin
				tau_coeff <= tau_coeff;
				tau_calc_en <= tau_calc_en;
				k2 <= k2;
				k1 <= k1;
			end 
		endcase
end

Буду рад конструктивным предложениям/мыслям по увеличению тактовой частоты хотя бы до 130-140МГц ...

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


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

Лень досконально разбираться в алгоритме в такой простыне кода,  но кажется мне что похоже это на обычный gain-control на звене первого порядка.  
Я бы начал с того что выписать алгоритм вычислений с учетом требований по latency и throughput, а  потом смотрел как можно конвеезировать его.     

P.S.  Умножать  24x24 за один такт и ждать высокой частоты? 

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


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

В 21.10.2022 в 00:19, Maverick_ сказал:

Буду рад конструктивным предложениям/мыслям по увеличению тактовой частоты хотя бы до 130-140МГц ...

Что за хитрый алгоритм разбираться лениво, но работа по двум фронтам на быстродействие сказывается явно не лучшим образом.

Это вот тут:

В 21.10.2022 в 00:19, Maverick_ сказал:
// process tau calculation
always@(negedge clk)
begin
	...
		tau_calc <= tau_coeff;
end

 

И тут:

В 21.10.2022 в 00:19, Maverick_ сказал:
// main process of integrator
always@(posedge clk or negedge reset)
begin
	...
			buf2 <= fifo_amp[0] * tau_calc;
			
	...		
end

 

Лучше все привести к работе по одному фронту.

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


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

7 hours ago, RobFPGA said:

P.S.  Умножать  24x24 за один такт и ждать высокой частоты? 

да даже за 2 такта на сыклоне, с умножителями 19х18 не даст результата) 

Особо вариантов то нет. Либо вам нужно выделить бюджет на умножение 3-4 такта, как понимаю это должно определяться сигналом подачи входных данных, но в первоначальном коде этого не видно, судя по всему данные  идут каждый такт. Либо вводить предварительную обработку с децимацией данных. Т.е. расписать математику и выяснить, можно ли входные данные data_in сложить таким образом, чтобы не сломать работу схемы. Тогда ваш аккумулятор кладется в мультицикловый домен и тактовая уже не представляет проблем)

Ну или аппетиты поумерить и вписаться в сыклоновский умножитель 19х18 ничего не делая)

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


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

Всем спасибо.

7 hours ago, Самурай said:

Что за хитрый алгоритм разбираться лениво, но работа по двум фронтам на быстродействие сказывается явно не лучшим образом.

Это вот тут:

И тут:

Лучше все привести к работе по одному фронту.

- не увидел, спасибо что обратили внимание. Исправил, тактовая частота повысилась.

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


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

18 minutes ago, Maverick_ said:

Всем спасибо.

- не увидел, спасибо что обратили внимание. Исправил, тактовая частота повысилась.

только учтите что это могло быть сделано специально, в качестве меры подготовки данных для умножения с накоплением. Т.к. изменив фронт в этом месте, вы добавили задержку сигнала на 1 такт, тогда как там была "попытка" конвейризации, которая на самом деле выглядит как попытка "зафиксировать" выход из логического блока триггером. 

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


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

9 hours ago, des00 said:

только учтите что это могло быть сделано специально, в качестве меры подготовки данных для умножения с накоплением. Т.к. изменив фронт в этом месте, вы добавили задержку сигнала на 1 такт, тогда как там была "попытка" конвейризации, которая на самом деле выглядит как попытка "зафиксировать" выход из логического блока триггером. 

понял, спасибо за предупреждение и пояснение

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


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

On 10/21/2022 at 7:00 PM, Maverick_ said:

понял, спасибо за предупреждение и пояснение

Как показывает практика, конвейерные вычисления, фиксация результата по счётчику (если необходимо), использование DSP-ядер - всё это значительно повышает итоговую частоту работы. Если частот несколько - используем фифо (не защёлкиваем и не ожидает результат по одной частоте, регистрация по другой).

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


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

Добрый!

Помогите пожалуйста исправить ошибку в моделсиме, квартус компилирует без проблем

Ошибка;

image.thumb.png.29450726e3cc421c3cd9ad43f2c78218.png

Файл во вложении

PS уже жаже переписал на английской клавиатуре всю первую строку - думал что кирилица где-то есть

Хотя бы мысли, где копать подскажите пожалуйста

 

alg_base_calc_1calc.v

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


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

 

12 minutes ago, Maverick_ said:

Хотя бы мысли, где копать подскажите пожалуйста

Копать в сторону возможности компилировать  верилог код компилятором VHDL ...  (vcom vis vlog)

 

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


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

2 hours ago, RobFPGA said:

Копать в сторону возможности компилировать  верилог код компилятором VHDL ...  (vcom vis vlog)

не увидел,  спасибо))

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


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

1 hour ago, Maverick_ said:

Добрый!

Помогите пожалуйста исправить ошибку в моделсиме, квартус компилирует без проблем

Ошибка;

 

Боюсь без остальных (вложенных) файлов проекта сказать что-то будет сложно..

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


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

1 hour ago, Джеймс said:

Боюсь без остальных (вложенных) файлов проекта сказать что-то будет сложно..

проблема была в том что в do файле я случайно для верилог файла написал команду для vhdl файла

было
vcom -2008 -work work {./moduls/calc_base/alg_base_calc_1calc.v}
надо:
vlog -work work {./moduls/calc_base/alg_base_calc_1calc.v}

на скрине ошибки это видно)))

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


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

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

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

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

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

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

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

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

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

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