当前位置:文档之家› 单精度浮点乘法器

单精度浮点乘法器

单精度浮点乘法器
单精度浮点乘法器

EDA/SOPC课程设计报告题目:单精度浮点乘法器

姓名:张恺

学号:120260230

同组人:刘龙

指导教师:王晨旭

成绩:

目录

目录................................................................................................................................................... II 第1章课程设计的要求 . (1)

1.1 课程设计的目的 (1)

1.2 课程设计的条件 (1)

1.3 课程设计的要求 (1)

第2章课程设计的内容 (2)

2.1 设计思路 (2)

2.1.1 符合IEEE-754标准的单精度浮点乘法器规格 (2)

2.1.2 操作数类型 (2)

2.1.3 运算规则 (3)

2.1.4 逻辑门级框图 (3)

2.2 软件流程图 (4)

2.3 HDL代码阐述 (6)

2.4 Modelsim验证 (10)

2.4.1 验证代码 (10)

2.4.2 验证波形 (12)

2.5 硬件调试 (12)

2.5.1 基本说明 (12)

2.5.2 具体操作 (13)

2.6 虚拟机下的DC综合 (17)

2.7 虚拟机下的SDF反标仿真 (19)

第3章课程设计的心得 (20)

第1章课程设计的要求

1.1 课程设计的目的

●通过课堂所讲授的内容以及私下查阅资料,自主完成课程设计的题目,提高编

程能力,培养用计算机解决实际问题的能力,积累调试程序的经验,更好的消化

老师课堂所讲授的内容,对Verilog这种语言也有了更深的了解;

●掌握较大工程的基本开发技能;

●培养综合运用Modelsim,ISE,Debussy工具进行硬件开发的能力;

●培养数字系统设计的基本能力;

●通过课设积累起的编程以及硬件的能力对于今后的考研抑或是找工作都有非常实

际性的效果;

1.2 课程设计的条件

●设计条件1:gVim编辑器以及Mentor公司开发的FPGA仿真软件Modelsim;

●设计条件2:Xilinx公司开发的硬件设计工具ISE以及Xilinx公司的开发板;

●设计条件3:虚拟机环境下的Linux系统具有的Design Compiler工具;

●设计条件4:虚拟机环境下的Linux系统具有的SDF工具以及Debussy工具;

1.3 课程设计的要求

●设计要求1:能够在Modelsim工具下正确的完成程序的编译以及成功的实现波

形的仿真;

●设计要求2:能够在ISE工具下正确的完成程序的综合以及合理的绑定管脚并成

功的将程序下载到开发板里,在开发板中实现程序的功能;

●设计要求3:能够在虚拟机的Linux系统下采用Design Compiler完成逻辑综

合,并且评估其时序面积;

●设计要求4:能够在虚拟机的Linux系统下完成SDF反标仿真;

第2章课程设计的内容

2.1 设计思路

对于单精度浮点乘法器这一课程题目,重点在于正确理解IEEE-754标准,设计出符合IEEE-754标准的单精度浮点乘法器。

2.1.1 符合IEEE-754标准的单精度浮点乘法器规格

单精度浮点数32位由高位至低位可划分为1位符号位(s),8位阶码(e),23位尾数(f)。0

图2-1 单精度浮点数的规格

2.1.2 操作数类型

表2-1

说明:

1、NaN和任何数相乘都为NaN;

2、无穷和0相乘为NaN,和其他数相乘都为无穷;

3、0和替他数相乘都为0;

4、正常数和正常数相乘再对他们的乘积进行判断(以上的每一种情况都是在其前面情况不成立情况下进行的);

5、如flout_a与flout_b中有至少一个异常,那么flout_c的尾数部分为优先级高的异常情况的尾数部分,无穷和0相乘特殊,指定其尾数为23’b01,0的符号位为0,其他为sign_a^sign_b;

2.1.3 运算规则

两个规格化的单精度浮点数相乘时,运算规则如下:(1)符号位相异或得结果;(2)阶码为e=(e1-127)+(e2-127)+127;(3)尾数为两个尾数都扩展一位后再相乘,得出的为一个48位数cf1,取出cf1的第24位至第48位赋给cf3,即cf3=cf1[47:23],此时若cf1[22]=0,舍去第1位至23位,若cf1[22]=1,向第24位进1,并且舍去第1位至第23位;尾数规格化:判断cf3[24]是否为1,若cf3[24]=1,cf3右移1位,阶码位加1,若cf3[24]=0,则不用进行规格化;最后尾数取cf3[22:0]。

2.1.4 逻辑门级框图

图2-2 逻辑门级框架简图

2.2 软件流程图

2.3 HDL代码阐述

module mux(flout_a,flout_b,clk,en,rst,flout_c,yichu);

module mux(flout_a,flout_b,clk,en,rst,flout_c,yichu);

input[31:0] flout_a;

input[31:0] flout_b; //设置两个输入的单精度浮点数input clk; //时钟信号

input en; //使能信号

input rst; //复位信号

output[31:0] flout_c; //输出的单精度浮点数

output[1:0] yichu; //溢出信号

reg[31:0] flout_c;

reg[1:0] yichu; //变量类型声明

reg sign_a,sign_b,sign_c; //符号位

reg [7:0]zhishu_a,zhishu_b,zhishu_c; //阶码

reg[23:0]zz_a,zz_b;

reg[47:0]zz_c; //尾数

reg jiayi; //中间变量

always@(posedge clk or negedge rst)begin

if(~rst)begin

sign_a<=0;

sign_b<=0;

zhishu_a<=0;

zhishu_b<=0;

zz_a<=0;

zz_b<=0;

end //输入复位模块

else if (en)begin

sign_a<=flout_a[31];

sign_b<=flout_b[31];

zhishu_a<=flout_a[30:23];

zhishu_b<=flout_b[30:23];

