用硬件描述语言设计浮点乘法器_第1页
用硬件描述语言设计浮点乘法器_第2页
用硬件描述语言设计浮点乘法器_第3页
用硬件描述语言设计浮点乘法器_第4页
用硬件描述语言设计浮点乘法器_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

计算机科学与工程学院课程设计报告题目全称:用硬件描述语言设计浮点乘法器(补码一位乘法)课程名称:计算机组成原理指导老师:职称:序号学生姓名学号班号成绩123指导老师评语:指导教师签字:摘要数字乘法器,作为现代计算机中必不可少的一部分,其设计工作越来越受到人们的重视。本文采用硬件描述语言verilogHDL设计了一个基于补码一位乘法的浮点乘法器,设计功能完善,灵活性较好。理论依据包括浮点运算和补码一位乘法运算。本文对开发环境,测试环境做了简要介绍,并对设计过程进行了详细的描述分析,使用Modelsim软件的Simulator模块进行了功能仿真。关键字:浮点运算;补码一位乘法;乘法器;verilogHDLAbstract Digitalmultiplier,asanessentialpartofmoderncomputer,itsdesignhasbeenpaidmoreandmoreattention.Inthispaper,weusethehardwaredescriptionlanguageverilogHDL-basedtodesignacomplementofmultiplicationoffloating-pointmultiplierwhosefunctionandflexibilityaregood.Theoreticalbasisincludesfloating-pointoperationsandcomplementmultiplication.Inthispaper,weintroducetheenvironmentofdevelopmentandtestbriefly,andthedesignprocessisdescribedindetailanalysis,usingtheSimulatormodulesofModelsimsoftwaretocarrythefunctionalsimulation. Keywords:floating-pointoperations;complementofmultiplication;multiplier;verilogHDL

目录第一章引言 41.1课题背景 41.1.1应用领域 41.1.2国内外研究现状 41.2课题意义及价值 51.3理论依据 51.3.1浮点运算原理 51.3.2补码一位乘法运算原理 61.4课题的难点、重点、核心问题及方向 91.5本组所做的工作 91.6主要内容与章节安排 9第二章课题设计与实现 112.1开发工具简介 112.1.1VerilogHDL硬件描述语言 112.1.2QuartusII 112.2需求分析与概要设计 122.3设计框架与流程图 132.3.1设计框图 132.3.2设计流程图 132.4详细设计 162.4.1补码一位乘法模块设计 162.4.2规格化模块设计 192.4.3控制模块及加法模块设计 21加法模块设计 21控制模块设计 21第三章仿真测试 223.1仿真测试环境 223.2模块仿真测试 243.2.1(补码一位)乘法模块仿真测试 243.2.2规格化模块仿真测试 253.2.3加法模块仿真测试 273.3总测试(控制模块测试) 29第四章总结与展望 334.1问题及解决方案总结 334.1.1乘法模块编写问题 334.1.2规格化模块编写问题 334.2结论及展望 33参考文献 34致谢 34

