Jump to content
    

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

может кто подскажет vhdl код 32-битного умножителя и сумматора стандарта ieee-754

Share this post


Link to post
Share on other sites

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

к Меге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:

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...