人人范文网 范文大全

EDA实验六131521

发布时间:2020-03-03 11:31:48 来源:范文大全 收藏本文 下载本文 手机版

《电子设计自动化实验》课程设计

题 目: 十六位硬件乘加器电路 姓 名: 江 璐 学院班级: 13级电子信息工程2班 学 号: 1315212017 指导老师: 邱应强老师 时 间: 20151122 目 录 一:摘要……………………………………………………3 二: 正文……………………………………………………3 (一)系统设计………………………………………………3 (二)单元电路设计…………………………………………4 (三)仿真结果………………………………………………9 (四)软件设计………………………………………………11 (五)系统测试………………………………………………11 (六)结论……………………………………………………14 三:参考文献………………………………………………14 四:附录……………………………………………………15 六:心得体会………………………………………………16

2 一:摘要

1.实验要求:采用并行、串行或流水线方式来实现对8个16位数据进行乘法和加法运算(yout=a0b0+a1b1+a2b2+a3b3),位宽16位。

2.实验方法:使用乘法器lpm_mult

2、16位加法器ADDER16B、计数器cnt16以及锁存器en_dff四个模块。当clock出现上升沿时,对输入端输入的两个数dataa、datab进行乘法运算。将结果输入锁存器中,锁存上一阶段计算得到的值, 16位加法器ADDER16B将锁存器锁存的上一阶段的值与进行完乘法计算得到的值dataa*datab加起来,并输出结果。计数器cnt16用于区分四组乘加所得数,当有一个上升沿脉冲送入cnt16时,若计数不到5,则进行计数+1,若计数达到5,COUT输出进位信号到锁存器en_dff的reset端口,将锁存器复位清零,重新进行计数。

3.实验结论:经过仿真与硬件测试检验后证实可行,但是是对8个8位数据进行乘法和加法运算。

二:正文

(一)系统设计

1.设计要求

采用并行、串行或流水线方式来实现对8个16位数据进行乘法和加法运算(yout=a0*b0+a1*b1+a2*b2+a3*b3),位宽16位。

2.系统设计方案

(1)系统设计思路:由十六位加法器构成以时序逻辑方式设计的十六位乘加器,流水线方式 ,以移位加法为核心器件。 (2)总体方案的论证与比较

方案一:采用四个乘法器,以串行方式输入各数据。

方案二:采用一个乘法器,先输入两数据进行运算,将得到结果保存,并与下一组乘法运算得到的结果相加。

方案的选择:第一种方案浪费大量的资源,考虑到实验箱条件限制,采用第二种方案。尽管速度较慢,但可省下相当多的资源,并且实验室可以实现。 (3)各功能块的划分与组成

3 共有4个设计模块,分别是乘法器lpm_mult0、16位加法器ADDER16B、计数器cnt16以及锁存器en_dff。 (4)系统的工作原理

以上是电路原理图。乘数dataa与被乘数datab输入乘法器lpm_mult0中,当START有上升沿出现时,乘法器计算出dataa*datab的结果并有result[15..0]输出。result[15..0]输出的结果送入8位加法器ADDER8B的A[15..0]输入端,加法器的B[15..0]输入端连接到锁存器en_dff的输出端q[15..0],这样锁存器锁存的值就可以与加法器所得到的值相加,得到两对乘法计算后值得和,以此类推,可以得到不断累加的值。而CIN端口接地,这样可以确保CIN端口不影响加法器的计算。加法器计算A[15..0](dataa*datab)和锁存器锁存的值B[15..0]的和从输出端S[15..0]输出,输入锁存器en_dff的输入端d[15..0],将数值锁存起来,同时输出端S[15..0]接到输出端YOUT[15..0],从而从仿真中可以看到每一阶段累加的结果。而计数器cnt16的作用是区分四组乘加所得数与四组乘加所得数。EN接高电平,rst接低电平,保证计数器可用,clk接到START,每当有一个上升沿脉冲送入cnt16时,若计数不到5,则进行计数+1,若计数达到5,COUT输出进位信号到锁存器en_dff的reset端口,将锁存器复位清零,重新进行计数。

(二)单元电路设计

总共有四大模块,分别为乘法器lpm_mult0、16位加法器ADDER16B、计数器cnt16以及锁存器en_dff。

1.乘法器lpm_mult0:当clock出现上升沿时,对输入端输入的两个数dataa、datab进行乘法运算。 程序:

-- megafunction wizard: %LPM_MULT% 4 -- GENERATION: STANDARD -- VERSION: WM1.0 -- MODULE: lpm_mult -- ============== -- File Name: lpm_mult0.vhd -- Megafunction Name(s): -- -- -- Simulation Library Files(s): -- lpm -- ============== -- ************************************************************ -- THIS IS A WIZARD-GENERATED FILE.DO NOT EDIT THIS FILE! -- -- 7.2 Build 151 09/26/2007 SJ Full Version -- ************************************************************ --Copyright (C) 1991-2007 Altera Corporation --Your use of Altera Corporation\'s design tools, logic functions --and other software and tools, and its AMPP partner logic --functions, and any output files from any of the foregoing --(including device programming or simulation files), and any --aociated documentation or information are exprely subject --to the terms and conditions of the Altera Program License --Subscription Agreement, Altera MegaCore Function License --Agreement, or other applicable license agreement, including, --without limitation, that your use is for the sole purpose of --programming logic devices manufactured by Altera and sold by --Altera or its authorized distributors.Please refer to the --applicable agreement for further details.LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY lpm; USE lpm.all; ENTITY lpm_mult0 IS PORT (

); END lpm_mult0; ARCHITECTURE SYN OF lpm_mult0 IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR (15 DOWNTO 0); clock dataa datab result

: IN STD_LOGIC ;

: IN STD_LOGIC_VECTOR (7 DOWNTO 0); : IN STD_LOGIC_VECTOR (7 DOWNTO 0); : OUT STD_LOGIC_VECTOR (15 DOWNTO 0) lpm_mult 5 COMPONENT lpm_mult GENERIC (

); PORT (

); END COMPONENT; BEGIN result

) PORT MAP (

); END SYN; -- ============== -- CNX file retrieval info -- ============== -- Retrieval info: PRIVATE: AutoSizeResult NUMERIC \"1\" -- Retrieval info: PRIVATE: B_isConstant NUMERIC \"0\" -- Retrieval info: PRIVATE: ConstantB NUMERIC \"0\" -- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING \"Cyclone II\" -- Retrieval info: PRIVATE: LPM_PIPELINE NUMERIC \"1\" dataa => dataa, datab => datab, clock => clock, result => sub_wire0 lpm_hint => \"DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5\", lpm_pipeline => 1, lpm_representation => \"UNSIGNED\", lpm_type => \"LPM_MULT\", lpm_widtha => 8, lpm_widthb => 8, lpm_widthp => 16

dataa datab clock result

: IN STD_LOGIC_VECTOR (7 DOWNTO 0); : IN STD_LOGIC_VECTOR (7 DOWNTO 0); : IN STD_LOGIC ;

: OUT STD_LOGIC_VECTOR (15 DOWNTO 0) lpm_hint

: STRING;

: NATURAL;

: STRING; lpm_pipeline lpm_type lpm_widtha lpm_widthb lpm_widthp lpm_representation

: STRING;

: NATURAL; : NATURAL; : NATURAL 6 -- Retrieval info: PRIVATE: Latency NUMERIC \"1\" -- Retrieval info: PRIVATE: OptionalSum NUMERIC \"0\" -- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING \"1\" -- Retrieval info: PRIVATE: SignedMult NUMERIC \"0\" -- Retrieval info: PRIVATE: USE_MULT NUMERIC \"1\" -- Retrieval info: PRIVATE: ValidConstant NUMERIC \"0\" -- Retrieval info: PRIVATE: WidthA NUMERIC \"8\" -- Retrieval info: PRIVATE: WidthB NUMERIC \"8\" -- Retrieval info: PRIVATE: WidthP NUMERIC \"16\" -- Retrieval info: PRIVATE: WidthS NUMERIC \"1\" -- Retrieval info: PRIVATE: aclr NUMERIC \"0\" -- Retrieval info: PRIVATE: clken NUMERIC \"0\" -- Retrieval info: PRIVATE: optimize NUMERIC \"0\" -- Retrieval

info:

CONSTANT:

LPM_HINT

STRING \"DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5\" -- Retrieval info: CONSTANT: LPM_PIPELINE NUMERIC \"1\" -- Retrieval info: CONSTANT: LPM_REPRESENTATION STRING \"UNSIGNED\" -- Retrieval info: CONSTANT: LPM_TYPE STRING \"LPM_MULT\" -- Retrieval info: CONSTANT: LPM_WIDTHA NUMERIC \"8\" -- Retrieval info: CONSTANT: LPM_WIDTHB NUMERIC \"8\" -- Retrieval info: CONSTANT: LPM_WIDTHP NUMERIC \"16\" -- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock -- Retrieval info: USED_PORT: dataa 0 0 8 0 INPUT NODEFVAL dataa[7..0] -- Retrieval info: USED_PORT: datab 0 0 8 0 INPUT NODEFVAL datab[7..0] -- Retrieval info: USED_PORT: result 0 0 16 0 OUTPUT NODEFVAL result[15..0] -- Retrieval info: CONNECT: @dataa 0 0 8 0 dataa 0 0 8 0 -- Retrieval info: CONNECT: result 0 0 16 0 @result 0 0 16 0 -- Retrieval info: CONNECT: @datab 0 0 8 0 datab 0 0 8 0 -- Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0 -- Retrieval info: LIBRARY: lpm lpm.lpm_components.all -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.vhd TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.inc FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.cmp TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.bsf TRUE FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_inst.vhd FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_waveforms.html TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_wave*.jpg FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_syn.v TRUE -- Retrieval info: LIB_FILE: lpm