第一章引言1.1课题背景1.1.1应用领域近三十年来,随着数字信号处理技术(DSP)的广泛应用和超大规模集成电路工艺的不断进步,数字乘法器的设计越来越受到人们的重视。该技术是上世纪60年代发展起来的一门新兴学科,当时主要采用计算机模拟的方法研究数字滤波器,现在已经广泛用于需要对信号进行谱分析、滤波、压缩的众多学科和工程领域。1.1.2国内外研究现状当今数字信号处理技术领域里较好,运用较为广泛的带符号数乘法的算法本文列出三个:上世纪50年代,VLSI技术发展出的由门阵列和二维加法器阵列组成的阵列乘法器;之后是由A.D.Booth在1951年提出的Booth算法,十年后由MacSorely提出了修正之后的Booth算法,并一直广泛运用至今;再有就是1977年由RonRivest、AdiShamirh和LenAdleman开发的当今通信领域广发运用的加密算法之一的RSA算法,其主要涉及到的计算为:c=me下面简要介绍一下上文提到过的三种算法:阵列乘法器:早期计算机中为了简化硬件结构,采用串行的1位乘法方案,即反复执行“加法-移位”操作来实现,这种方法并不需要很多的器件。而阵列乘法器的出现就是为了解决这种因串行执行方式而消耗大量时间的问题,所以自从大规模集成电路问世以来,出现了各种形式的流水式阵列乘法器,它们属于并行乘法器。带符号数的阵列乘法器在逻辑结构中,由两个求补器作无符号数乘法处理,和一个算后求补器作符号位处理。RSA算法:它主要涉及公式(1)的计算,而用反复平方法可使上述计算时间只与log2(e)线性相关。在超大规模集成电路的发展中,高速、低功耗、版图设计规则、占用芯片面积小等成为乘法器研究的重点。Booth算法:它采用相加和相减的操作计算补码数据的乘积。Booth算法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作。判断的两个数据位为当前位及其右边的位(初始时需要增加一个辅助位0),移位操作是向右移动。其核心思想是通过对乘数编码,压缩部分积个数,进而缩短乘法运算的时间,而修正后的Booth算法将部分积的个数压缩至原来的1/2左右,且与乘数无关。本次课程设计所选用的设计算法就是Booth算法,所以会在正文中作详细的说明。1.2课题意义及价值乘法运算在数字信号处理算法中占有重要地位。因为在数字信号处理中存在着大量形如Y=AX+B的运算,即两个数相乘后与另一个数相加,而且这种运算往往是反复进行的。因此,研究硬件乘法器是实时数字信号处理器中乘法实现的需要。自数字信号处理技术诞生之日起,实时处理就是人们奋斗不懈的目标。实时处理的实现,一方面在于采用先进算法降低运算量,另一方面在于提高硬件运算的速度。根据查阅资料并显示,假设每条基本指令按1us计算(乘除指令除外),软件执行完成一次4位×4位(2二进制)的乘法需要约100us,协处理器(如8087),执行定点和浮点乘法运算需要20us,而硬件乘法器作为专用运算单元,可以在几十ns内完成一次浮点乘法运算。由此可见,乘法的硬件实现对于提升DSP系统性能有重要意义。目前再来看一组数据,“目前,嵌入式设计中约有38%已经采用了DSP芯片代替传统的MCU芯片,以制造具有更高性能的产品;另外约有49%正计划采用(Fig1.7)。全国DSP市场的年增长率超过30%,是集成电路平均增长速度的两倍(Fig1.8)。”由上可以看出,数字乘法器的技术发展推动着DSP的发展。研究本课题,于组内成员而言的意义在于,通过查阅相关的资料,能使我们进一步透彻的掌握补码一位乘法的计算原理,分析乘法的计算过程及整个运算中涉及到的各模块的工作原理。本课题实现的是浮点一位乘法运算,这是一个从简到繁的过程,对以后涉及多位乘法器打下了好的基础。此外,本课程设计还是我们学习、熟悉了新的一种硬件编程语言VerilogHDL。1.3理论依据1.3.1浮点运算原理设浮点数A=,则即阶码相加,尾数相乘。其运算可按以下步骤进行。①检测能否简化操作,并置结果数符。如果操作数中有一个为0,乘积必为0,不需做其他操作。如果两数均不为0,才进行乘法运算。结果数符按同号相乘为正、异号相乘为负的规则确定。②阶码相加。如果阶码用补码表示,则阶码相加可按常规补码加法进行。如果阶码用移码(增码)表示,由于阶码本身已有一个偏移量,相加后偏移量将加倍,所以移码相加后应作修正(即减去)。阶码相加有可能产生溢出,同号相加可能上溢(正阶码),也可能下溢(负阶码)。当产生溢出时,浮点运算器将发出溢出信号,使机器转入溢出处理。③尾数相乘,可以用任何一种定点小数乘法实现。可见浮点数乘法包含两组定点运算,即定点整数的阶码运算与定点小数的尾数运算。这两组运算可以共用一个加法器,分步执行;也可以在常规加法器的基础上再设置一个专门的阶码加法器,并行执行,以提高运算速度。④乘积规格化。尾数相乘后,可能需要左规。由于尾数是定点小数,相乘后不会出现需右规的情况。左规时阶码减1,有下溢的可能。1.3.2补码一位乘法运算原理补码乘法是指操作数与结果均以补码表示,连同符号位一起,按相应算法运算。实现补码乘法有两种方法。一种是先按原码乘法那样直接乘,再根据乘数符号进行校。其算法规则如下:1)、不管被乘数X补的符号如何,只要乘数Y补为正,则可像原码乘法一样进行运算,其结果不需要校正。2)、如果乘数Y补为负,则先按原码乘法运算,结果再加一个校正量-X补。这种算法称为校正法。另一种方法是将校正法的两种情况统一起来,演变为比较法。由于它是Booth夫妇首先提出的,所以又称为Booth算法。这是现在广泛采用的补码乘法,如果不加说明,一般所指的补码算法就是比较法。(1)比较算法分析补码一位乘比较法可用下式表示:(1)

式(1)概括了校正法的两种情况:如果乘数为正,即,Y的尾数乘以被乘数(X)补,不需校正。若乘数为负,即,则(X)补乘以(Y)补的尾数后,再减(X)补校正。将式(1)改写为:(2)在机器实现中可在末位Yn之后再增设一个附加位Yn+1,其初始值为0,对乘数Y的值并无影响。若定义(A0)补为初始部分积,[A1]补-[An]补依次为各步求得累加并右移后的部分积,则式(2)改写为如下递推公式,它更接近于乘法的分步运算形式。(3)

式(3)表明了补码一位乘法的基本操作:被乘数X补乘以对应的相邻两位乘数之差值,再与原部分积累加,然后右移一位,形成该步的部分积累加和。由于根据相邻两位乘数之差(低位减高位),即两位的比较结果来决定相应操作,所以称为比较法。因为每步要右移1位,所以参与比较的两位始终位于最末的Yn、Yn+1,可根据这两位的值决定操作,规则如表1-1所示。表1-1补码一位乘规则(2)运算实例X=-0.1101,Y=-0.1011,求(XY)补。

初值:A=00.0000,B=X补=11.0011,

