FPGA对定点数的处理 作业

来源:互联网 发布:js农历转公历 编辑:程序博客网 时间:2024/05/22 00:11

作业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;endendmodule

这里写图片描述
用了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)beginsum2 = a + c;sum3 = a + {{4{1'b0}}, c};sum4 = a + {{4{c[3]}}, c};endendmodule


用了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)beginsum1  = a + b;mult1 = a * b;sum2  = a + b;mult2 = a * b;mult3 = a * b;endendmodule

这里写图片描述
用了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) beginsum1 = a[3:0]+b[3:0];sum2 = a[7:4]+b[7:4]+ sum1[4];sum ={sum2,sum1};mult= a*b;endendmodule

本代码中规定,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,与仿真结果一致。

0 0