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

вычисления с плавающей точкой

Когдато задался целью приклеить умножитель

к Меге128. Синтезировал в Synplify7.5.

Занимало 15% от Spartan2-200.

До отладки дело не дошло, но тестбенч в ModelSim грубых ошибок

не выявил (хотя голову на отсечение не дам, давно было).

 

 

 

module FMULT_module(inA, inB, outY, clc);

input [31:0] inA;

input [31:0] inB;

output [31:0] outY;

input clc;

 

 

reg [31:0] outY;

reg [8:0] Exponenta;

reg [8:0] Exponenta1;

reg [7:0] ExpS1;

reg [7:0] ExpS2;

reg [47:0] Mantisa;

reg HbitA;

reg HbitB;

reg Hbit;

reg bitMaxA;

reg bitMinA;

reg bitMaxB;

reg bitMinB;

 

reg Underflow;

reg Overflow;

reg SigExp;

 

/*-------------------------------------

bit 31 - S

bits 30:23 - EXP

bits 22:0 - MANTISA

X=(-1)^S * 2^(EXP-127) * 1.MANTISSA

-------------------------------------*/

 

always @(posedge clc)

begin

outY[31] = inA[31] ^ inB[31]; //signed of member

ExpS1=inA[30:23]-8'd127;

ExpS2=inB[30:23]-8'd127;

 

Exponenta=$signed(ExpS1)+$signed(ExpS2);

 

Hbit = Overflow | Underflow;

Mantisa=$unsigned({1'b1,inA[22:0]}) * $unsigned({1'b1,inB[22:0]});

 

SigExp=Exponenta[8];

Exponenta1=Exponenta[7:0] ^ 8'hff;

Exponenta1=Exponenta1 + 1;

 

if(SigExp)

begin

if(Exponenta1[7:0]>8'd127)

begin

Exponenta=8'h81;

outY[22:0]=23'h0;

end

else

case(Mantisa[47:46])

2'b01 :

begin

outY[22:0]={Mantisa[45:23]};

end

2'b10 :

begin

outY[22:0]={Mantisa[45:23]};

outY[22:0]={1'b0,Mantisa[45:24]};

Exponenta=Exponenta + 8'h01;

end

2'b11 :

begin

outY[22:0]={Mantisa[46:24]};

Exponenta=Exponenta + 8'h01;

end

endcase

 

end

else

begin

if(Exponenta[7:0]>8'd127)

begin

Exponenta=8'h80;

outY[22:0]=23'h0;

end

else

case(Mantisa[47:46])

2'b01 :

begin

outY[22:0]={Mantisa[45:23]};

end

2'b10 :

begin

outY[22:0]={1'b0,Mantisa[45:24]};

Exponenta=Exponenta + 8'h01;

end

2'b11 :

begin

outY[22:0]={Mantisa[46:24]};

Exponenta=Exponenta + 8'h01;

end

endcase

end

 

Exponenta=$signed(Exponenta)+$signed(8'd127);

outY[30:23]=Exponenta[7:0];

end

endmodule

:ph34r:

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


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

на www.opencores.org можно найти пример целого алу для плавающей точки

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


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

на www.opencores.org можно найти пример целого алу для плавающей точки

 

Тамашнюю АЛУ я не пробовал, но вот оотдельный умножитель (с опенкорс) занял у меня (дай бог памяти) половину сартана на 200т, и работало это хозяйство на 6МГц (описанный модуль ~ 30МГц тянет).

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


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

Сам использовал только для симуляции.

С частотой согласен. Но никто не мешает доработать алу(фпу) до конвейера. Дрегого можно было и не ожидать, т.к. там много математики(+,-,/,преобразование в целое и обратно).

Сейчас откомпилировал - 62% еп1с12.

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

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


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

Не спора ради, а флеймового продолжения.

Я связялся с написанием модуля:

1. просто интересно было

(жизнь инженера итак чмошна и безстрастна, зачем лишать себя единственной радости - созидания, пускай и слабомотивированного)

2. захочу, изменю разрядность мантиссы, экспоненты

(вдруг задумаю рекурсивный фильтр на невероятной скорости)

3. все таки свой блок проще расконвеерить

 

Как ни старался но вышесказанное опять звучит как вызывающее утверждение :)

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


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

Самому реализовывать можно и нужно, когда дело идет к реализации.

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

Относительно фильтров: на ftp Alterы есть бесплатная программа на tcl, которая синтезирует фильтры по заданным параметрам. Один недостаток - на ahdl.

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


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

на www.opencores.org можно найти пример целого алу для плавающей точки

 

Тамашнюю АЛУ я не пробовал, но вот оотдельный умножитель (с опенкорс) занял у меня (дай бог памяти) половину сартана на 200т, и работало это хозяйство на 6МГц (описанный модуль ~ 30МГц тянет).

:) А какой разрядности был умножитель с опенкорес,а то что-то сомнительно (мягко говоря) 100К экв. вентилей все же...:)

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


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

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

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

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

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

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

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

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

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

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