2.16位加法器ADDER16B:将锁存器锁存的上一阶段的值与进行完乘法计算得到的值dataa*datab加起来,并输出结果。 程序:

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;

7 USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADDER16B IS PORT( CIN:IN STD_LOGIC; A,B :IN STD_LOGIC_VECTOR(15 DOWNTO 0); S :OUT STD_LOGIC_VECTOR(15 DOWNTO 0); COUT:OUT STD_LOGIC); END ADDER16B; ARCHITECTURE behav OF ADDER16B IS SIGNAL SINT,AA,BB:STD_LOGIC_VECTOR(16 DOWNTO 0); BEGIN AA

3.计数器cnt16:区分每两组乘加所得数。clk接到START,每当有一个上升沿脉冲送入cnt16时,若计数不到5,则进行计数+1,若计数达到5,COUT输出进位信号到锁存器en_dff的reset端口,将锁存器复位清零,重新进行计数。 程序:

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt16 IS PORT(CLK,RST,EN:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT:OUT STD_LOGIC); END cnt16; ARCHITECTURE behav OF cnt16 IS BEGIN PROCESS(CLK,RST,EN) vARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST=\'1\' THEN CQI:=(OTHERS=>\'0\'); ELSIF CLK\'EVENT AND CLK=\'1\'THEN IF EN=\'1\' THEN IF CQI \'0\'); END IF; END IF; END IF; IF CQI=5 THEN COUT

library ieee; use ieee.std_logic_1164.all; entity en_dff is port (d: in std_logic_VECTOR(15 DOWNTO 0); reset,EN,clk:in std_logic; q: buffer std_logic_VECTOR(15 DOWNTO 0)); end en_dff; architecture behavior of en_dff is begin proce (reset,clk) begin if reset=\'1\' then q

(三)仿真结果

(1)乘法器

给clock一个时钟信号,验证得当clock处于上升沿时result=dataa*datab

(2)16位加法器ADDER16B

9 将CIN接低电平,随意设置A、B的值,S为A、B的和。

(3)计数器cnt16 给CLK一个时钟信号。首先将RST置低电平,EN置高电平,验证计数器的计数功能。再分别将RST置高电平、EN置低电平,验证计数器的复位清零以及使能端控制功能。

(4)锁存器en_dff 给clk一个时钟信号。当reset=1时,锁存器清零,当reset=0时有上升沿且使能端EN=1时,d锁存进锁存器中;当有上升沿但是使能端EN=0时,d值不锁存进锁存器中,锁存器的值不改变。

(四)软件设计

1.软件设计平台:QuartusII 7.2 2.实现方法:通过QuartusII 7.2进行VHDL语言编程、方阵、引脚配置,然后烧入 GW48实验平台,选择模式NO.1,进行硬件验证。

3.程序的流程方框图:

4.实现的功能:位宽16位;能对8个16位数据进行乘法和加法运算(yout=a0*b0+a1*b1+a2*b2+a3*b3),并行、串行或流水线方式。

(五)系统测试

1.系统的性能指标 (1)总图

11 (2)乘法器lpm_mult0

(3)8位加法器ADDER8B

(4)计数器cnt16

12 (5)锁存器en_dff

2.功能仿真

3.引脚绑定

确定波形仿真成功后,再配置管脚,将程序烧录进EP2C5T144C8中,进行测试。选择模式1,管脚配置图如下(START设置为键8,使得人为可控,更方便调试)

(六)结论

根据硬件验证:键1和键2输入一个十六位数,键3和键4输入另一个十六位数,数码管

1、2显示第一个数,

3、4显示第二个数,键8是运算键,每点击一次运算一次,为一组运算,运算结果显示在数码管

5、

6、

7、8,将显示这两个数的积,再次输入两个十六位数,数码管

5、

6、

7、8将显示这两个数的积与前一组数积的和,依次输入四组十六位数,完成一次十六位乘加的运算,且结果显示在数码管

5、

6、

7、8。能够实现对8个16位数据进行乘法和加法运算(yout=a0*b0+a1*b1+a2*b2+a3*b3)

三:参考文献

潘松,黄继业.EDA技术与VHDL(第3版)——清华大学出版社

潘松,黄继业.EDA技术实用教程—VHDL版(第4班)——科学出版社

14 四:附录

1.实验电路结构图

2.GW48系统引脚对照表

五.心得体会

本次的课程设计选题时间较短,由于不怎么会写程序,所以乘法器使用Quartus II生成,而其他模块是在网上找的资料,自己输入编译反复修改而成。总体来说过程比较顺利,但不足之处是不能完全实现设计要求。

EDA实验4lxm

EDA实验总结报告

EDA分频器实验教案

EDA实验总结(材料)

EDA实验二总结报告

EDA可编程逻辑器件实验心得体会完整版

EDA技术基础实验教案

实验六教案

生态学实验六

六、设计实验

EDA实验六131521
《EDA实验六131521.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题 eda实验六 EDA
点击下载本文文档