-B=(-X)补=00.1101,C=Y补=1.0101图1-1补码一位乘实例本例以分步算式的形式表明了补码一位乘法的运算过程,下面再对有关要点进行说明。1、初始值和符号位A寄存器用来存放部分积累加和,初始值为0,采取双符号位。累加时可能产生的进位暂存于第二符号位,第一符号位始终指示部分积累加和的正负,以控制右移时补0或补1.补码乘法中有加或减,相应地,部分积可能有正有负,这就需要第一符号位保持正负标志。B寄存器中存放补码表示的被乘数X补,双符号为(与A相对应)。补码一位乘的基本操作有A+B和A-B,所以在算式中先写X补(B)和-X补(-B)的值。C寄存器存放补码表示的乘数Y补。取单符号位,以控制最后一步操作,该步操作体现了乘数正负的影响。Y的末位添0,称为附加位。2、基本操作用C寄存器最末两位(含增加的)作判断位,按前述规则决定各步操作。如第一步,判断位为10,低位减高位得-1,所以执行A-B,然后右移一位。又如第二步,判断位为01,低位减高位得1,执行A+B。每步加/减后让A与C右移一位,而每次是相邻两位乘数比较,所以除去C的符号位和增加的末位0以外,各乘数位将参加两次比较。注意,现在讨论的是补码一位乘,比较两位只相当于处理一位乘数,不可误认为两位乘。3、移位在右移时,第二符号位值移入尾数的最高数位,第一符号位值移入第二符号位。第一符号位本身不变,而A寄存器末位移入C寄存器。4、步数与最后一步操作如上例,乘数的有效位数是4位,共做5步。除C0与Cn+1位外,有效尾数中各位均参与两次比较。注意,最后一位不移位,因为这一步是用来处理符号位的,按式(3),这一步不再移位。1.4课题的难点、重点、核心问题及方向 根据本课程设计的基本思路,课题最核心的问题在于补码一位乘法模块的设计,同时,这也是本课题设计的重点与难点。本课题的方向为,使浮点乘法器灵活实现各位数级(4位,8位,16位等)上的浮点乘法运算。1.5本组所做的工作 本组采用硬件描述语言设计,实现一个基于补码一位乘法的浮点乘法器,包括加法器,补码一位乘法器,规格化程序等子设计。本组所做的工作包括,对浮点运算,补码一位乘法运算原理的分析,编码实现浮点乘法器,编写测试代码对浮点乘法器进行仿真测试。最后是将设计原理,设计框图,设计代码及测试代码,以及对设计的背景与意义,总结与分析编辑,整理,撰写成课程设计论文。1.6主要内容与章节安排 本文第二章介绍了课题的设计与实现过程,包括概要设计与详细设计两部分,涵盖了设计思想,逻辑框图,流程图以及程序源代码等。第三章介绍的是对本设计所做的测试工作,包括对测试环境的介绍,以及各模块测试和总体测试的测试用例、测试依据等的介绍。第四章主要是对代码编写与测试过程中遇到的问题及其解决方案的介绍,最后是对工作的总结和未来的展望。

第二章课题设计与实现2.1开发工具简介2.1.1VerilogHDL硬件描述语言VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。VerilogHDL语言最初是于1983年由GatewayDesignAutomation公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。由于他们的模拟、仿真器产品的广泛使用,VerilogHDL作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,VerilogHDL语言于1990年被推向公众领域。OpenVerilogInternational(OVI)是促进Verilog发展的国际性组织。1992年,OVI决定致力于推广VerilogOVI标准成为IEEE标准。这一努力最后获得成功,Verilog语言于1995年成为IEEE标准,称为IEEEStd1364-1995。完整的标准在Verilog硬件描述语言参考手册中有详细描述。VerilogHDL语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,VerilogHDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。2.1.2QuartusIIQuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对MaxplusII的更新支持,QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。2.2需求分析与概要设计本课题实现的是基于补码一位乘法的浮点乘法器。输入输出情况如下:输入:待进行乘法运算的两个浮点数的尾数和阶码(阶底默认为2)。输出:运算结果的尾数与阶码。基于以上的输入输出条件,设计一个加法模块进行阶码运算,一个补码一位乘法模块进行尾数运算。此外,考虑浮点运算的规格化问题,最终输出结果,尾数应该为大于1/2,小于1的数,且乘法运算结果可能存在溢出位需要处理,故还须设计一个规格化模块。最后设计一个控制模块,驱动三个模块完成工作。基本运算过程为:先后调用加法模块计算阶码相加结果,乘法模块计算尾数相乘结果,再调用规格化模块对前两个模块得到的结果进行规格化,最后输出阶码与尾数结果。各模块的输入输出设计如下:moduleadder(EX,EY,EOUT);//阶码加法模块modulemultiply(Mx,My,Mout);//补码一位乘法模块moduleSPEC(EIn,MIn,EOut,MOut);//规格化模块modulerun(Mx,My,E_X,E_Y,M_out,E_out);//运行控制模块2.3设计框架与流程图2.3.1设计框图图2-1设计框图依照概要设计方案,使用QuartusII工具生成逻辑框图,如图2-1所示。其中u1为加法模块,四位的E_X,E_Y为两个阶码输入,四位EOUT为阶码输出。u2为乘法模块,六位的Mx,My(高两位设计为符号位)为两个尾数输入,Mout为尾数输出。U3为规格化模块,4位的EIn为阶码输入,MIn为尾数输入,EOut和MOut分别为阶码与尾数输出。2.3.2设计流程图

