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

а как поднять частоту работы данного модуля?

Без анализа результатов синтеза никак.

Смотреть критический путь и применять техники которые вы перечислили.

В этом может помочь schematic view.

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


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

Исправил умножитель который действует на 32-х битных операндах, получилось 54 МГц.

Дальше сделал в столбик умножение с применением 2-х ячеек dsp48 - 1 модуль - получилась скорость около 190 МГц, но пока что додумался только для unsigned операндов. Как делать со знаковыми - пока в голову приходит только перевод в обычное представление, мухлеж со знаками и перевод обратно по знаку. Есть еще какие нибудь способы? Использовать ядра xilinx нельзя, код будет работать и на альтере.

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


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

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

Незнание закона не освобождает от ответственности....

Но похоже в элементарных дизайнах (с точки зрения STA) и парится ненадо - достаточно дефолтных устиановок (для одноклокового чистосинхронного дизайна).

А с другой стороны прям чешется спросить - а для каких условий эксплуатации вы свою ПЛИС слепили?

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


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

Есть еще какие нибудь способы? Использовать ядра xilinx нельзя, код будет работать и на альтере.

 

есть. на верилоге умножение описывается так

A<= $signed(B) * $signed©. Пихаете в синтезатор типа ISE и о чудо все получилось само%).

 

Чуть более правильно найти нормальную схему умножителя (описание данной схемы) и запихать это все инстансом. Умножителей очень много и 1 тактовые и многотактовые, и тд и тп

 

 

 

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


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

Вы молодец. Движетесь в нужном направлении.

 

Как скомбинировать 2 маленьких знаковых умножителя в один большой знаковый можно посмортреть здесь на стр. 6.

 

Исправил умножитель который действует на 32-х битных операндах, получилось 54 МГц.

Дальше сделал в столбик умножение с применением 2-х ячеек dsp48 - 1 модуль - получилась скорость около 190 МГц, но пока что додумался только для unsigned операндов. Как делать со знаковыми - пока в голову приходит только перевод в обычное представление, мухлеж со знаками и перевод обратно по знаку. Есть еще какие нибудь способы? Использовать ядра xilinx нельзя, код будет работать и на альтере.

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


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

А с другой стороны прям чешется спросить - а для каких условий эксплуатации вы свою ПЛИС слепили?

 

Для злых. Оно будет летать...

Я понимаю бреши в своих знаниях, думаю еще месяцок буду писать hdl код, потом все отлаживать и параллельно с этим разбираться как правильно делать крайнюю стадию проекта.

 

 

Чуть более правильно найти нормальную схему умножителя (описание данной схемы) и запихать это все инстансом. Умножителей очень много и 1 тактовые и многотактовые, и тд и тп

 

Я быстренько просмотрел книжку про реализацию арифметических схем в ПЛИС, реально много, да... но DSP ячеек мне будет достаточно. Вот задача была сделать на них

 

 

Какой чип? Какой тулчейн используете? Какую частоту надо получить?

Чип спартан 6 и циклон 4, использую ISE, частоту... ну как бы сказать... меня бы эти 47 МГц в принципе устроили, сделал бы тактовую модуля мегагерц 30 и в ус бы не дул, но хочется больше ста чисто чтоб разобраться что да как.

 

 

Fat Robot, огромное спасибо!

 

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


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

но DSP ячеек мне будет достаточно. Вот задача была сделать на них

 

Использовать ядра xilinx нельзя, код будет работать и на альтере.

 

иногда вас сложно понять:) то есть речь шла об IP ядрах что ли, их нельзя, а дсп модули можно?

 

В целом задача то для 5 класса.

AB*CD = (A*10 + B ) * (C*10 + D) = A*10*C*10 + B*C*10 + A*10*D + B * D

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


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

Сделал.

Получилось почти 169 мегагерц. Мне достаточно.

Убил 3 часа на поиск простой ошибки, ручками на листочке умножал 1 и -1, а потом сравнивал. В итоге все подтверждается, что самые сложные ошибки в поиске - самые глупые.

module test_mult_module(
input clk,
input reset_n,


input									mult_en,
input 			signed [34:0] 	A,
input 			signed [34:0]	B,

output 	reg	signed [69:0] 	result,
output 	reg						result_valid
   );

localparam		idle = 2'b00,
				state0 = 2'b01,
				state1 = 2'b10,
				state2 = 2'b11;

reg signed [34:0]	A_reg;
reg signed [34:0]	B_reg;

reg				[1:0]		state_reg;

reg	signed	[17:0]	mult0_reg;
reg	signed	[17:0]	mult1_reg;
reg	signed	[35:0]	mult32_res0_reg;
reg	signed	[17:0]	mult2_reg;
reg	signed	[17:0]	mult3_reg;
reg	signed	[35:0]	mult32_res1_reg; 


wire 	signed	[35:0]	sum_wire;


assign sum_wire = mult32_res1_reg + mult32_res0_reg;


always@(posedge clk)
begin
if(reset_n == 1'b0)
begin
	mult32_res0_reg <= 36'sb0;
end
else
begin
	mult32_res0_reg <= mult0_reg * mult1_reg;
end
end

always@(posedge clk)
begin
if(reset_n == 1'b0)
begin
	mult32_res1_reg <= 36'sb0;
end
else
begin
	mult32_res1_reg <= mult2_reg * mult3_reg;
end
end

always@(posedge clk)
begin
if(reset_n == 1'b0)
begin
	result <= 70'sb0;
	result_valid <= 1'b0;
end
else
begin
	case(state_reg)
		idle:
			begin
				result_valid <= 1'b0;
				if(mult_en)
					begin
						result <= 70'sb0;
						A_reg <= A;
						B_reg <= B;
						mult0_reg <= A[34:17]; //18 bit signed
						mult1_reg <= B[34:17]; //18 bit signed
						mult2_reg <= {1'b0, A[16:0]}; //15 bit unsigned
						mult3_reg <= {1'b0, B[16:0]}; //15 bit unsigned
						state_reg <= state0;
					end
			end
		state0:
			begin
				mult1_reg <= {1'b0, B_reg[16:0]};
				mult3_reg <= B_reg[34:17];
				state_reg <= state1;
			end
		state1:
			begin
				result[69:34] <= mult32_res0_reg[35:0]; 
				result[33:0]  <= mult32_res1_reg[33:0];
				state_reg <= state2;
			end
		state2:
			begin
				result <= result + {{17{sum_wire[34]}},sum_wire,17'b0};
				result_valid <= 1'b1;
				state_reg <= idle;
			end
		default:
			begin
				state_reg <= idle;
				result_valid <= 1'b0;
			end
	endcase
end
end




endmodule

 

Еще раз огромное спасибо!

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


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

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

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

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

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

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

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

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

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

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