Verilog 浮點數運算模組

2021-09-07 15:41:14 字數 1785 閱讀 9441

演算法中常常會到浮點數運算,而浮點數的處理常常是verilog初學中常常遇到的問題。以下將就乙個簡單的例子說明verilog中浮點數運算處理。

在jpeg影象壓縮時遇到色彩空間變換的問題,將ycbcr轉換到rgb會遇到浮點數的運算,這個實現複雜,以攝氏溫度轉換為華氏溫度為例  : f = c x 1.8  + 32

r = 1.164(y-16) + 1.596(cr-128) 

g = 1.164(y-16) - 0.391(cb-128) - 0.813(cr-128) 

b = 1.164(y-16) + 2.018(cb-128) 

module c2f( iclk,irstn,ic,of);

input  iclk;

input  irstn;

input[7:0]  ic;

output[10:0]  of;

reg[7:0] c;

reg[10:0] of;

always@(posedge iclk or negedge irstn)

begin 

if(!irstn) 

begin 

c <= 0;

of  <= 0;

end 

else

begin 

c   <= ic;   

of  <= c * 1.8 + 32;        // 直接處理,在ise中綜合時會報出錯 

end                            //error:xst:850 - "c2f.v" line 31: unsupported real constant. 

endendmodule 

以下為改正後的程式

module c2f( iclk,irstn,ic,of);

input  iclk;

input  irstn;

input[7:0]  ic;

output[10:0]  of;

reg[7:0] c;

reg[10:0] of;

reg[10:0] sum;

always@(posedge iclk or negedge irstn)

begin 

if(!irstn) 

begin 

//c <= 0;

of  <= 0;

sum  <= 0;

end 

else 

begin 

// c    <= ic;   

sum  <= ic * 7+ 128;

of   <= (sum >>2);      //實際是 近似計算:of=(ic*7+128)/4=ic*1.75+32,

end 

endendmodule 

功能**:

在t1時刻,輸入ic=0x0b=11攝氏度,在iclk上公升沿產生0x33=51華氏度[ of=(11*7+128)/4=51.25華氏度 的近似 ,精確實際應為:11*1.8+32=51.8華氏度

其中t6時刻,輸入ic=16(0x10)(攝氏溫度16度), 在iclk上公升沿計算:of=(16*7+128)/4=60(0x3c), 與精確計算 f = c x 1.8  + 32=16*1.8+32=60.8,即攝氏16度對應華氏60.8,存在計算誤差。

浮點數運算

浮點數運算的公式 n m re n代表浮點數 m代表尾數 r代表基數 e代表指數 所謂浮點數就是類似我們高中學的科學計數法 比如 1000 就表示為 1.0 103 那麼浮點型計算就是兩個用科學計數法表示的數之間進行的計算 例如 1.0 102 1.19 103 該如何計算 步驟 1.對階 所謂對階...

浮點數運算

今天學習了浮點數運算 加減乘除 浮點數運算主要包括兩部分 指數運算和尾數運算。在ieee754標準下,指數運算就是階碼的運算,類似於無符號數運算。尾數運算是原碼運算。之前一直很疑惑為什麼前面的教材在介紹原碼運算 加減乘除 所舉的例子都是小數運算。現在猜想那部分內容可能只是為了浮點數運算做鋪墊,這裡才...

php 浮點數運算

php r echo 0.1 0.7 0.8 true false 了解浮點運算的都不難理解以上 執行時會得到false 這是因為很多的10進製數都不能精確的轉成2進製,或如果要精確轉換的話需要的二進位制數太長,會捨棄掉末尾部分,只儲存一定的精度。比如0.1 十進位制 0.0001100 1100 ...