YesYesYes开始YesYesYes开始YesYesNoNo输出结束图2-2设计流程图 本流程图左侧为阶码处理模块,右侧为尾数处理模块。阶码处理模块将输入的阶码相加后输出至下一个模块,尾数处理模块进行n次循环移位(n为乘数的尾数小数点后的位数),再进行一次判断决定是否加(减)一次被乘数。随后将尾数结果输出至下一个模块。规格化模块接收到上两个模块的阶码,尾数结果后进行溢出判断,大小判断,将规格化结果输出,作为最终结果。2.4详细设计2.4.1补码一位乘法模块设计设计思想:程序首先进行判0操作,如果乘数中有一个或两个为0,则直接输出结果0,否则进入程序主体。程序主体分成三个判断模块进行,当乘数最低位与次低位值相等时,先将乘数右移一位,再将原部分累加和右移一位至乘数最高位,同时部分积累加和的最高位根据次高位正负补0或1;如果乘数最低位与次低位分别为1,0时,将原部分累加和加上被乘数X补后,再右移一位至乘数最高位,同时部分积累加和的最高位根据次高位正负补0或1;如果乘数最低位与次低位分别为0,1时,将原部分累加和减去被乘数X补后,再右移一位至乘数最高位,同时部分积累加和的最高位根据次高位正负补0或1。每次比较一次乘数的最末两位,进行相应运算后,共循环4次。循环结束后,再进行一次判断,如果乘数最低位与次低位分别为1、0,将原部分累加和加上被乘数X补。如果乘数最低位与次低位分别为0、1,将原部分累加和减去被乘数X补。此时,最终累加和就是乘积的高位结果,取乘数的高四位作为低位结果,拼接即为最终乘法结果。代码如下:modulemultiply(Mx,My,Mout);//补码一位乘法模块input[5:0]Mx,My;//定义六位的尾数输入,其中前两位为符号位。outputreg[9:0]Mout;//定义九位的尾数输出,其中前两位为符号位。reg[5:0]a;//a寄存器存放部分积累加和reg[5:0]b,c;//b寄存器存放补码表示的被乘数,c寄存器存放补码表示的乘数reg[3:0]n;//n作为临时变量,用来存放循环次数reg p,q;//p用于负数移位补1操作,q用于存放添加的Cn+1always@(Mx,My)beginif((Mx==0)||(My==0))Mout=0;elsebegina=6'b000000;n=4'b1111;p=1'b1;q=1'b0;b=Mx;c=My;c={c[4:0],q};while(n)beginn=n>>1;if(((c[0]==0)&&(c[1]==0))||((c[0]==1)&&(c[1]==1)))//如果Cn+1和Cn同为0或1,则只进行移位beginc=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endelseif((c[0]==1)&&(c[1]==0))//如果Cn=0,Cn+1=1,则先加上被乘数的补码,再移位begina=a+b;c=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endelseif((c[0]==0)&&(c[1]==1))//如果Cn=1,Cn+1=0,则先减去被乘数的补码,再移位begina=a-b;c=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endend//四次循环后,进行最后一步,此步不移位,用来处理符号位if((c[0]==1)&&(c[1]==0))begina=a+b;endelseif((c[0]==0)&&(c[1]==1))begina=a-b;endMout={a,c[5:2]};endendendmodule2.4.2规格化模块设计设计思想:当双符号位为00时,说明没有产生溢出,原尾数为正值,此时若尾数最高位数值为0,说明其绝对值小于1/2,应该进行左移规格化,尾数左移,阶码减1。其他情况尾数和阶码均不改变,按原值输出;当双符号位为01时,产生正溢,说明由于尾数最高位数值相加产生进位进而产生溢出,使得尾数绝对值大于1,应该进行右移规格化,尾数右移1位,阶码加1。其他情况尾数和阶码均不改变,按原值输出;当双符号位为11时,说明没有产生溢出,原尾数为负值,此时若尾数最高位数值为1,说明其绝对值小于1/2,应该进行左移规格化,尾数左移,阶码减1。其他情况尾数和阶码均不改变,按原值输出;当双符号位为10时,产生负溢,说明由于尾数最高位数值相加产生进位进而产生溢出,使得尾数绝对值大于1,应该进行右移规格化,尾数右移1位,阶码加1.其他情况尾数和阶码均不改变,按原值输出;其他双符号位及尾数最高数值位情况下,不进行规格化,按原值进行输出。代码如下:moduleSPEC(EIn,MIn,EOut,MOut);input[3:0]EIn;//规格化之前的阶数input[9:0]MIn;//规格化之前的尾数output[3:0]EOut;//规格化之后的阶数output[9:0]MOut;//规格化之后的尾数regp;//临时变量p,用于补充溢出处理补0操作。regq;/临时变量q,用于补充溢出处理补1操作。reg[3:0]tmp1;//临时变量tmp1,用于运算、存储阶码reg[9:0]tmp2;//临时变量tmp2,用于运算、存储尾数always@(EInorMIn)beginp=1'b0;q=1'b1;if(MIn[9:8]==2'b01)//有正溢情况下应右移,相应阶数加1begintmp2={p,MIn[9:1]};tmp1=EIn+1;endelseif(MIn[9:8]==2'b10)begintmp2={q,MIn[9:1]};tmp1=EIn+1;endelseif((MIn[9:8]==2'b00&&MIn[7]==0)||(MIn[9:8]==2'b11&&MIn[7]==1))//无溢出情况下,若尾数绝对值小于1/2均应左移,相应阶数减1begintmp2={MIn[9:8],MIn[6:0],p};tmp1=EIn-1;endelsebegintmp2=MIn;tmp1=EIn;end//输出最终结果的规格化后的尾数和阶数endassignEOut=tmp1;assignMOut=tmp2;endmodule2.4.3控制模块及加法模块设计加法模块设计设计思想:输入两个线网型变量的阶码,采用电平触发的always语句相加后输出结果。moduleadder(EX,EY,EOUT);//加法模块,实现阶码相加input[3:0]EX,EY;//输入两个阶码outputreg[3:0]EOUT;//输出阶码always@(EXorEYorEOUT)EOUT<=EX+EY;endmodule控制模块设计设计思想:将待进行乘法运算的两个浮点数的尾数和阶码分别作为输入(阶底默认为2),输出运算结果的尾数与阶码。运算过程先后调用加法模块计算阶码相加结果,乘法模块计算尾数相乘结果,规格化模块对前两个模块得到的结果进行规格化,最后输出。代码如下:modulerun(Mx,My,E_X,E_Y,M_out,E_out);//运行控制模块input[5:0]Mx,My;//六位浮点数尾数输入,其中前两位为符号位input[3:0]E_X,E_Y;//四位无符号阶码输入output[9:0]M_out;//十位尾数结果输出,其中前两位为符号位output[3:0]E_out;//四位无符号阶码输出wire[3:0]E;//中间变量E,用于阶码加法模块,输出到规格化模块wire[9:0]M;//中间变量M,用于乘法模块,输出到规格化模块adderu1(.EX(E_X),.EY(E_Y),.EOUT(E));multiplyu2(.Mx(Mx),.My(My),.Mout(M));SPECu3(.EIn(E),.MIn(M),.EOut(E_out),.MOut(M_out));endmodule

