EDA实验六131521_eda实验六

2020-02-28 其他范文 下载本文

EDA实验六131521由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“eda实验六”。

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

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

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

2.实验方法:使用乘法器lpm_mult2、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;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 将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)总图(2)乘法器lpm_mult0

(3)8位加法器ADDER8B

(4)计数器cnt16(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班)——科学出版社四:附录

1.实验电路结构图

2.GW48系统引脚对照表

五.心得体会

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

《EDA实验六131521.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
EDA实验六131521
点击下载文档
相关专题 eda实验六 EDA eda实验六 EDA
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文