zz_a<={1'b1,flout_a[22:0]};

zz_b<={1'b1,flout_b[22:0]};

end //使能赋初值模块

end

always@(sign_a or sign_b or zhishu_a or zhishu_b or zz_a or zz_b)begin

if(~rst)begin

zhishu_c=0;

zz_c=0;

sign_c=0;

yichu=2'b01;

end //输出复位模块

else begin

if(zhishu_a==255&&(|zz_a[22:0]))begin

zhishu_c=zhishu_a;

yichu=2'b11;

zz_c[46:23]=zz_a;

sign_c=sign_a^sign_b;

end //数a不是一个数与数b任何数相乘都是不是一个数else if(zhishu_b==255&&(|zz_b[22:0]))begin

zhishu_c=zhishu_b;

yichu=2'b11;

zz_c[46:23]=zz_b;

sign_c=sign_a^sign_b;

end //数b不是一个数与数a任何数相乘都是不是一个数else if(zhishu_a==255&&(~(|zz_a[22:0])))begin

if(zhishu_b==255&&(~(|zz_b[22:0])))begin

zhishu_c=zhishu_a;

yichu=2'b10;

zz_c[46:23]=zz_a;

sign_c=sign_a^sign_b;

end //数a无穷与数b无穷相乘还是无穷

else if(zhishu_b==0) begin

zhishu_c=zhishu_a;

yichu=2'b11;

zz_c[46:23]=1'b1;

sign_c=sign_a^sign_b;

end //数a无穷与数b0相乘为不是一个数

else if(zhishu_b<255&&zhishu_b>0) begin

zhishu_c=zhishu_a;

yichu=2'b10;

zz_c[46:23]=zz_a;

sign_c=sign_a^sign_b;

end //数a无穷与数b规格化数相乘为无穷end

else if(zhishu_b==255&&(~(|zz_b[22:0])))begin

if(zhishu_a==0) begin

zhishu_c=zhishu_b;

yichu=2'b11;

zz_c[46:23]=zz_b+1'b1;

sign_c=sign_a^sign_b;

end //数b无穷与数a0相乘为不是一个数else if(zhishu_a<255&&zhishu_a>0)begin

zhishu_c=zhishu_b;

yichu=2'b10;

zz_c[46:23]=zz_b;

sign_c=sign_a^sign_b;

end //数b无穷与数a规格化数相乘为无穷end

else if((zhishu_a==0)||(zhishu_b==0))begin

yichu=2'b00;

zhishu_c=8'b00000000;

sign_c=0;

if(~(|zhishu_a))begin

zz_c[46:23]=zz_a;

end

else begin

zz_c[46:23]=zz_b;

end

end //数a0与数b0相乘还为0

else begin

sign_c=sign_a^sign_b;

zhishu_c=zhishu_a+zhishu_b-127;

zz_c=zz_a*zz_b;

if(zz_c[22]==1)begin

jiayi=1'b0;

zz_c[47:23]=zz_c[47:23]+1'b1;//zz_c[45:23]

end

else if(zz_c[47]==1)begin

zz_c[47:23]={1'b0,zz_c[47:24]};

jiayi=1'b1;

end

else begin

jiayi=1'b0;

zz_c[47:23]=zz_c[47:23];//zz_c[45:23]

end

if(jiayi) begin

zhishu_c=zhishu_c+1;

end // 数a规格化数与数b规格化数相乘按照ieee-754标准进行计算if(zhishu_c>=255&&(|zz_c))begin

zhishu_c=8'hff;

yichu=2'b11;

end //得出的结果为不是一个数

if(zhishu_c>=255&&(~(|zz_c)))begin

zhishu_c=8'hff;

yichu=2'b10;

end //得出的结果为无穷

else if(zhishu_a+zhishu_b<=127)begin

yichu=2'b00;

zhishu_c=8'b00000000;

sign_c=0;

end //得出的结果为0

else begin

yichu=2'b01;

zhishu_c=zhishu_c;

end //得出的结果为规格化数

end

end

end

always@(posedge clk or negedge rst)begin

if(~rst)begin

flout_c[31]<=0;

flout_c[30:23]<=0;

flout_c[22:0]<=0;

end //输出结果的复位模块

else begin

flout_c[31]<=sign_c;

flout_c[30:23]<=zhishu_c;

flout_c[22:0]<=zz_c[45:23];

end //输出结果拼接

end

endmodule

2.4 Modelsim验证

2.4.1 验证代码

`timescale 1ns/100ps

module mux_tb();

reg [31:0]flout_a,flout_b;

reg clk,en,rst;

wire [31:0]flout_c;

wire yichu; //声明变量类型

mux dut(.flout_a(flout_a),

.flout_b(flout_b),

.clk(clk),

.en(en),

.rst(rst),

.flout_c(flout_c),

.yichu(yichu)); //与源程序的例化dut相连initial

clk=0;

always#20 clk=~clk; //设置时钟的变化

initial begin

flout_b=32'h00000001;

flout_a=32'h7f800000;

en=1;

rst=0;

#100;

rst=1;

#800000;

flout_b=32'h20000001;

flout_a=32'h7f800000;

#800000;

flout_b=32'h00000001;

flout_a=32'h7f800001;

#800000;

flout_b=32'h20000001;

flout_a=32'h7f800001;

#800000;

flout_b=32'h00000001;

flout_a=32'h20000001;

#800000;

flout_b=32'h20000001;

flout_a=32'h20000001;

#800000;

flout_b=32'h7f800000;

flout_a=32'h7f800000;

#800000;

flout_b=32'h7f800001;

flout_a=32'h7f800001;

#800000;

flout_b=32'h7f800001;

flout_a=32'h7f800000;

#800000;

flout_b=32'h0af800001;

flout_a=32'h20000001;

#800000; //设置输入变量,使能信号,复位信号随时间发生变化$stop;

//task delay;

// input [31:0]mum;

//repeat(num)@(posedge clk)begin

//repeat(100)@(posedge clk);

//end

//endtask

end

initial begin

$dumpfile("zk.vcd");

$dumpvars;

end //生成vcd文件

endmodule

2.4.2 验证波形

图2-5 Modelsim验证波形

2.5 硬件调试

2.5.1 基本说明

输入flout_a的其中6位,一位符号位,阶码位的前两位和尾数位的后三位;阶码的其他6位都设为1,尾数都设为0。输入flout_b的一位符号位,前两位阶码位和后三位尾数位;其余阶码位当chose=1时为全1 ,当chose=0时为全0,尾数的其它位为0。

以下为乘数的输入位规定:

表2-2

以下为被乘数的输入位规定:

表2-3

以下为根据以上标号组合而成的结果的形式:结果为2位溢出标志位,1位符号位,3位阶码位(前两位为阶码最高位,第三位为阶码最低位),后四位为尾数后四位。结果如下

表2-4

经验证开发板显示结果与上表格相同。

2.5.2 具体操作

1. 如图2-6所示,新建一个工程mux。

图2-6 新建工程

2. 如图2-7所示,向工程中添加mux_banzi.v。

图2-7 添加.v文件

3. 绑定管脚。

flout_a与flout_b以及chose,rst,en绑到15个输入开关上,flout_c以及yichu绑到10个灯上。

NET "flout_a[5]" IOSTANDARD = LVCMOS33;

NET "flout_a[4]" IOSTANDARD = LVCMOS33;

NET "flout_a[3]" IOSTANDARD = LVCMOS33;

NET "flout_a[2]" IOSTANDARD = LVCMOS33;

NET "flout_a[1]" IOSTANDARD = LVCMOS33;

NET "flout_a[0]" IOSTANDARD = LVCMOS33;

NET "flout_b[5]" IOSTANDARD = LVCMOS33;

NET "flout_b[4]" IOSTANDARD = LVCMOS33;

NET "flout_b[3]" IOSTANDARD = LVCMOS33;

NET "flout_b[2]" IOSTANDARD = LVCMOS33;

NET "flout_b[1]" IOSTANDARD = LVCMOS33;

NET "flout_b[0]" IOSTANDARD = LVCMOS33;

NET "flout_c[7]" IOSTANDARD = LVCMOS33;

NET "flout_c[6]" IOSTANDARD = LVCMOS33;

NET "flout_c[5]" IOSTANDARD = LVCMOS33;

NET "flout_c[4]" IOSTANDARD = LVCMOS33;

NET "flout_c[3]" IOSTANDARD = LVCMOS33;

NET "flout_c[2]" IOSTANDARD = LVCMOS33; NET "flout_c[1]" IOSTANDARD = LVCMOS33; NET "flout_c[0]" IOSTANDARD = LVCMOS33; NET "yichu[1]" IOSTANDARD = LVCMOS33; NET "yichu[0]" IOSTANDARD = LVCMOS33;

NET "flout_a[5]" LOC = P4;

NET "flout_a[4]" LOC = P3;

NET "flout_a[3]" LOC = R3;

NET "flout_a[2]" LOC = T1;

NET "flout_a[1]" LOC = T3;

NET "flout_a[0]" LOC = U2;

NET "flout_b[5]" LOC = V7;

NET "flout_b[4]" LOC = R5;

NET "flout_b[3]" LOC = R6;

NET "flout_b[2]" LOC = R7;

NET "flout_b[1]" LOC = U8;

NET "flout_b[0]" LOC = U9;

NET "flout_c[7]" LOC = P2;

NET "flout_c[6]" LOC = R2;

NET "flout_c[5]" LOC = U1;

NET "flout_c[4]" LOC = P5;

NET "flout_c[3]" LOC = R1;

NET "flout_c[2]" LOC = V1;

NET "flout_c[1]" LOC = U3;

NET "flout_c[0]" LOC = V4;

NET "yichu[1]" LOC = V9;

NET "yichu[0]" LOC = T8;

NET "chose" LOC = V2;

NET "en" LOC = U4;

NET "rst" LOC = V5;

NET "clk" LOC = E3;

NET "chose" IOSTANDARD = LVCMOS33;

NET "clk" IOSTANDARD = LVCMOS33;

NET "en" IOSTANDARD = LVCMOS33;

NET "rst" IOSTANDARD = LVCMOS33;

4. 综合、翻译、适配。

点击Implement Design,选择run 进行综合、翻译等。

当进行到Map时出现了错误,原因大概是总线时钟不能由下面的一排开关控制,因此经过查阅资料,将“NET "clk" CLOCK_DEDICATED_ROUTE = FALSE”这句话存入top.ucf中,即可将错误降低为警告,继续运行。或将时钟绑定至E3管脚此问题得以解决。

5. 下载程序。

将板子通过USB 供电,并将并口与计算机相连,打开板子电源开关。选择所要下载的.jed 文件,待芯片成为绿色,右击芯片,选择Program,当出现program succeed,程序已经下载到板子的芯片上,就可以通过改变输入来观察输出跟料想的是否一样。

2.6 虚拟机下的DC综合

综合出来的面积如图2-8:

图2-8 “report_area”

综合得到的时序如图2-9:

图2-9 “report_timing”

位单精度浮点数的IEEE表示法

32位单精度浮点数的IEEE表示法 float 共计32位(4字节) 31位是符号位,1表示该数为负,0反之 30~23位,一共8位是指数位(-128~127) 22~ 0位,一共23位是尾数位,尾数的编码一般是原码和补码 IEEE标准从逻辑上用三元组{S,E,M}表示一个数N,如下图所示: n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一串二进制位。其中, S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n<0时,s=1。E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也可正可负。 M(mantissa)表示N的尾数位,恰好,它位于N末尾。M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。

IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度。前两者正好对应C语言里头的float、double或者FORTRAN里头的real、double精度类型。限于篇幅,本文仅介绍单精度、双精度浮点格式。★单精度:N共32位,其中S占1位,E占8位,M占23位。 ★双精度:N共64位,其中S占1位,E占11位,M占52位。 值得注意的是,M虽然是23位或者52位,但它们只是表示小数点之后的二进制位数,也就是说,假定 M为“010110011...”, 在二进制数值上其实是“.010110011...”。而事实上,标准规定小数点左边还有一个隐含位,这个隐含位通常,哦不,应该说绝大多数情况下是1,那什么情况下是0呢?答案是N 对应的n非常小的时候,比如小于 2^(-126)(32位单精度浮点数)。不要困惑怎么计算出来的,看到后面你就会明白。总之,隐含位算是赚来了一位精度,于是M对应的m最后结果可能是"m=1.010110011...”或者“m=0.010110011...” 计算e、m 首先将提到令初学者头疼的“规格化(normalized)”、“非规格化(denormalized)”。掌握它以后你会发现一切都很优雅,更美妙的是,规格化、 非规格化本身的概念几乎不怎么重要。请牢记这句话:规格化与否全看指数E! 下面分三种情况讨论E,并分别计算e和m: 1、规格化:当E的二进制位不全为0,也不全为1时,N为规格化形式。此时e被解释为表示偏置(biased)形式的整数,e值计算公式如下图所示: 上图中,|E|表示E的二进制序列表示的整数值,例如E为"10000100",则 |E|=132,e=132-127=5 。 k则表示E的位数,对单精度来说,k=8,则bias=127,对双精度来说,k=11,则bias=1023。 此时m的计算公式如下图所示: 标准规定此时小数点左侧的隐含位为1,那么m=|1.M|。如M="101",则 |1.M|=|1.101|=1.625,即 m=1.625 2、非规格化:当E的二进制位全部为0时,N为非规格化形式。此时e,m 的计算都非常简单。

单精度浮点数的转换和解析

1 单精度浮点数的转换和解析 工业现场通信经常遇到浮点数解析的问题,如果需要自己模拟数据而又不懂浮点数解析的话会很麻烦!很久以前根据modbus 报文格式分析得到的,供大家参考。 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 较高的有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。 浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下: 地址 +0 +1 +2 +3 内容0xC1 0x48 0x00 0x00 浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转 换。 浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表 所列的那样分开,例如: 地址 +0 +1 +2 +3 格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 二进制 11000001 01001000 00000000 00000000 十六进制 C1 48 00 00 从这个例子可以得到下面的信息: 符号位是1 表示一个负数 幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。 尾数是后面的二进制数10010000000000000000000

单精度浮点数与机器精度解析

单精度浮点数与机器精度解析 一、单精度浮点数 先来简单了解一下浮点数在计算机中的存储方式。根据IEEE 754标准,单精度浮点数格式如下(所有位取0): 各部分解释 单精度浮点数有32个二进制位,左侧是高位,右侧是低位。最高位被指定为符号位,0代表正数,1代表负数。指数部分将是2的幂次,其编码值(即上表指数部分对应的八个二进制位)规定为指数的实际值加上偏移值2^7-1=127,这是为了避免负数,将[-127, 128]映射到[0, 255],这样指数部分编码就可以简单地编排为[00000000, 11111111]。例如指数部分为00001000,十进制为8。那么其所代表的实际指数是8-127=-119,即要乘上2-119。最后23位尾数是不包含整数位的实际有效小数位。规约数的整数位是1,非规约数的整数位是0。 规约形式的浮点数与非规约形式的浮点数 指数部分的编码值在[1, 2e-2]内,且尾数部分的整数位是1,这样的浮点数被称为规约形式的浮点数。 指数部分的编码值为0,尾数非零,这样的浮点数被称为非规约形式的浮点数。 规约浮点数的尾数∈[1, 2),而非规约浮点数的尾数∈(0, 1)。需要注意,非规约数指数编码为00000000,但指数实际值是-126,而非-127。非规约浮点数被IEEE 754-1985标准采用是因为它的渐进式下溢出,而规约浮点数将导致突然式下溢出,具体原理不再展开。 实际计算 设符号位为s。sign(s)确定正负:sign(0)=1,sign(1)=-1;指数部分为e;尾数部分为f。用(N)2表示二进制数N。 规约形式:sign(s)*2e-127*(1.f)2 非规约形式:sign(s)*2-126*(0.f)2 特殊值和极值

单精度浮点乘法器的FPGA实现

32位单精度浮点乘法器的FPGA实现 摘要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码,和Wallace 树结构, 提高了乘法器的速度。本文使用Altera Quartus II 4.1仿真软件, 采用的器件是EPF10K100EQ 240 -1, 对乘法器进行了波形仿真, 并采用0.5CMOS工艺进行逻辑综... 摘要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码,和Wallace 树结构, 提高了乘法器的速度。本文使用Altera Quartus II 4.1仿真软件, 采用的器件是EPF10K100EQ 240 -1, 对乘法器进行了波形仿真, 并采用0.5CMOS工艺进行逻辑综合。 关键词: 浮点乘法器; Boo th 算法; W allace 树; 波形仿真 随着计算机和信息技术的快速发展, 人们对微处理器的性能要求越来越高。乘法器完成一次乘法操作的周期基本上决定了微处理器的主频, 因此高性能的乘法器是现代微处理器中的重要部件。本文介绍了32 位浮点阵列乘法器的设计, 采用了改进的Booth 编码, 和Wallace树结构, 在减少部分积的同时, 使系统具有高速度, 低功耗的特点, 并且结构规则, 易于VLSI的实现。 1 乘法计算公式 32 位乘法器的逻辑设计可分为: Booth编码与部分积的产生, 保留进位加法器的逻辑, 乘法阵列的结构。 1.1 Booth编码与部分积的逻辑设计 尾数的乘法部分,本文采用的是基4 Booth编码方式, 如表1。首先规定A m和B m 表示数据A和B的实际尾数,P 表示尾数的乘积, PP n表示尾数的部分积。浮点32 位数, 尾数是带隐含位1 的规格化数, 即: A m=1×a22a21….a0和B m = 1 ×b22b21.…b0, 由于尾数全由原码表示,相当于无符号数相乘, 24 × 24 位尾数乘积P 的公式为:

32位浮点数与十进制转化

1 32位IEE754浮点格式 对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数), 1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示; 2、第30~23 bit为幂数,其读数值用e表示; 3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x; 十进制转浮点数的计算方法: 则按照规定,十进制的值用浮点数表示为:如果十进制为正,则s = 0,否则s = 1; 将十进制数表示成二进制,然后将小数点向左移动,直到这个数变为1.x的形式即尾数,移动的个数即为指数。为了保证指数为正,将移动的个数都加上127,由于尾数的整数位始终为1,故舍去不做记忆。对3.141592654来说, 1、正数,s = 0; 2、3.141592654的二进制形式为正数部分计算方法是除以二取整,即得11,小数部分的计算方法是乘以二取其整数,得0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为11.0010 0100 0011 1111 0110 1010 1; 3、将小数点向左移一位,那么它就变为1.1001 0010 0001 1111 1011 0101 01,所以指数为1+127=128,e = 128 = 1000 0000; 4、舍掉尾数的整数部分1,尾数写成0.1001 0010 0001 1111 1011 0101 01,x = 921FB6 5、最后它的浮点是表示为0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA //-------------------------------------------- // 十进制转换为32位IEE754浮点格式 //-------------------------------------------- void ConvertDexToIEE754(float fpointer,ModRegisterTpyedef *SpModRegister) { double integer,decimal; unsigned long bininteger,bindecimal; Uint8 _power,i; decimal = modf(fpointer,&integer); if(decimal || integer) { bindecimal = decimal * 0x800000; //2^23 while((bindecimal & 0xff800000) > 0) bindecimal >>= 1; if(integer > 0) { bininteger = integer; for(i=0;i<32;i++) //计算整数部分的2的幂指数 { if(bininteger&0x1) _power = i; bininteger >>= 0x1; } bininteger = integer; bininteger &= ~(0x1 << _power); //去掉最高位的1 if(_power >= 23) //如果幂指数>23 则舍弃小数位部分 { bininteger >>= (_power-23); bindecimal = 127+_power; bininteger |= bindecimal << 23; } else { bininteger <<= (23 - _power); bindecimal >>= _power; bininteger |= bi ndecimal; bindecimal = 127+_power; bininteger |= bindecimal << 23; } } else if(integer == 0) { bindecimal <<= 9; _power = 0; bininteger = bindecimal; while(bininteger == ((bindecimal<<1)>>1)) { _power++; bindecimal <<= 0x1; bininteger = bindecimal; }

32位浮点数转换为十进制

流量计计算机通过485端口以MODBUS协议把内部IEEE32位浮点数传送到DCS的数据经过研究试验,其数据格式如下 数据请求依次为:十六进制 从站地址:01;读命令:03;数据起始高位地址:0F;数据起始低位地址:A0;(0FA0=4000即地址44001);数据长度高位:00;数据长度低位:28;(0028=40即40个地址);CRC效验码:46,E2 数据应答格式: 从站地址:01;读命令反馈:03;数据长度:50;第一个地址:69;C0;48;A9;第二个地址:C5;00;48;A2;以下类推,直到最后两位CRC:E8;86 第一个地址:69;C0;48;A9是如何换算为346958的呢? 流量计发送的是IEEE标准的32位浮点数 首先要把69;C0;48;A9进行高低16位交换变成:48;A9;69;C0 变为32位二进制数:01001000 10101001 01101001 11000000 其中最高位为0,代表是正数 接下来的八位:10010001变成十进制是145,根据IEEE规范应减去127得18,这是小数点右移的位数; 剩下的23位是纯二进制小数即:0.0101001 01101001 11000000 加1后得1.0101001 01101001 11000000 小数点右移18位后得10101001 01101001 110.00000 变为十进制得346958 其它地址的32位浮点数计算方法同上 标题:《IEEE754 学习总结》 发信人:Vegeta 时间:2004-11-11,10:32 详细信息: 一:前言 二:预备知识 三:将浮点格式转换成十进制数 四:将十进制数转换成浮点格式(real*4) 附:IEEE754 Converte 1.0介绍 一:前言

单精度浮点乘法器

EDA/SOPC课程设计报告题目:单精度浮点乘法器 姓名:张恺 学号:120260230 同组人:刘龙 指导教师:王晨旭 成绩:

目录 目录................................................................................................................................................... II 第1章课程设计的要求 . (1) 1.1 课程设计的目的 (1) 1.2 课程设计的条件 (1) 1.3 课程设计的要求 (1) 第2章课程设计的内容 (2) 2.1 设计思路 (2) 2.1.1 符合IEEE-754标准的单精度浮点乘法器规格 (2) 2.1.2 操作数类型 (2) 2.1.3 运算规则 (3) 2.1.4 逻辑门级框图 (3) 2.2 软件流程图 (4) 2.3 HDL代码阐述 (6) 2.4 Modelsim验证 (10) 2.4.1 验证代码 (10) 2.4.2 验证波形 (12) 2.5 硬件调试 (12) 2.5.1 基本说明 (12) 2.5.2 具体操作 (13) 2.6 虚拟机下的DC综合 (17) 2.7 虚拟机下的SDF反标仿真 (19) 第3章课程设计的心得 (20)

第1章课程设计的要求 1.1 课程设计的目的 ●通过课堂所讲授的内容以及私下查阅资料,自主完成课程设计的题目,提高编 程能力,培养用计算机解决实际问题的能力,积累调试程序的经验,更好的消化 老师课堂所讲授的内容,对Verilog这种语言也有了更深的了解; ●掌握较大工程的基本开发技能; ●培养综合运用Modelsim,ISE,Debussy工具进行硬件开发的能力; ●培养数字系统设计的基本能力; ●通过课设积累起的编程以及硬件的能力对于今后的考研抑或是找工作都有非常实 际性的效果; 1.2 课程设计的条件 ●设计条件1:gVim编辑器以及Mentor公司开发的FPGA仿真软件Modelsim; ●设计条件2:Xilinx公司开发的硬件设计工具ISE以及Xilinx公司的开发板; ●设计条件3:虚拟机环境下的Linux系统具有的Design Compiler工具; ●设计条件4:虚拟机环境下的Linux系统具有的SDF工具以及Debussy工具; 1.3 课程设计的要求 ●设计要求1:能够在Modelsim工具下正确的完成程序的编译以及成功的实现波 形的仿真; ●设计要求2:能够在ISE工具下正确的完成程序的综合以及合理的绑定管脚并成 功的将程序下载到开发板里,在开发板中实现程序的功能; ●设计要求3:能够在虚拟机的Linux系统下采用Design Compiler完成逻辑综 合,并且评估其时序面积; ●设计要求4:能够在虚拟机的Linux系统下完成SDF反标仿真;

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 1.浮点数表达方式 我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e 其中,S—尾数,代表N 的有效数字; R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。 比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。 2.浮点数的规格化 一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。 对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。 当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

单双精度浮点数的IEEE标准格式

单双精度浮点数的IEEE标准格式 目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用 8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53 位尾数和1位符号位,如下图所示: 31 30 23 22 0 63 62 52 51 0 细心的人会发现,单双精度各部分所占字节数量比实际存储格式都了一位,的确是这样,事实是,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位。 阶以移码的形式存储。对于单精度浮点数,偏移量为127(7FH),而双精度的偏移量为1023(3FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+3即130(82H),双精度为1026(402H)。 浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全1,尾数部分全零。符号位指示正无穷或者负无穷。 下面举几个例子:

所有字节在内存中的排列顺序,intel的cpu按little endian顺序,motorola 的cpu按big endian顺序排列。

IEEE754标准的一个规格化 32位浮点数x的真值可表示为 x=(-1)^S*(1.M)*2^(E-127)e=E-127 31 30 23 0 |S | E |M | [例1]若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。 解:将16进制展开后,可得二进制数格式为 0 100,0001,0 011,0110,0000,0000,0000,0000 S E M 指数e=100,0001,0-01111111=00000011=(3)10 包含隐藏位1的尾数1.M=1.011,0110,0000,0000,0000,0000 于是有x=(-1)^0*(1.M)*2^(E-127) =+(1.011011)2*2^3 =(11.375)10 [例2]将数(20.59375)10转化为754标准的32位浮点数的二进制存储格式。解:首先分别将整数部分和小数部分转换成二进制 (20.59375)10=+(10100.10011)2 然后移动小数点使其在1,2位之间 10100.10011=1.010010011*2^4 e=4 于是得到:S=0,E=e+127=131,M=010010011 最后得到32位浮点数的二进制存储格式为 0 100,0001,1 010,0100,1100,0000,0000,0000 =(41A4C000)16 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。 任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在 x86CPU上一个字节是8位。比如一个16位(2字节)的 short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: ````````符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64

IEEE-754 32位单精度浮点数计算VB源码

VB IEEE-754 32位单精度浮点数计算源码 Option Explicit Private Function GetData(TmpHex As String) As String Dim TmpBin As String Dim TmpMi As Integer On Error Resume Next TmpBin = HexToBin(TmpHex) Label1.Caption = TmpBin & " 长度" & Len(TmpBin) & "位,第1位1为负数,0为正数" TmpMi = BinToOct(Mid(TmpBin, 2, 8)) - 127 GetData = Round(BinToOct("1." & Mid(TmpBin, 10, 23)) * (2 ^ TmpMi), 6) If Left(TmpBin, 1) = "1" Then GetData = "-" & GetData End Function Private Function HexToBin(TmpHex As String) As String Dim n As Integer Dim I As Integer Dim TmpBin As String On Error Resume Next For n = 1 To Len(TmpHex) I = Val("&H" & Mid(TmpHex, n, 1)) TmpBin = "" While I > 0 TmpBin = CStr(I Mod 2) & TmpBin I = I \ 2 Wend HexToBin = HexToBin & Right("0000" & TmpBin, 4) Next n End Function Private Function BinToOct(TmpBin As String) As Double Dim n As Integer Dim TmpS() As String On Error Resume Next TmpS = Split(TmpBin, ".") For n = 1 To Len(TmpS(0)) If Mid(TmpS(0), n, 1) = "1" Then BinToOct = BinToOct + (2 ^ (Len(TmpS(0)) - n)) Next n

十进制数和单精度浮点数的相互转换

将十进制数转换成浮点格式(real*4) [例1]: 十进制26.0转换成二进制 11010.0 规格化二进制数 1.10100*2^4 计算指数 4+127=131 符号位指数部分尾数部分 0 10000011 10100000000000000000000 以单精度(real*4)浮点格式存储该数0100 0001 1101 0000 0000 0000 0000 0000 0x41D0 0000 [例2]: 0.75 十进制0.75转换成二进制 0.11 规格化二进制数 1.1*2^-1 计算指数 -1+127=126 符号位指数部分尾数部分 0 01111110 10000000000000000000000 以单精度(real*4)浮点格式存储该数0011 1111 0100 0000 0000 0000 0000 0000 0x3F40 0000 [例3]: -2.5 十进制-2.5转换成二进制 -10.1 规格化二进制数 -1.01*2^1 计算指数 1+127=128 符号位指数部分尾数部分 1 10000000 01000000000000000000000 以单精度(real*4)浮点格式存储该数1100 0000 0010 0000 0000 0000 0000 0000 0xC020 0000

将浮点格式转换成十进制数 [例1]: 0x00280000(real*4) 转换成二进制 00000000001010000000000000000000 符号位指数部分(8位)尾数部分 0 00000000 01010000000000000000000 符号位=0;因指数部分=0,则:尾数部分M为m: 0.01010000000000000000000=0.3125 该浮点数的十进制为: (-1)^0*2^(-126)*0.3125 =3.6734198463196484624023016788195e-39 [例2]: 0xC04E000000000000(real*8) 转换成二进制1100000001001110000000000000000000000000000000000000000000000000 符号位指数部分(11位)尾数部分 1 10000000100 1110000000000000000000000000000000000000000000000000 符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:1.1110000000000000000000000000000000000000000000000000=1.875 该浮点数的十进制为: (-1)^1*2^(1028-1023)*1.875 =-60

浮点数转换为字符串

串口通讯中传递的数据格式不外两种:ASCII码(即可见字符形式)和二进制数据格式(对应Modbus协议中有ASCII模式和RTU模式)。最初的想法是把浮点数的各位分别提取出来,保存成一个各元素都是ASCII码的数组,然后通过串口发送出去,对方接收到这个数组后再相应地组合成原来的浮点数。这是以前写过的一段代码: //################################################################ // 函数名:void Float2Char(float Value,char *array) // 描述:将浮点数的各个位的数值转换成字符串,通过串口发送至上位机显示 // 参数:float Value为欲转换的正数浮点数值,转换结果保存在字符数组*array里 //################################################################ void Float2Char(float Value,char *array) { Uint16 IntegerPart; float DecimalPart; Uint16 i = 0; Uint16 j = 0; char temp; //分离整数部分与小数部分: //整数部分保存在IntegerPart中 //小数部分保存在DecimalPart中 if (Value>=1) { IntegerPart = (Uint16)Value; DecimalPart = Value-IntegerPart; } else { IntegerPart = 0; DecimalPart = Value-IntegerPart; } //转换整数部分 if (IntegerPart == 0) { array[0] = 0+48; array[1] = '.'; i = 1; } else { while(IntegerPart>0) {

浮点乘法器模板

EDA课程设计 课设名称:浮点乘法器 课设日期: 2014.6.23——7.xx 姓名:朱鹏勇 学号: 110250425 哈尔滨工业大学(威海) 信电学院电子信息工程 2014.6

一.所用软件与硬件介绍 1.1 软件介绍 QuartusII是Alter提供的FPGA/CPLD开发集成环境,Altera是世界上最大的可编程逻辑器件供应商之一。Quartus II在21世纪初推出时,是Altera前一代FPGA/CPLD集成开发环境MAX+plus II的更新换代产品,其界面友好,使用便捷。Altera的Quartus II提供了完整的多平台设计环境,能满足各种特定设计的需要,也是单芯片可编程系统(SOPC)设计的综合性环境和SOPC开发的基本设计工具。 1.2 硬件介绍 EDA试验箱 FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。具有如下特点: 一、采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。 二、FPGA可做其它全定制或半定制ASIC电路的中试样片。 三、FPGA内部有丰富的触发器和I/O引脚。 四、FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。 二。系统设计 2.1设计思想 2.1.1课题背景 随着计算机和信息技术的快速发展, 人们对微处理器的性能要求越来越高。运算器是数字信号处理过程中的重要基本组成部分,绝大多数FPGA都使用定点数据格式进行运算处理,对高精度、数据范围较大的运算无能为力,而浮点数比定点数的表述范围宽,有效精度高,更适合科学计算与工程计算,因此需要设计一种高速的浮点运算单元 2.1.2 设计目的 1、弄清浮点乘法器运算规则 2、设计标准的浮点IEEE574乘法器。 3、实现浮点乘法功能。 2.2工作原理及系统框图 1.浮点格式简介 常用的浮点格式为IEEE 754标准。该标准定义 了单精度浮点数、双精度浮点数和扩展双精度浮点数 3种格式,单精度为32位,双精度为64位,扩展双精 度为80位以上,位数越多则精度越高,表示范围也越 大。在通常的数字信号处理应用中,单精度浮点数即可满足处理精度要求。单精度浮点数如图所示。

浮点数(单精度浮点数与双精度浮点数)在计算机中的存储

浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数(exponent)两部分。比如3.684*10^2. 在十进制中,指数的基数为10,并且表示小数点移动多少位以生成系数。每次小数点向前移动时,指数就递增;每次小数点向后移动时,指数就递减。例如,25.92 可表示为2.592 * 10^1,其中2.592 是系数,值10^1 是指数。必须把系数和指数相乘,才能得到原始的实数。另外,如0.00172 可表示为1.72*10^-3,数字1.72 必须和10^-3 相乘才能获得原始值。 二进制浮点格式: 计算机系统使用二进制浮点数,这种格式使用二进制科学计数法的格式表示数值。数字按照二进制格式表示,那么系数和指数都是基于二进制的,而不是十进制,例如1.0101*2^2. 在十进制里,像0.159 这样的值,表示的是0 + (1/10) + (5/100) + (9/1000)。相同的原则也适用二进制。比如,1.0101 乘以2^2 后,生成二进制值101.01 ,这个值表示二进制整数5,加上分数(0/2) + (1/4) 。这生成十进制值5.25 。下表列出几个二进制 编写二进制浮点值时,二进制通常被规格化了。这个操作把小数点移动到最左侧的数位,并且修改指针进行补偿。例如1101.011 变成1.101011*2^3 浮点数的存储 ?IEEE 标准754 浮点数标准使用3 个成分把实数定义为二进制浮点值: ?符号 ?有效数字

?指数 符号位表示值是负的还是正的。符号位中的1 表示负值,0 表示正值。 有效数字部分表示浮点数的系数(coefficient)(或者说尾数(mantissa))。系数可以是规格化的(normalized),也可以是非规格化的(denormalized)。所谓规格化,就是任何一个数的科学计数法的表示都可为1.xxx*2^n,既然小数点左边的一位都是1,就可以把这一位省略。单精度浮点数23bit的尾数部分,可表示的精度却为24位,道理就在这里。 指数表示浮点数的指数部分,是一个无符号整数。因为指数值可以是正值,也可以是负值,所以通过一个偏差值对它进行置偏,及指数的真实值=指数部分的整数—偏差值。对于32位浮点数,偏差值=127;对于64位浮点数,偏差值=1023. 浮点数的这3 个部分被包含在固定长度的数据格式之内。IEEE 标准754 定义了浮点数的两种长度:32位单精度和64位双精度 可以用于表示有效数字的位的数量决定精度。下图显示了两种不同精度类型的位布局: 单精度浮点使用23 位有效数字值。但是,浮点格式假设有效数字的整数部分永远为1 ,并且不在有效数字值中使用它。这样实际上有效数字的精度达到了24 位。指数使用8 位值,它的范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量或者是偏差值),对单精度浮点数而言,这个值是127 。当指数是0和255时,指数由别的含义,因此实际指数的范围是从-126 到+127 (二进制指数),这样整个浮点数的范围则为:(1.18 * 10^-38~1.0×2……-126 到3.40 * 10^38~1.1……1×2^127)。 ?指数0和255用于特殊用途。如果指数从1变化到254,则由s(符号位)、e(指数)和f(有效数)来表示的数为: ?

用硬件描述语言设计浮点乘法器(原码一位乘法) 课程设计

计算机科学与工程学院 课程设计报告 题目全称:用硬件描述语言设计浮点乘法器(原码一位乘法) 课程名称:计算机组成原理 指导老师:职称: (注:学生姓名填写按学生对该课程设计的贡献及工作量由高到底排列,分数按排名依次递减。序号排位为“1”的学生成绩最高,排位为“10”的学生成绩最低。)指导老师评语: 指导签字:

摘要 硬件乘法器,其基础就是加法器结构,它已经是现代计算机中必不可少的一部分。其大致可分为定点乘法器和浮点乘法器。其中浮点数的格式较定点数格式复杂,硬件实现的成本较高,完成一次浮点四则运算的时间也比定点运算要长。但浮点数比定点数的表示范围更宽,有效精度更高,因此更适合科学与工程计算的需要。但要求计算精度较高时,往往采用浮点运算。浮点乘法器设计(原码一位乘法)模型就是基于“移位和相加”的算法,设浮点数A=2^AE·AM,B=2^BE·BM,则A×B=2^(AE+BE)·(AM×BM),即阶码相加,尾数相乘。其运算步骤可以简单的归为(1)检测能否简化操作,并置结果数符(2)阶码相加(3)尾数相乘(4)乘积规格化等。 本论文第一章讲述了该课程设计的研究背景及意义及其理论依据和实验基础、课题的难点、重点、核心问题及方向。第二章重点讲述了原码一位乘法实现浮点乘法器设计的原理、操作流程及课程设计实验数据和结果 关键词:浮点乘法器、原码一位乘法、阶码、尾数

目录 第1章课题背景 (3) 1.1研究背景 (3) 1.1.1国内外的研究现状 (3) 1.1.2理论依据和实验基础 (4) 1.2课题的难点、重点、核心问题及方向 (4) 1.3研究目的和意义 (5) 第2章课题的需求分析 (6) 2.1 课题对应软硬件系统的性能 (6) 2.2业务流程 (6) 2.3其他需求 (7) 第3章课题的设计与实现 (8) 3.1课程设计的理论基础 (8) 3.2开发工具简介 (8) 3.2.1硬件部分 (8) 3.2.2软件部分 (8) 3.3课程设计的框架和流程图 (8) 3.4课程设计的实现 (10) 3.4.1创建工程 (10) 3.4.2设计输入 (10) 3.4.3约束(引脚绑定) (12) 3.4.4综合 (12) 3.4.5实现 (12) 3.4.6 下载 (14) 3. 4.7开始测试 (14) 3.5结论 (16) 第4章结束语 (17)

IEEE_745浮点数标准

标题: 解读IEEE标准754:浮点数表示 一、背景 在IEEE标准754之前,业界并没有一个统一的浮点数标准,相反,很多计算机制造商都设计自己的浮点数规则,以及运算细节。那时,实现的速度和简易性比数字的精确性更受重视。 直到1985年Intel打算为其的8086微处理器引进一种浮点数协处理器的时候,聪明地意识到,作为设计芯片者的电子工程师和固体物理学家们,也许并不能通过数值分析来选择最合理的浮点数二进制格式。于是Intel在请加州大学伯克利分校的 William Kahan教授──最优秀的数值分析家之一来为8087 FPU设计浮点数格式; 而这个家伙又找来两个专家来协助他,于是就有了KCS组合(Kahn, Coonan, and Stone)。他们共同完成了Intel的浮点数格式设计,而且完成地如此出色,以致于IEEE组织决定采用一个非常接近KCS的方案作为IEEE的标准浮点格式。目前,几乎所有计算机都支持该标准,大大改善了科学应用程序的可移植性。 二、表示形式 从表面上看,浮点数也是一串0和1构成的位序列(bit sequence),并不是三头六臂的怪物,更不会咬人。然而IEEE标准从逻辑上用三元组{S,E,M}表示一个数N,如下图所示: N的实际值n由下列式子表示:

其中: ★ n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一串二进制位。 ★ S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n<0时,s=1。 ★ E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也可正可负。 ★ M(mantissa)表示N的尾数位,恰好,它位于N末尾。M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。 三、浮点数格式 IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度。前两者正好对应C语言里头的float、double或者FORTRAN里头的real、double精度类型。限于篇幅,本文仅介绍单精度、双精度浮点格式。 ★ 单精度:N共32位,其中S占1位,E占8位,M占23位。 ★ 双精度:N共64位,其中S占1位,E占11位,M占52位。 值得注意的是,M虽然是23位或者52位,但它们只是表示小数点之后的二进制位数,也就是说,假定 M为“010110011...”, 在二进制数值上其实是“.010110011...”。而事实上,标准规定小数点左边还有一个隐含位,这个隐含位通常,哦不,应该说绝大多数情况下是1,那什么情况下是0呢?答案是N

浮点数在计算机中的存储方式

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE 的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1.符号位(Sign) : 0代表正,1代表为负 2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移 位存储 3.尾数部分(Mantissa):尾数部分 其中float的存储方式如下图所示: 而双精度的存储方式为: R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25 用十进制的科学计数法表示就为:8.25*,而120.5可以表示 为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认 识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为

1.0001*,1110110.1可以表示为1.1101101*,任何一个数都的科学计 数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。 首先看下8.25,用二进制的科学计数法表示为:1.00001* 按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示: 而单精度浮点数120.5的存储方式如下图所示:

相关主题
文本预览
相关文档 最新文档