第三章仿真测试3.1仿真测试环境Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。主要特点: ·RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真;·单内核VHDL和Verilog混合仿真;·源代码模版和助手,项目管理;·集成了性能分析、波形比较、代码覆盖、数据流ChaseX、SignalSpy、虚拟对象VirtualObject、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能;·C和Tcl/Tk接口,C调试;·对SystemC的直接支持,和HDL任意混合;·支持SystemVerilog的设计功能;·对系统级描述语言的最全面支持,SystemVerilog,SystemC,PSL;·ASICSignoff。 基于此,本设计采用ModelSim软件对源代码进行仿真测试,仿真步骤如下:1.启动modelsim软件先在磁盘中建立工作文件夹,在modelsim中选择File->ChangeDirectory,在弹出的Choosefolder对话框中设置目录路径为工作文件夹路径。2.建立工程在modelsim中建立project,选择File->New->Project.在ProjectName栏中填写项目名字,建议和你的顶层文件名字一致。ProjectLocation是工作目录,可通过Brose按钮来选择或改变。DdfaultLibraryName可以采用工具默认的work。Workspace窗口的library中就会出现work库。3.为工程添加文件工程建立后,选择AddExsitingFile后,根据相应提示将文件加到该Project中4.编译文件编译(包括源代码和库文件的编译)。编译可点击ComlileComlileAll来完成。5.装载文件(1)双击libray中work中的装载测试代码文件(例中为count_tp)(2)点击simulate–startsimulation设置好之后点击ok6.开始仿真点击workspace下的sim,点击测试代码文件(count_tp),选择addaddtowave然后点run–all,开始仿真7.退出仿真在仿真调试完成后退出仿真,在主窗口中选择simulateendsimulation图3-1ModelSim测试环境使用界面

