EDA乘法器设计report.doc_第1页
EDA乘法器设计report.doc_第2页
EDA乘法器设计report.doc_第3页
EDA乘法器设计report.doc_第4页
EDA乘法器设计report.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

哈尔滨工业大学(威海)信息科学与工程学院EDA课程设计报告有符号5位整数乘法器设计与制作指导老师 : 学生班级 :0702102 学生姓名 : 学生学号 :070210205 2010年5月23日目 录一、设计的性质、目的和任务- 4 -二、课程设计要求- 4 -三、整体设计思路- 4 -方案一- 4 -方案二- 5 -方案三- 5 -四、各模块的设计- 6 -1、 输入模块- 6 -(1)设计原理及硬件配置说明- 6 -(2)代码设计- 6 -(3)生成模块- 6 -(4)仿真波形- 7 -2、输入LED显示模块- 7 -(1)设计原理- 7 -(2)程序代码设计- 8 -(3)生成模块- 8 -(4)仿真波形- 8 -3、数符分离部分- 8 -(1)设计原理- 8 -(2)程序代码设计- 9 -(3)生成模块- 9 -(4)仿真波形- 9 -4、乘法模块:- 10 -方案一- 10 -方案二- 11 -(1)设计原理- 11 -(2)程序代码设计- 11 -(3)生成模块- 12 -(4)仿真波形- 12 -方案三- 13 -(1)设计原理- 13 -(2)代码设计- 13 -(3)生成模块- 14 -(4)仿真波形- 14 -5、输出显示- 15 -方案一- 15 -(1)设计原理- 15 -(2)程序代码设计- 15 -(3)生成模块- 16 -方案二- 17 -(1)设计原理- 17 -(2) 程序代码设计- 17 -(3) 生成模块- 18 -(4) 仿真波形- 18 -方案三- 18 -(1)设计原理- 18 -(2)程序代码设计- 18 -(3)生成模块- 20 -(4)仿真波形- 20 -6、译码驱动数码管显示- 20 -(1)设计原理- 20 -(2)程序代码设计- 20 -(3)生成模块- 22 -7、结果符号显示- 22 -(1)设计原理- 22 -(2)程序代码设计- 22 -(3)生成模块- 23 -五、整体模块合成- 23 -(1)程序框图- 23 -(2)系统仿真波形- 24 -六、调试中遇到的问题及解决的方法- 24 -七、设计心得- 24 -八、参考文献- 24 -一、设计的性质、目的和任务1、创新精神和实践能力二者之中,实践能力是基础和根本。这是由于创新基于实践、源于实践,实践出真知,实践检验真理。实践活动是创新的源泉,也是人才成长的必由之路。通过课程设计的锻炼,要求学生掌握电路的一般设计方法,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,培养我们的创新精神。2、熟练使用以ALTERA公司开发的MAX+PLUS2软件平台,掌握EDA的基本设计流程,熟悉VHDL语言的设计方法。3、利用该软件进行可编程逻辑器件设计,完成有符号5位整数乘法器的逻辑仿真功能,并下载到实验箱进行调试和验证所设计的乘法器的功能。二、课程设计要求设计一个两个5位数相乘的乘法器。用发光二极管显示输入数值,用7段显示器显示结果。乘数和被乘数分两次输入。三、整体设计思路方案一输入数据后,直接通过LED显示,并同时译码显示。数据在乘法模块中运算后直接将结果译码显示。 由于此方案未考虑实验箱数码管数量,硬件资源不足,故最终未采用此方案。但进行了程序编译和软件仿真,作为对VHDL语言的练习和MAXPLUS软件的熟悉。生成的原理图文件如下:方案二作为练习后的正式设计,我进行了较为全面的了解,查阅了大量资料,也选择了功能几近完美的乘法器设计。经过了艰苦的设计仿真,我在离成功仅一步之遥的地方卡住了。此方案所使用的逻辑单元超出了试验箱所提供的EPM7128SSLC84-15芯片逻辑单元数量,系统仿真时出现问题。虽然也可以下载,但是可能因为资源冲突,运行出错。经过很多的努力,仍然无法满足要求。由于时间问题,我不得不忍痛放弃此设计方案。方案三这是一个在方案二的基础上简化而来的设计。在有限的硬件资源下,实现了设计要求,获得满意的软件及硬件仿真效果。故最终采用了此方案。其具体设计原理如下:首先,分两次输入两个五位二进制数,作为乘数和被乘数。同时通过LED灯显示输入的二进制数。首位为符号位,后四位为数值,在输入模块中,将符号位与数值位分开。符号位单独运算,并直接通过一个数码管显示。将数值输入乘法运算模块。通过二进制转化十进制进行输出,输入到数码管显示。总体框图如下:输入乘数及被乘数乘法运算符号分 离符号显示 输出数码管显示输入LED 显示四、各模块的设计 1、 输入模块(1)设计原理及硬件配置说明 操作数分为两次输入,设计I4.0依次由K4,K5,K6,K7,K8定义,其中K4为符号位,其余四位为数据位。K1作为乘数输入使能端,当K1有效时,将I4.0 中数据作为乘数输入到寄存器中;K2作为被乘数输入使能端,当K2有效时,将I4.0 中数据作为被乘数输入到寄存器中。(2)代码设计USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY IN_PUT IS PORT(EA,EB,CLK:IN STD_LOGIC; I:IN STD_LOGIC_VECTOR(4 DOWNTO 0); A,B:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);END IN_PUT;ARCHITECTURE behave OF IN_PUT IS BEGIN PROCESS(EA,EB,I,CLK) BEGIN IF CLKEVENT AND CLK=1 THEN IF EA=1 THEN A=I; -ELSE NULL; END IF; IF EB=1 THEN B=I; -ELSE NULL; END IF; END IF; END PROCESS;END behave;(3)生成模块 (4)仿真波形在脉冲上升沿:EA=1时,输入10010;EB=1时,输入01010。则,A=10010,B=01010。2、输入LED显示模块(1)设计原理由于试验箱中LED低电平有效,为了实现在输入1时LED灯亮,故需要将输入取反后驱动LED。(2)程序代码设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LED ISPORT( SR:IN STD_LOGIC_VECTOR(4 DOWNTO 0); LR:OUT STD_LOGIC_VECTOR(4 downto 0);end LED;ARCHITECTURE behave OF LED IS BEGIN LR=not SR; END behave;(3)生成模块(4)仿真波形3、数符分离部分(1)设计原理将输入进来的两个数的数值部分与符号部分分离,分离出的符号进行异或操作后得到最终的符号,数值部分作为下一模块的输入。(2)程序代码设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SEP ISPORT(A,B:IN STD_LOGIC_VECTOR(4 DOWNTO 0); FH:OUT STD_LOGIC; C,D:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END SEP;ARCHITECTURE behave OF SEP IS BEGIN - PROCESS - BEGIN C=A(3 DOWNTO 0); D=B(3 DOWNTO 0); FH=A(4) XOR B(4); - END PROCESS;END behave;(3)生成模块(4)仿真波形4、乘法模块: 方案一(1)利用移位相加原理,将上一模块输入的两个数值进行相乘操作。乘数被乘数移位寄存移位寄存相乘逻辑累加器结果寄存时钟利用累加器来完成,即每一步中一个4位加法器可用来计算其新的部分乘积。方案二(1)设计原理首先由右至左一次检查乘数位是否为1,如为1,将被乘数做适当的移位至适当的位置;如为0,将0放置适当位置。其次将所有移位被乘数求和就为所求子积。例如1101*1111A7 A6 A5 A4 A3 A2 A1 A0 1 1 0 1 1 1 0 1 - 0 1 1 0 1 - 0 0 1 1 0 1 - 0 0 0= 1 1 0 0 0 0 1 1 最终符号采用两个符号 “异或”逻辑得到。(2)程序代码设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUL IS PORT(X,Y:IN STD_LOGIC_VECTOR(3 DOWNTO 0); Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END MUL;ARCHITECTURE behave OF MUL IS SIGNAL R1:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL R2:STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL R3:STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL R4:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGIN PROCESSBEGIN IF Y(0)=1 THEN R1=X; ELSIF Y(0)=0 THEN R1=0000; END IF; IF Y(1)=1 THEN R2=X&0; ELSIF Y(1)=0 THEN R2=00000; END IF; IF Y(2)=1 THEN R3=X&00; ELSIF Y(2)=0 THEN R3=000000; END IF; IF Y(3)=1 THEN R4=X&000; ELSIF Y(3)=0 THEN R4=0000000; END IF; Q=R1+R2+R3+R4; END PROCESS;END behave;(3)生成模块(4)仿真波形方案二虽然功能完美,编译和仿真都很完美。可是在最后整体实现时逻辑单元不足,我放弃了此方案,实现了对整体逻辑的压缩。方案三(1)设计原理调用库函数,实现乘法运算功能。 (2)代码设计LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY lpm;USE lpm.lpm_components.all;ENTITY mul ISPORT(dataa: IN STD_LOGIC_VECTOR (3 DOWNTO 0);datab: IN STD_LOGIC_VECTOR (3 DOWNTO 0);result: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END mul;ARCHITECTURE SYN OF mul ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (7 DOWNTO 0);COMPONENT lpm_multGENERIC (LPM_WIDTHA: NATURAL;LPM_WIDTHB: NATURAL;LPM_WIDTHP: NATURAL;LPM_WIDTHS: NATURAL;INPUT_B_IS_CONSTANT: STRING;LPM_REPRESENTATION: STRING;USE_EAB: STRING);PORT (dataa: IN STD_LOGIC_VECTOR (3 DOWNTO 0);datab: IN STD_LOGIC_VECTOR (3 DOWNTO 0);result: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;BEGINresult 4,LPM_WIDTHB = 4,LPM_WIDTHP = 8,LPM_WIDTHS = 8,INPUT_B_IS_CONSTANT = NO,LPM_REPRESENTATION = UNSIGNED,USE_EAB = OFF)PORT MAP (dataa = dataa,datab = datab,result = sub_wire0);END SYN;(3)生成模块(4)仿真波形5、输出显示:方案一(1)设计原理十六进制显示。此方案简单,数制无需转换。(2)程序代码设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY out_display_hex IS PORT ( A:IN STD_LOGIC_VECTOR(7 DOWNTO 0); B:IN STD_LOGIC; REG0,REG1,REG2:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END out_display_hex;ARCHITECTURE behave OF out_display_hex IS SIGNAL L:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL H:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(A,B) BEGIN L(3 DOWNTO 0)=A(3 DOWNTO 0); H(3 DOWNTO 0)REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG0REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG1REG2REG2REG2=1111111; END CASE; END PROCESS;END behave;(3)生成模块 方案二(1)设计原理方案一虽然简单,可是与题目的要求有些差距。所以我又进行了进一步的编程。通过将二进制转换为十进制,分离出个十百位,实现后续的十进制显示。(2) 程序代码设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;Entity bcd isPort(d : in std_logic_vector(7 downto 0); Clk : in std_logic; q1,q2,q3 : out std_logic_vector(3 downto 0) );End bcd;Architecture a of bcd is Begin process(d) variable t1,t2,t3:std_logic_vector(3 downto 0);begin if d(3 downto 0)10 then t1:=t1-10; t2:=t2+1; end if; if t210 then t2:=t2-10; t3:=t3+1; end if; q1=t1; q2=t2; q3=t3;end process;End a;(3) 生成模块(4) 仿真波形方案三(1)设计原理方案二虽然实现了功能,而且独立模块仿真也满足要求。可是由于硬件资源问题。我不得不进一步压缩程序。最后,选择了相对节省资源的Verilog语言,实现了整体要求。(2)程序代码设计module bcd(in,count1,count2,num3,clk);input 7:0in;input clk;output 3:0count1,count2,num3;reg 7:0num1,num2;reg 3:0count1,count2;reg 1:0state;reg 3:0num3;integer i,j;parameter s0=0,s1=1,s2=2;always (posedge clk)begincase(state)s0:begini=0;j=0;state=s1;num1=in;ends1:begini=i+1;case(num1100)1:begincount1=(i-1);state=2;num2=num1;end0: num1=num1-100;endcaseends2:beginj=j+1;case(num2D1D1D1D1D1D1D1D1D1D1D1D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3D3D3D3=11000000; END CASE;END PROCESS;END BEHAVE;(3)生成模块7、结果符号显示(1)设计原理结果符号只有两种。我使用“-”来表示符号,不显示表示正号。程序代码设计很简单。 (2)程序代码设计LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DISPLAY_FH IS PORT(FH:IN STD_LOG

温馨提示

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

最新文档

评论

0/150

提交评论