FPGA對定點數的處理 作業

作業1
• 使用二進制表示數字,是計算機科學中最基本的問題之一。
• 使用FPGA進行數學運算,本質上就是要把數學模型、公式,映射成數字電路。
• 用FPGA實現定點數運算,對於設計運算單元電路很重要。
• 請自行設計若干實驗,實現和驗證課堂上講過的關於定點數的知識,例如:
o 2補碼的溢出迴繞特性
o 不同長度的2補碼數據進行運算時,先進行符號擴展和數據對齊,然後再進行加、減法運算
o 乘法和加法對字長的影響,驗證2補碼整數的乘法和加法運算
o 定點數實驗,驗證帶小數位的定點數的乘加運算
• 仿真工具,可以使用Modelsim,或是Quartus的波形仿真,也可以使用Matlab輔助
• 仿真驗證通過之後,在Quartus裏面編譯一下電路,關注你的電路消耗了多少FPGA資源,這是很有用的經驗
• 請把完成的所有實驗內容寫在一篇博客裏,文檔儘量條理清楚,便於教師閱讀
實驗1 二補碼的溢出迴繞特性
當輸入和輸出數據都是有符號數時將採用補碼加法器。當加法結果過大,會溢出迴繞。
代碼:

module buma (
  a  ,
  b  ,
  c  );
input signed  [2:0]a;
input signed  [2:0]b;
output signed [2:0]c;
reg    [2:0]c;
always @(a or b)
begin
   c = a + b;
end
endmodule

這裏寫圖片描述
用了9個引腳,3個邏輯單元,3個組合函數塊。
這裏寫圖片描述

輸出c爲3位,表示範圍是-4到3,。通過仿真結果看出,當和的結果超出範圍時,結果會溢出,迴繞到0。
實驗2 符號擴展和數據對齊
不同長度的2補碼數據進行運算時,先進行符號擴展和數據對齊,然後再進行加、減法運算。
代碼:

 module shiyaner(
   a,
   c,
sum2,
sum3,
sum4);
input signed [7:0] a ;
input signed [3:0] c;
output [7:0] sum2,sum3,sum4;
reg [7:0] sum2, sum3, sum4;
always @ (a or b or c)
begin
sum2 = a + c;
sum3 = a + {{4{1'b0}}, c};
sum4 = a + {{4{c[3]}}, c};
end
endmodule


用了36個引腳,16個邏輯單元,16個組合函數塊。
這裏寫圖片描述
根據仿真結果看出,sum2和sum4的二進制完全相同,和sum3不同。
這裏寫圖片描述
a和c都爲正數時,sum2、sum3、sum4的十進制值相等,但當c爲負數時,sum2和sum4的十進制值相等,與sum3的值不同,sum3爲a和c的絕對值相加的結果。所以,有符號數相加但位數不同時,需對位數不足的數進行位擴展,並且需要用符號爲在高位進行擴展,使想家的兩數位數相同。
實驗三
乘法和加法對字長的影響,驗證2補碼整數的乘法和加法運算
代碼:

module shiyaner(
   a,
   b,
   sum1,
   mult1,
    sum2,
   mult2,
    mult3);
input signed [3:0] a;
input signed [3:0] b;
output [3:0] sum1,mult1;
output [4:0] sum2;
output [7:0] mult3;
output [6:0] mult2;
reg [3:0]  sum1,mult1;
reg [4:0]  sum2;
reg [6:0]  mult2;
reg [7:0]  mult3;
always @ (a or b)
begin
sum1  = a + b;
mult1 = a * b;
sum2  = a + b;
mult2 = a * b;
mult3 = a * b;
end
endmodule

這裏寫圖片描述
用了36個引腳,38個邏輯單元,38個組合函數塊。

這裏寫圖片描述
sum1和sum2對比:sum2運算結果正確,sum1錯誤,得出結論,兩個n位的數相加,它們的和需要n+1位才能保證結果正確。
mult1和mult2和mult3對比:mult2運算結果正確,mult1錯誤,得出結論,兩個n位的數相乘,它們的積需要2n位才能保證所有結果正確,其實,除了-8和-8的積這種特殊情況,結果只需要2n-1位。
實驗四
定點數實驗,驗證帶小數位的定點數的乘加運算
代碼:

module shiyaner ( 
  a,
  b,
  sum,
  mult);
input [7:0] a,b;
output [8:0] sum;
output [15:0]mult;
reg [8:0] sum;
reg [15:0]mult;
reg [3:0]sum1;
reg [4:0]sum2;
always @ (a or b) 
begin
sum1 = a[3:0]+b[3:0];
sum2 = a[7:4]+b[7:4]+ sum1[4];
sum ={sum2,sum1};
mult= a*b;
end
endmodule

本代碼中規定,a的高四位爲整數位,低四位是小數位。和的高五位是整數部分,低四位是小數部分。乘積的低8位是小數部分,高8位是整數部分。
verilog中不能直接識別小數,但小數計算有一定規律。小數加法需要對準小數點,即整數和整數相加,小數和小數相加。
乘法運算不需要對齊小數點,結果的小數位位數等於兩個乘數小數位數之和,對結果截取時只取高位不取低位。
這裏寫圖片描述
用了36個引腳,40個邏輯單元,40個組合函數塊。

這裏寫圖片描述
觀察結果,a和b都爲0011_0100時,化作十進制數是3.25,a+b=6.5,化作二進制爲00110_1000,和結果一致。a*b=10.5625,化作二進制爲1010_1001,與仿真結果一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章