3.2模块仿真测试3.2.1(补码一位)乘法模块仿真测试modulemultiply_tp;reg[5:0]Mx,My;//测试尾数输入wire[9:0]Mout;//测试尾数输出parameterDElY=100;//时延量定义multiplytest(Mx,My,Mout);initialbegin#DElYMx=6'b110011;My=6'b110101;#DElYMx=6'b001010;My=6'b000011;#DElYMx=6'b110011;My=6'b001001;#DElYMx=6'b001111;My=6'b111111;#DElY$finish;endendmodule图3-2(补码一位)乘法模块编译情况图3-3(补码一位)乘法模块仿真波形图MxMyMout1100111101010010001111001010000011000001111011001100100111100010110011111111111111110001表3-1(补码一位)乘法模块测试用例 考虑测试的全面完整性,本测试将输入的Mx(被乘数变量),My(乘数变量)依次设置为负数与负数、正数与正数、负数与正数、正数与负数。测试结果表明,结果正确,乘法模块功能实现。3.2.2规格化模块仿真测试`timescale1ns/1nsmoduleSPEC_tp;reg[9:0]MIn;//测试尾数输入reg[3:0]EIn;//测试阶码输入wire[3:0]EOut;//测试阶码输出wire[9:0]MOut;//测试尾数输出parameterDELY=100;//时延量定义initialbeginEIn=4'd0;MIn=10'b0;#DELYEIn=4'b0100;MIn=10'b0010101010; #DELYEIn=4'b1001;MIn=10'b0111010100; #DELYEIn=4'b0110;MIn=10'b1000110100; #DELYEIn=4'b0011;MIn=10'b1110011010; #DELY$finish; end SPECm(.EIn(EIn),.MIn(MIn),.EOut(EOut),.MOut(MOut));endmodule图3-4规格化模块编译情况图3-5规格化模块仿真波形图MInEinEOutMOut0000000000000011110000000000001010101001000100001010101001110101001001101000111010101000110100001100101100110100表3-2规格化模块测试用例 本模块分别输入尾数符号为01,10的两组数据,测试规格化模块对正溢情况的处理能力。此外输入一组初始全零模块测试规格化模块对边界情况的处理能力,以及一组不需要规格化操作的数据,测试规格化模块功能是否正常。仿真结果表明,本模块功能正常实现。3.2.3加法模块仿真测试moduleadder_tp; reg[3:0]EX,EY;//测试阶码输入 wire[3:0]EOUT;//测试阶码输出parameterDELY=100;//时延量定义 addera_t(EX,EY,EOUT); initial begin EX=4’b0000;EY=4’b0000;#DELYEX={$random}%16;EY={$random}%16; #DELYEX={$random}%16;EY={$random}%16;#DELYEX={$random}%16;EY={$random}%16;#DELY$finish;endendmodule图3-6(阶码)加法模块编译情况图3-7(阶码)加法模块仿真波形图EXEYEOUT000000000000010000010101100100111100110111011010表3-3(阶码)加法模块测试用例 本测试调用系统函数,产生四组随机输入,保证测试的可靠性。仿真结果表明,本模块功能正常实现。3.3总测试(控制模块测试)modulerun_tp;reg[5:0]Mx,My;//测试浮点数尾数输入reg[3:0]E_X,E_Y;//测试浮点数阶码输入wire[9:0]M_out;//测试浮点数尾数输出wire[3:0]E_out;//测试浮点数阶码输出parameterDElY=100;//时延量定义runfloatx(Mx,My,E_X,E_Y,M_out,E_out);initialbegin#DElYMx=6'b110011;My=6'b110101;E_X=4'b0100;E_Y=4'b0110;#DElYMx=6'b001010;My=6'b001011;E_X=4'b0001;E_Y=4'b0101;#DElYMx=6'b110011;My=6'b001001;E_X=4'b0010;E_Y=4'b0100;#DElYMx=6'b001111;My=6'b110111;E_X=4'b0110;E_Y=4'b1000;#DElY$finish;endendmodule图3-8控制模块编译情况

图3-9控制模块仿真波形图图3-10总测试数据流图

MxMyE_XE_YM_outE_out1100111101010100011000100011111010001010001011000101010011011100010111001100100100100100110001011001010011111101110110100011011110011110表3-4控制模块(总模块)测试用例 本模块测试输入的被乘数与乘数分别为负数与负数,正数与正数,负数与正数,正数与负数,涵盖四种乘数可能性。仿真结果表明,本浮点乘法运算器设计功能成功实现!

第四章总结与展望4.1问题及解决方案总结4.1.1乘法模块编写问题编写问题:这个模块编写的主要问题集中在两点,一个是变量赋值问题,一个是运算符使用问题。(1)变量赋值部分,由于变量某些位数有特殊用途,最开始我们使用的是逐位赋值来给特定位赋值,导致代码臃肿,可读性较差。后来经过对verilog语法的仔细分析,我们该用位拼接运算符,有效地解决了这个问题。(2)运算符使用问题是一个细节性问题,在进行或运算时,我们在需要使用按位或运算符的地方不慎使用了一个逻辑或运算符,导致仿真结果一直不对。在没有找到问题所在的情况下,我们先后采用了单步仿真(将循环次数设置为1)和单句仿真(只保留一句功能语句)的方法,找到了问题之所在,解决了这个难题。4.1.2规格化模块编写问题编写问题:这个模块编写的主要问题是对溢出情况的处理问题。最开始我们的设计只考虑到尾数大小的规格化,所以本模块测试时没有问题,但是总体测试时就有结果异常的情况发生。经过仔细地分析,我们认为乘法运算结束后,可能有数值位溢出到了符号位的低位,所以规格化模块应该对溢出情况做判断处理。加入这个判断模块后,本模块功能得到了完善。4.2结论及展望 本次课程设计,通过使用硬件描述语言编写硬件程序,并进行仿真测试,我们证实,基于补码一位乘法的浮点乘法运算原理是正确的。在本次课程设计中,我们收获了很多,具体集中在以下几点:即使编写代码的整个逻辑是很清晰的,但是实际中要编写一段能正确运行和仿真的代码也并非水到渠成的事。需要有硬件编程的思维,准确地分析硬件程序中可能出现或忽略的问题,才能完成这个过程。硬件编程语言的细节性问题是需要重点考虑的。细小的运算符的使用不慎,可能导致程序测试始终得不到正确结果的问题。仿真测试代码的编写难度在某种程度上甚至大于功能代码的编写难度。因为,仿真测试代码必须完全匹配功能代码,稍有偏差,则会出现结果无法显示或者结果异常的情况发生。总的来说,这次课程设计,使得我们对浮点运算器,补码一位乘法等的原理了解更为清晰了。同时,我们使用硬件描述语言进行编程的能力也得到了提高。本次设计,我们采用了灵活的设计方案,使得运算位数可能更改而基本不需要修改功能代码。为我们以后的工作埋下了伏笔。我们准备在未来的时间里,将这个浮点运算器改造升级成16位甚至32位的运算器,来完成CPU中的相对大规模数据处理问题。参考文献[1]《计算机组成原理(第二版)》罗克露单立平刘辉俸志刚编电子工业出版社2021.2[2]《verilog数字系统设计(第二版)》夏宇闻编北京航空航天大学出版社2021.6致谢感谢XX老师和XX老师对本次课程设计的帮助!

