LINUX.ORG.RU

int to float

 


0

1

Попросили написать на верилоге конвертер инт во флоат.
Собственно, написал, но есть проблемы:
1й вариант:

module int2float(
input_data,
output_data
);
//---Input pins---
input [15:0] input_data;
//---Output pins---
output [31:0] output_data;
//---Registers---
reg [31:0] out_data_reg;
integer exponent;

assign output_data = out_data_reg;

always @ (input_data)
 begin
  out_data_reg = 0;
  out_data_reg[31] = input_data[15];
  for(exponent=15; exponent<0; exponent=exponent-1)
   begin

   if(out_data_reg[exponent] == 0)
    continue;
   else
    break;
   end
  out_data_reg[30:23] = exponent + 127;
  out_data_reg[22:22-1-exponent] = input_data[exponent-1:0];
 end

endmodule
Тут оно ругается на то, что exponent - не константа. Я его, конечно, понимаю, но есть ли возможность обойти?
2й вариант(говнокод):
module int2float(
input_data,
output_data
);
//---Input pins---
input [15:0] input_data;
//---Output pins---
output [31:0] output_data;
//---Registers---
reg [31:0] out_data_reg;
//reg [3:0] exponent;
reg [15:0] buffer;
integer index;
integer found_one;
integer exponent;

assign output_data = out_data_reg;

always @ (input_data or output_data)
 begin
  out_data_reg = 0;
  found_one = 0;
  index = 15;
  buffer = 0;
  exponent = 15;
  out_data_reg[31] = input_data[15];
  for(exponent=15; exponent<0; exponent=exponent-1)
  begin
   if(input_data[exponent] == 0 && found_one == 0)
    continue;
   else if(input_data[exponent] == 1 && found_one == 0)
    begin
     found_one = 1;
     buffer[index] = input_data[exponent];
     index = index - 1;
    end
   else if(input_data[exponent] == 1 && found_one == 1)
    begin
     buffer[index] = input_data[exponent];
     index = index - 1;
    end
   else if(input_data[exponent] == 0 && found_one == 1)
    begin
     buffer[index] = input_data[exponent];
     index = index - 1;
    end
  end
  out_data_reg[30:23] = exponent + 127;
  out_data_reg[22:7] = buffer[15:0];
 end

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

Deleted

Эти коды вообще о чем? Они оба бредовые.

http://opencores.org/project,fpu100 не?

Оно хоть и синтезируется, но с нулевым количеством элементов. Не могу понять почему.

Нулевое количество элементов поскольку код ничего не делает, ваш КО.

ebantrop
()
Ответ на: комментарий от ebantrop

Эти коды должны раскидывать 16 битовый знаковый целый инт в сингл пресижн флоат. Код писал по алгоритму, который нашел на тытрубе: http://www.youtube.com/watch?v=iQFG7sAa7i4
Буду признателен за разъяснения, почему код ничего не делает.

Deleted
()
Ответ на: комментарий от Deleted

Буду признателен за разъяснения, ...

Э... Ты на ХДЛе что нибудь когда делал? Глядя на код в меня закрались сильные сомнения.

почему код ничего не делает.

Я даже теряюсь с чего начать. Тут ужасна каждая строчка. Ну вот хотя бы что по твоему делает это: out_data_reg[30:23] = exponent + 127; в теле цикла?

ebantrop
()
Ответ на: комментарий от ebantrop

Не-а, не делал, первые потуги.
Вообще, это не тело цикла, это так в верилоге объявляется комбинационная логика, если я правильно понял.
Тем более, always @ () же не цикл, а последовательное исполнение команд.

Deleted
()

слушай, напиши на си и натрави на него какой-нить Catapult C. Реально лучше получится чем все то, что ты набыдлокодишь.

demidrol ★★★★★
()
Ответ на: комментарий от Deleted

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

Тем более, always @ () же не цикл, а последовательное исполнение команд.

Нет тут никакого исполнения команд. Все строки исполняются параллельно.

ebantrop
()

хм... никогда я раньше на верилоге не писал, да и вообще на подобных языках, но задачка заинтересовала :)

погуглил синтаксис, соорбразил такой вот быдлокод:

module tt(
    input [15:0] i_short,
    output [31:0] o_float
    );

reg [31:0] out_reg;
reg [15:0] m;
reg c, s;
integer i, lz;

assign o_float = out_reg;

always @(i_short) begin
	if (i_short == 0) begin
		out_reg = 0;
	end
	else begin
		if (i_short[15] == 1) begin
			c = ~i_short[0];
			m[0] = i_short[0];
			for (i = 1; i < 16; i = i + 1) begin
				m[i] = c ^ ~i_short[i];
				c = c & (c ^ m[i]);
			end
		end
		else begin
			m = i_short;
		end
		for (i = 0; i < 16; i = i + 1) begin
			if (m[i] == 1)
				lz = 15 - i;
		end
		out_reg[31] = i_short[15];
		out_reg[30:23] = 142 - lz;
		out_reg[22:8] = m[14:0] << lz;
	end
end

endmodule
arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.