演算法中常常會到浮點數運算,而浮點數的處理常常是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 ...