EDA实验六131521_eda实验六
EDA实验六131521由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“eda实验六”。
《电子设计自动化实验》课程设计
题 目: 十六位硬件乘加器电路 姓 名: 江 璐 学院班级: 13级电子信息工程2班 学 号: 1315212017 指导老师: 邱应强老师 时 间: 20151122 目 录 一:摘要……………………………………………………3 二: 正文……………………………………………………3(一)系统设计………………………………………………3(二)单元电路设计…………………………………………4(三)仿真结果………………………………………………9(四)软件设计………………………………………………11(五)系统测试………………………………………………11(六)结论……………………………………………………14 三:参考文献………………………………………………14 四:附录……………………………………………………15 六:心得体会………………………………………………16 一:摘要
1.实验要求:采用并行、串行或流水线方式来实现对8个16位数据进行乘法和加法运算(yout=a0b0+a1b1+a2b2+a3b3),位宽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生成,而其他模块是在网上找的资料,自己输入编译反复修改而成。总体来说过程比较顺利,但不足之处是不能完全实现设计要求。