社会实践报告系别:班级:学号:姓名:作为祖国未来的事业的继承人,我们这些大学生应该及早树立自己的历史责任感,提高自己的社会适应能力。假期的社会实践就是很好的锻炼自己的机会。当下,挣钱早已不是打工的唯一目的,更多的人将其视为参加社会实践、提高自身能力的机会。许多学校也积极鼓励大学生多接触社会、了解社会,一方面可以把学到的理论知识应用到实践中去,提高各方面的能力;另一方面可以积累工作经验对日后的就业大有裨益。进行社会实践,最理想的就是找到与本专业对口单位进行实习,从而提高自己的实战水平,同时可以将课本知识在实践中得到运用,从而更好的指导自己今后的学习。但是作为一名尚未毕业的大学生,由于本身具备的专业知识还十分的有限,所以我选择了打散工作为第一次社会实践的方式。目的在于熟悉社会。就职业本身而言,并无高低贵贱之分,存在即为合理。通过短短几天的打工经历可以让长期处于校园的我们对社会有一种更直观的认识。实践过程:自从走进了大学,就业问题就似乎总是围绕在我们的身边,成了说不完的话题。在现今社会,招聘会上的大字报都总写着“有经验者优先”,可还在校园里面的我们这班学子社会经验又会拥有多少呢?为了拓展自身的知识面,扩大与社会的接触面,增加个人在社会竞争中的经验,锻炼和提高自己的能力,以便在以后毕业后能真正真正走入社会,能够适应国内外的经济形势的变化,并且能够在生活和工作中很好地处理各方面的问题,我开始了我这个假期的社会实践-走进天源休闲餐厅。实践,就是把我们在学校所学的理论知识,运用到客观实际中去,使自己所学的理论知识有用武之地。只学不实践,那么所学的就等于零。理论应该与实践相结合。另一方面,实践可为以后找工作打基础。通过这段时间的实习,学到一些在学校里学不到的东西。因为环境的不同,接触的人与事不同,从中所学的东西自然就不一样了。要学会从实践中学习,从学习中实践。而且在中国的经济飞速发展,又加入了世贸,国内外经济日趋变化,每天都不断有新的东西涌现,在拥有了越来越多的机会的同时,也有了更多的挑战,前天才刚学到的知识可能在今天就已经被淘汰掉了,中国的经济越和外面接轨,对于人才的要求就会越来越高,我们不只要学好学校里所学到的知识,还要不断从生活中,实践中学其他知识,不断地从各方面武装自已,才能在竞争中突出自已,表现自已。在餐厅里,别人一眼就能把我人出是一名正在读书的学生,我问他们为什么,他们总说从我的脸上就能看出来,也许没有经历过社会的人都有我这种不知名遭遇吧!我并没有因为我在他们面前没有经验而退后,我相信我也能做的像他们一样好.我的工作是在那做传菜生,每天9点钟-下午2点再从下午的4点-晚上8:30分上班,虽然时间长了点但,热情而年轻的我并没有丝毫的感到过累,我觉得这是一种激励,明白了人生,感悟了生活,接触了社会,了解了未来.在餐厅里虽然我是以传菜为主,但我不时还要做一些工作以外的事情,有时要做一些清洁的工作,在学校里也许有老师分配说今天做些什么,明天做些什么,但在这里,不一定有人会告诉你这些,你必须自觉地去做,而且要尽自已的努力做到最好,一件工作的效率就会得到别人不同的评价。在学校,只有学习的氛围,毕竟学校是学习的场所,每一个学生都在为取得更高的成绩而努力。而这里是工作的场所,每个人都会为了获得更多的报酬而努力,无论是学习还是工作,都存在着竞争,在竞争中就要不断学习别人先进的地方,也要不断学习别人怎样做人,以提高自已的能力!记得老师曾经说过大学是一个小社会,但我总觉得校园里总少不了那份纯真,那份真诚,尽管是大学高校,学生还终归保持着学生的身份。而走进企业,接触各种各样的客户、同事、上司等等,关系复杂,但我得去面对我从未面对过的一切。记得在我校举行的招聘会上所反映出来的其中一个问题是,学生的实际操作能力与在校理论学习有一定的差距。在这次实践中,这一点我感受很深。在学校,理论的学习很多,而且是多方面的,几乎是面面俱到;而在实际工作中,可能会遇到书本上没学到的,又可能是书本上的知识一点都用不上的情况。或许工作中运用到的只是很简单的问题,只要套公式似的就能完成一项任务。有时候我会埋怨,实际操作这么简单,但为什么书本上的知识让人学得这么吃力呢?这是社会与学校脱轨了吗?也许老师是正确的,虽然大学生生活不像踏入社会,但是总算是社会的一个部分,这是不可否认的事实。但是有时也要感谢老师孜孜不倦地教导,有些问题有了有课堂上地认真消化,有平时作业作补充,我比一部人具有更高的起点,有了更多的知识层面去应付各种工作上的问题,作为一名大学生,应该懂得与社会上各方面的人交往,处理社会上所发生的各方面的事情,这就意味着大学生要注意到社会实践,社会实践必不可少。毕竟,很快我就不再是一名大学生,而是社会中的一分子,要与社会交流,为社会做贡献。只懂得纸上谈兵是远远不及的,以后的人生旅途是漫长的,为了锻炼自己成为一名合格的、对社会有用的人才.很多在学校读书的人都说宁愿出去工作,不愿在校读书;而已在社会的人都宁愿回校读书。我们上学,学习先进的科学知识,为的都是将来走进社会,献出自己的一份力量,我们应该在今天努力掌握专业知识,明天才能更好地为社会服务。实践心得:虽然这次的实践只有短短的几天,而且从事的是比较简单的服务工作,但是通过与各种各样的人接触,还是让我学会了很多道理。首先是明白了守时的重要性。工作和上学是两种完全不同的概念,上学是不迟到很多时候是因为惧怕老师的责怪,而当你走上了工作岗位,这里更多的是由于自己内心的一种责任。这种责任是我学会客服自己的惰性,准时走上自己的岗位。这对我以后的学习生活也是一种鞭策,时刻牢记自己的责任,并努力加强自己的时间观念。其次让我真实的体会到了合作的重要性。虽然我工作的只是小小的一家餐厅,但是从点单到制作到递送到结帐这一环环的工作都是有分工的,只有这样才能使整家店的工作效率都大大的提高。以前虽然在书上看见过很多的团队合作的例子,但这一次是深刻的体会到了,正所谓“众人拾柴火焰高”,“团结就是力量”。在以后的学习和工作中,一定会要牢记这一点,将自己融入到集体中,和大家一起携手走向辉煌。再次,这次打工的经历也让我的心理更加趋于成熟。在餐厅里每天面对形形色色的客人,重复着单调的工作。让从未涉世的我还是有那么一点点不适应的,但是坚持就是胜利。打工毕竟和在家是完全不同的概念,我们学会需要忍耐,需要学会承受,需要学会坚持。将自己这短短的一月的实践同理论相联系,我了解到当代大学生与以往的大学生相比较,求学经历、生活条件、所处社会大环境都相对优越,也没有经过必要的挫折教育,因此,意志往往比较脆弱,克服困难的能力也较差,常常是对社会的要求较高,对自我的要求较低。大学生的责任意识日益成为社会关注的热点问题,责任意识和诚信意识成为不少地方采用人才的两个新标准。大学生参与社会实践是促进大学生素质教育,加强和改进青年学生思想政治工作,引导学生健康成长和成才的重要举措,是学生接触社会、了解社会、服务社会,培养创新精神、实践能力和动手操作能力的重要途径。对于当代大学生来说,应当刻苦学习专业知识,不断提高综合素质和运用知识的技能。从大学生活的开始到走进社会的大圈子中,就只有短短的几年时间,谁不想在将来的社会中能有一席之地呢?所以大家认为大学生必须投身校园内外的各类实践活动,有助于锻炼品质,提高能力。可见其对大学生综合素质的提高有不可抵触的重要性。不能否认有过打工经历的同学,看起来要比其它同学更成熟、社会适应力更强,但对于学生,社会适应力只是一方面的衡量指标,大学期间主要的任务是学业结构的搭建,即知识结构、专业结构的搭建,为了打工影响甚至放弃了专业知识的学习,结果是得不偿失的。实践出真知,社会实践活动是大学生活的重要组成部份,培养当代大学生的历史使命感、社会责任感和积极向上的精神风貌,充分发挥实践育人的作用,提高大学生的综合素质,也是检验所学理论知识的标准,社会实践不但为大学生提供了一个发挥自我才能,展现自我风采的舞台,也是培养和锻炼同学们综合能力的一个阶梯,更是一个大学生进入社会,走上工作岗位前的演练场地。社会实践活动,从而确定比较正确的人生前进方向。河南理工大学计算机科学与技术学院实习报告20—20学年第学期实习名称生产实习实习地点实习日期学生姓名学号专业班级指导教师20**年**月**日一、实习基本情况20**年**月通过网络招聘,我应聘到河南中方纺业有限公司进行实习,该公司位于周口市,主要承担棉纺制造与销售工作,进入公司后我被分配到信息管理部门,主要从事的工作是对公司的网络进行管理与维护,同时对公司网站的管理与维护进行学习,三个月的实习让学会了从不同的角度去看待问题和解决问题,对

温馨提示

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

评论

0/150

提交评论