单精度浮点乘法器.doc_第1页
单精度浮点乘法器.doc_第2页
单精度浮点乘法器.doc_第3页
单精度浮点乘法器.doc_第4页
单精度浮点乘法器.doc_第5页
免费预览已结束,剩余17页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EDA/SOPC课程设计报告EDA/SOPC课程设计报告题目: 单精度浮点乘法器 姓 名: 张恺 学 号:120260230 同组人:刘龙 指导教师:王晨旭 成 绩: 信息科学与工程学院电子科学与技术IIIEDA/SOPC课程设计报告目录目录II第1章 课程设计的要求11.1 课程设计的目的11.2 课程设计的条件11.3 课程设计的要求1第2章 课程设计的内容22.1 设计思路22.1.1 符合IEEE-754标准的单精度浮点乘法器规格22.1.2 操作数类型22.1.3 运算规则32.1.4 逻辑门级框图32.2 软件流程图42.3 HDL代码阐述62.4 Modelsim验证102.4.1 验证代码102.4.2 验证波形122.5 硬件调试122.5.1 基本说明122.5.2 具体操作132.6 虚拟机下的DC综合172.7 虚拟机下的SDF反标仿真19第3章 课程设计的心得20信息科学与工程学院电子科学与技术IIIEDA/SOPC课程设计报告第1章 课程设计的要求1.1 课程设计的目的l 通过课堂所讲授的内容以及私下查阅资料,自主完成课程设计的题目,提高编 程能力,培养用计算机解决实际问题的能力,积累调试程序的经验,更好的消化老师课堂所讲授的内容,对Verilog这种语言也有了更深的了解;l 掌握较大工程的基本开发技能;l 培养综合运用Modelsim,ISE,Debussy工具进行硬件开发的能力;l 培养数字系统设计的基本能力;l 通过课设积累起的编程以及硬件的能力对于今后的考研抑或是找工作都有非常实 际性的效果;1.2 课程设计的条件l 设计条件1:gVim编辑器以及Mentor公司开发的FPGA仿真软件Modelsim;l 设计条件2:Xilinx公司开发的硬件设计工具ISE以及Xilinx公司的开发板;l 设计条件3:虚拟机环境下的Linux系统具有的Design Compiler工具;l 设计条件4:虚拟机环境下的Linux系统具有的SDF工具以及Debussy工具;1.3 课程设计的要求l 设计要求1:能够在Modelsim工具下正确的完成程序的编译以及成功的实现波形的仿真;l 设计要求2:能够在ISE工具下正确的完成程序的综合以及合理的绑定管脚并成功的将程序下载到开发板里,在开发板中实现程序的功能;l 设计要求3:能够在虚拟机的Linux系统下采用Design Compiler完成逻辑综合,并且评估其时序面积;l 设计要求4:能够在虚拟机的Linux系统下完成SDF反标仿真;第2章 课程设计的内容2.1 设计思路对于单精度浮点乘法器这一课程题目,重点在于正确理解IEEE-754标准,设计出符合IEEE-754标准的单精度浮点乘法器。2.1.1 符合IEEE-754标准的单精度浮点乘法器规格单精度浮点数32位由高位至低位可划分为1位符号位(s),8位阶码(e),23位尾数(f)。0e255时为规格化数;e=0且f=0为正负0;e=0且f不等于0,为非规格化数;e=255且f=0,为正负无穷;e=255且f不等于0,为NaN(不是一个数)。图2-1 单精度浮点数的规格2.1.2 操作数类型符号/1位阶码/8位尾数/23位NaN0/111111111非0无穷0/11111111123b000/100000000任意正常0/1(0,255)任意表2-1说明:1、NaN和任何数相乘都为NaN;2、无穷和0相乘为NaN,和其他数相乘都为无穷;3、0和替他数相乘都为0;4、正常数和正常数相乘再对他们的乘积进行判断(以上的每一种情况都是在其前面情况不成立情况下进行的);5、如flout_a与flout_b中有至少一个异常,那么flout_c的尾数部分为优先级高的异常情况的尾数部分,无穷和0相乘特殊,指定其尾数为23b01,0的符号位为0,其他为sign_asign_b;2.1.3 运算规则两个规格化的单精度浮点数相乘时,运算规则如下:(1)符号位相异或得结果;(2)阶码为e=(e1-127)+(e2-127)+127;(3)尾数为两个尾数都扩展一位后再相乘,得出的为一个48位数cf1,取出cf1的第24位至第48位赋给cf3,即cf3=cf147:23,此时若cf122=0,舍去第1位至23位,若cf122=1,向第24位进1,并且舍去第1位至第23位;尾数规格化:判断cf324是否为1,若cf324=1,cf3右移1位,阶码位加1,若cf324=0,则不用进行规格化;最后尾数取cf322:0。2.1.4 逻辑门级框图图2-2 逻辑门级框架简图2.2 软件流程图图2-3 总流程图图2-4 计算部分详细流程图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); input31:0 flout_a; input31:0 flout_b;/设置两个输入的单精度浮点数 input clk;/时钟信号 input en;/使能信号 input rst;/复位信号 output31:0 flout_c;/输出的单精度浮点数 output1:0 yichu;/溢出信号 reg31:0 flout_c; reg1:0 yichu;/变量类型声明 reg sign_a,sign_b,sign_c; /符号位 reg 7:0zhishu_a,zhishu_b,zhishu_c; /阶码 reg23:0zz_a,zz_b; reg47:0zz_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_a31; sign_b=flout_b31; zhishu_a=flout_a30:23; zhishu_b=flout_b30:23; zz_a=1b1,flout_a22:0; zz_b=1b1,flout_b22: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=2b01; end /输出复位模块 else begin if(zhishu_a=255&(|zz_a22:0)begin zhishu_c=zhishu_a; yichu=2b11; zz_c46:23=zz_a; sign_c=sign_asign_b; end /数a不是一个数与数b任何数相乘都是不是一个数 else if(zhishu_b=255&(|zz_b22:0)begin zhishu_c=zhishu_b; yichu=2b11; zz_c46:23=zz_b; sign_c=sign_asign_b; end /数b不是一个数与数a任何数相乘都是不是一个数 else if(zhishu_a=255&(|zz_a22:0)begin if(zhishu_b=255&(|zz_b22:0)begin zhishu_c=zhishu_a; yichu=2b10; zz_c46:23=zz_a; sign_c=sign_asign_b; end /数a无穷与数b无穷相乘还是无穷 else if(zhishu_b=0) begin zhishu_c=zhishu_a; yichu=2b11; zz_c46:23=1b1; sign_c=sign_asign_b; end /数a无穷与数b0相乘为不是一个数 else if(zhishu_b0) begin zhishu_c=zhishu_a; yichu=2b10; zz_c46:23=zz_a; sign_c=sign_asign_b; end /数a无穷与数b规格化数相乘为无穷 end else if(zhishu_b=255&(|zz_b22:0)begin if(zhishu_a=0) begin zhishu_c=zhishu_b; yichu=2b11; zz_c46:23=zz_b+1b1; sign_c=sign_asign_b; end /数b无穷与数a0相乘为不是一个数 else if(zhishu_a0)begin zhishu_c=zhishu_b; yichu=2b10; zz_c46:23=zz_b; sign_c=sign_asign_b; end /数b无穷与数a规格化数相乘为无穷 end else if(zhishu_a=0)|(zhishu_b=0)begin yichu=2b00; zhishu_c=8b00000000; sign_c=0; if(|zhishu_a)begin zz_c46:23=zz_a; end else begin zz_c46:23=zz_b; end end /数a0与数b0相乘还为0 else begin sign_c=sign_asign_b; zhishu_c=zhishu_a+zhishu_b-127; zz_c=zz_a*zz_b; if(zz_c22=1)begin jiayi=1b0; zz_c47:23=zz_c47:23+1b1;/zz_c45:23 end else if(zz_c47=1)begin zz_c47:23=1b0,zz_c47:24; jiayi=1b1; end else begin jiayi=1b0; zz_c47:23=zz_c47:23;/zz_c45:23 end if(jiayi) begin zhishu_c=zhishu_c+1; end / 数a规格化数与数b规格化数相乘按照ieee-754标准进行计算 if(zhishu_c=255&(|zz_c)begin zhishu_c=8hff; yichu=2b11; end /得出的结果为不是一个数 if(zhishu_c=255&(|zz_c)begin zhishu_c=8hff; yichu=2b10; end /得出的结果为无穷 else if(zhishu_a+zhishu_b=127)begin yichu=2b00; zhishu_c=8b00000000; sign_c=0; end /得出的结果为0 else begin yichu=2b01; zhishu_c=zhishu_c; end /得出的结果为规格化数 end end end always(posedge clk or negedge rst)begin if(rst)begin flout_c31=0; flout_c30:23=0; flout_c22:0=0; end /输出结果的复位模块 else begin flout_c31=sign_c; flout_c30:23=zhishu_c; flout_c22:0=zz_c45:23; end /输出结果拼接 endendmodule2.4 Modelsim验证2.4.1 验证代码timescale 1ns/100psmodule mux_tb(); reg 31:0flout_a,flout_b; reg clk,en,rst; wire 31:0flout_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=32h00000001; flout_a=32h7f800000; en=1; rst=0; #100; rst=1; #800000; flout_b=32h20000001; flout_a=32h7f800000; #800000; flout_b=32h00000001; flout_a=32h7f800001; #800000; flout_b=32h20000001; flout_a=32h7f800001; #800000; flout_b=32h00000001; flout_a=32h20000001; #800000; flout_b=32h20000001; flout_a=32h20000001; #800000; flout_b=32h7f800000; flout_a=32h7f800000; #800000; flout_b=32h7f800001; flout_a=32h7f800001; #800000; flout_b=32h7f800001; flout_a=32h7f800000; #800000; flout_b=32h0af800001; flout_a=32h20000001; #800000; /设置输入变量,使能信号,复位信号随时间发生变化 $stop; /task delay; / input 31:0mum; /repeat(num)(posedge clk)begin /repeat(100)(posedge clk); /end /endtask end initial begin $dumpfile(zk.vcd); $dumpvars; end /生成vcd文件endmodule2.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。以下为乘数的输入位规定:标号类型符号位阶码位尾数位A无穷0/111000BNaN0/111001C正常0/101001表2-2以下为被乘数的输入位规定:标号类型符号位阶码位尾数位1无穷0/111000Chose=12NaN0/1110013正常0/101001标号类型符号位阶码位尾数位1零0/100001Chose=02正常0/101001表2-3以下为根据以上标号组合而成的结果的形式:结果为2位溢出标志位,1位符号位,3位阶码位(前两位为阶码最高位,第三位为阶码最低位),后四位为尾数后四位。结果如下组合A1A2B1B2C1C2A1B2A2C3溢出标志11101111000110111101阶码前两位,最后一位111111111111000010111111111011尾数后四位0001000000010001000100100000000100010010表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_a5 IOSTANDARD = LVCMOS33;NET flout_a4 IOSTANDARD = LVCMOS33;NET flout_a3 IOSTANDARD = LVCMOS33;NET flout_a2 IOSTANDARD = LVCMOS33;NET flout_a1 IOSTANDARD = LVCMOS33;NET flout_a0 IOSTANDARD = LVCMOS33;NET flout_b5 IOSTANDARD = LVCMOS33;NET flout_b4 IOSTANDARD = LVCMOS33;NET flout_b3 IOSTANDARD = LVCMOS33;NET flout_b2 IOSTANDARD = LVCMOS33;NET flout_b1 IOSTANDARD = LVCMOS33;NET flout_b0 IOSTANDARD = LVCMOS33;NET flout_c7 IOSTANDARD = LVCMOS33;NET flout_c6 IOSTANDARD = LVCMOS33;NET flout_c5 IOSTANDARD = LVCMOS33;NET flout_c4 IOSTANDARD = LVCMOS33;NET flout_c3 IOSTANDARD = LVCMOS33;NET flout_c2 IOSTANDARD = LVCMOS33;NET flout_c1 IOSTANDARD = LVCMOS33;NET flout_c0 IOSTANDARD = LVCMOS33;NET yichu1 IOSTANDARD = LVCMOS33;NET yichu0 IOSTANDARD = LVCMOS33;NET flout_a5 LOC = P4;NET flout_a4 LOC = P3;NET flout_a3 LOC = R3;NET flout_a2 LOC = T1;NET flout_a1 LOC = T3;NET flout_a0 LOC = U2;NET flout_b5 LOC = V7;NET flout_b4 LOC = R5;NET flout_b3 LOC = R6;NET flout_b2 LOC = R7;NET flout_b1 LOC = U8;NET flout_b0 LOC = U9;NET flout_c7 LOC = P2;NET flout_c6 LOC = R2;NET flout_c5 LOC = U1;NET flout_c4 LOC = P5;NET flout_c3 LOC = R1;NET flout_c2 LOC = V1;NET flout_c1 LOC = U3;NET flout_c0 LOC = V4;NET yichu1 LOC = V9;NET yichu0 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”2.7 虚拟机下的SDF反标仿真如图2-10所示,得到的结果与反标之前是相同的,反标之后的门延迟与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论