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