十六位硬件乘法器 设计报告
- 格式:docx
- 大小:657.73 KB
- 文档页数:13
EDA课程设计16位(8x8)硬件乘法器设计学校:华侨大学学院:信息与工程学院班级:10集成姓名:项传煜学号:1015251031老师:凌朝东目录摘要一.设计要求二.正文2.1. 系统设计2.1.1 系统设计方案 (3)2.1.2 系统设计原理 (4)2.2. 各子模块设计2.2.1 十进制加计数器设计 (5)2.2.2 BCD码转二进制码BCD_B的设计 (5)2.2.3 8位移位寄存器reg_8的设计 (6)2.2.4 8位加法器adder_8的设计 (7)2.2.5 1位乘法器multi_1的设计 (7)2.2.6 16位移位寄存器reg_16的设计 (8)2.2.7 16位二进制转BCD码B_BCD的设计 (9)2.3. 软件设计2.3.1 设计平台和开发工具 (10)2.3.2 程序流程方框图 (10)2.3.3 实现功能 (11)2.3.4 8位乘法器的顶层设计 (11)2.4. 系统测试2.4.1 乘法器使用 (13)2.4.2 仪器设备 (13)2.4.3 测试数据 (14)2.5. 结论 (14)三.测试结果仿真图 (14)四.参考文献 (15)五.附录:设计说明书及使用说明书 (15)摘要本设计通过对一个8×8的二进制乘法器的设计,学习利用VHDL语言来描述简单的算法,掌握利用移位相加方法实现乘法运算的基本原理。
在此次设计中该乘法器是由十进制计数器,BCD码(输入)转二进制码,8位寄存器,8位加法器,16位寄存器,8x1乘法器,二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。
设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。
16×16位移位相加乘法器设计(总40页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除本科学生毕业论文 2012年 6 月 13日论文题目: 16×16位移位相加乘法器设计 学院: 电子工程学院 年 级:2009级 专 业:集成电路设计与集成系统 姓 名:于昊 学 号:指导教师: 曹贝摘要随着集成电路设计技术的不断进步,乘法器的芯片设计实现的研究与应用越来越广泛,对乘法器进行ASIC芯片设计,具有设计实现过程简单、所用到的EDA工具完善而且成熟、硬件开销小、易于在VLSI电路或系统级芯片中集成。
通常,数字电路设计的流程对于芯片的实现而言,需要RTL级的HDL描述,并要对各层次的设计进行功能仿真验证,在验证电路能按预期设计功能工作后,即可对RTL级的HDL描述进行综合、优化,形成门级网表。
整个设计流程可称为数字电路的前端设计。
本课题基于移位相加算法的研究,设计16位移位相加乘法器,并在功能仿真通过后,将所设计的Verilog RTL级代码进行综合,采用Synopsys公司Design Compiler EDA工具进行电路综合,获得16位移位相加乘法器的门级网表与电路实现。
关键词数字电路设计;移位相加乘法器;综合;AbstractAbstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract abstract.(英文摘要内容必须与中文摘要完全对应。
16*16位Wallace乘法器测试激励文件设计摘要课题首先要深入分析和掌握Wallace加法树的基本原理,Wallace树是对部分积规约,减小乘法器关键路径时延的一种算法。
设计的思想是为了加快乘法器的运行速度并减少芯片面积开销,采用阵列累加原理实现乘法运算。
本课题设计采用加法器阵列结构来完成部分积相加的,相加的研究和应用方法有多种,本课题基于Wallace加法树结构,并在Wallace加法树算法的基础上进行基于Wallace加法树的16位乘法器的Verilog设计与实现。
功能验证通过后,采用Synopsys公司EDA综合工具Design Compiler进行设计综合。
在此过程中,首先要对工具应用进行综合脚本文件的编写。
然后采用脚本文件对RTL代码进行设计综合,得到门级网表与电路实现。
关键词乘法器;Wallace加法树;Verilog硬件描述语言在乘法器的计算过程中,一般是通过减少部分积的总数,来减少部分积相加的次数,从而来提高计算的速度。
而对于Wallace Tree算法则是通过改进部分积累加的方式以减少部分积累加所需的时间,从而来加快运算的速度。
Wallace树算法的基本思想是通过3-2编码器来减少累加过程中所需要的时间。
加法器中的时延问题主要是出现在进位的过程中所花费大量的时间,如果我们单纯的使用串行的方式,逐级相加,那么所花费的时间也是很长的。
对于一个N比特的被乘数和一个N比特的乘数相乘的算法如下图所示:Y=Yn-1 Yn-2.....................Y2 Y1 Y0 被乘数X=Xn-1 Xn-2.....................X2 X1 X0 乘数一般来说:Y=Yn-1Yn-2....................... Y2Y1Y0X=Xn-1Xn-2 (X2X1X0)2Yn-1X0 Yn-2X0 Yn-3X0 ……Y1X0 Y0X0Yn-1X1 Yn-2X1 Yn-3X1 ……Y1X1 Y0X1Yn-1X2 Yn-2X2 Yn-3X2 ……Y1X2 Y0X2… … … ……. …. …. …. ….Yn-1Xn-2 Yn-2X0 n-2 Yn-3X n-2 ……Y1Xn-2 Y0Xn-2Yn-1Xn-1 Yn-2X0n-1 Yn-3Xn-1 ……Y1Xn-1 Y0Xn-1 ----------------------------------------------------------------------------------------------------------------P2n-1 P2n-2 P2n-3 P2 P1 P0例如:1101 4-bits1101 4-bits110100001101110110010101“与”门被用来产生部分乘积,如果被乘数是N比特,乘数是M比特,那么就会产生N*M个部分积,然而在不同结构和类型的乘法器当中,部分乘积的产生方式是不同的。
课程名称电子设计自动化题目十六位硬件乘法器电路院系班级信息学院11电子信息工程A班姓名学号指导老师凌朝东2013 年 12 月 5 日题目名称:十六位硬件乘法器电路摘要:设计一个16位硬件乘法器电路.要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用Quartus II软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
经软件仿真和硬件测试验证后,以达到实验要求。
目录1.题目名称 (2)2.摘要 (2)3.目录 (3)4.正文 (4)4.1. 系统设计 (4)4.1 设计要求 (4)4.2 系统设计方案 (4)4.2 单元电路设计 (4)4.2.1十进制计算模块 (5)4.2.2 BCD码转二进制模块 (5)4.2.3 8位右移寄存器模块 (6)4.2.4 8位加法器模块 (7)4.2.5 1乘法器multi_1模块 (7)4.2.6 16位移位寄存器reg_16模块 (8)4.2.7 16位二进制转BCD码B_BCD模块 (9)4.2.8 8位乘法器multi_8x8顶层设计 (10)4.3 软件设计 (12)4.3.1设计平台和开发工具 (12)4.3.2程序流程方框图 (13)4.4 系统测试 (14)4.1仿真分析 (14)4.2硬件验证 (15)5. 结论 (15)6. 参考文献 (15)7. 附录 (15)4.正文4.1系统设计1.1设计要求题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出.1.2系统设计方案此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.乘数和被乘数的输入可用数据开关K1~K10分别代表数字1,2,…,9,0,用编码器对数据开关K1~K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是0000~1111,即0H~FH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.乘数和被乘数的输入模块将16进制码的A~F码设计成输出为null.使得减少了无用码的输入.两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.系统总体电路组成原理图如下图所示:4.2单元电路设计下面分解8位乘法器的层次结构,分为以下7个模块:1. 十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。
十六位硬件乘法器一、摘要1、设计要求:位宽十六,输入2个两位十进制相乘,能在数码管上显示积的信息!2、原理说明:十六位硬件乘法器可以分解为由2个8位2进制相乘得到,但要求输入十进制,故可用8421BCD码将2位十进制译成8位2进制即可,本次课设使用的是移位相加法来实现乘法!3、开发板使用说明:sw1到sw8开关是数据输入按键,即一次可同时输入八位数据,对于运算y=a*b,由于加入了辅助程序,总共要输入2次,每次输入的数据分别代表a转换为2进制的八位数,b转换成2进制的八位数,。
每按一次按键s3,即输入当前所设定的八位数据一次,,在数据输入完成后,按s2,进行运算,并由数码管输出用十进制表示的结果。
二、正文1、系统设计方案提出由于是2位的十进制,输入的数据不是很大,转换为二进制也是8位,故想到使用移位相加的方法来实现乘法的功能,同时移位相加是最节省资源的一种方法,其思路是乘法通过逐项移位相加来实现,根据乘数的每一位是否为1,若为1将被乘数移位相加,比较简单,适合本次课程设计。
2,电路划分,电路主要由3部分组成,第一部分是将输入的十进制译成2进制,第二部分是乘法器部分,第三部分是将得到的16位二进制结果译为十进制!第一部分LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY chengshu ISPORT (a: IN STD_LOGIC_VECTOR(3 DOWNTO 0);cq : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END chengshu;ARCHITECTURE behav OF chengshu ISBEGINprocess(a)begincase a iswhen "0000" => cq<="00000000";when "0001" => cq<="00001010";when "0010" => cq<="00010100";when "0011" => cq<="00011110";when "0100" => cq<="00101000";when "0101" => cq<="00110010";when "0110" => cq<="00111100";when "0111" => cq<="01000110";when "1000" => cq<="01010000";when "1001" => cq<="01011010";when others =>null;end case ;end process;end ARCHITECTURE behav;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity add8 isport(a:in std_logic_vector(7 downto 0);b:in std_logic_vector(3 downto 0);qout:out std_logic_vector(7 downto 0));end add8;architecture ab of add8 issignal tmp1,tmp2,tmp:std_logic_vector(8 downto 0); begintmp1<='0'&a;tmp2<="00000"&b;tmp<=tmp1+tmp2;qout<=tmp(7 downto 0);end ab;第二部分:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cheng isport ( start : in std_logic;a : in std_logic_vector(7 downto 0);b : in std_logic_vector(7 downto 0);y : out std_logic_vector(15 downto 0)); end cheng;architecture behav of cheng issignal ql : std_logic_vector(7 downto 0);signal qz : std_logic_vector(7 downto 0);signal qy : std_logic_vector(15 downto 0);beginprocess(a,ql,qz,qy,b,start)variable q0 : std_logic_vector(15 downto 0); variable q1 : std_logic_vector(15 downto 0); variable q2 : std_logic_vector(15 downto 0); variable q3 : std_logic_vector(15 downto 0); variable q4 : std_logic_vector(15 downto 0); variable q5 : std_logic_vector(15 downto 0); variable q6 : std_logic_vector(15 downto 0); variable q7 : std_logic_vector(15 downto 0); variable q8 : std_logic_vector(15 downto 0); beginql<=a;qz<=b;q8:="0000000000000000";q7:="00000000"&ql;q0:="00000000"&ql;q7:=q7+q7;q1:=q7;q7:=q7+q7;q2:=q7;q7:=q7+q7;q3:=q7;q7:=q7+q7;q4:=q7;q7:=q7+q7;q5:=q7;q7:=q7+q7;q6:=q7;q7:=q7+q7;if start='1' thenif qz(0)='1' then q8:=q8+q0;end if;if qz(1)='1' then q8:=q8+q1;end if;if qz(2)='1' then q8:=q8+q2;end if;if qz(3)='1' then q8:=q8+q3;end if;if qz(4)='1' then q8:=q8+q4;end if;if qz(5)='1' then q8:=q8+q5;end if;if qz(6)='1' then q8:=q8+q6;end if;if qz(7)='1' then q8:=q8+q7;end if;end if;qy<=q8;end process;y<=qy;end behav;第三部分IBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;USE ieee.std_logic_arith.all;ENTITY jian ISport( a: in std_logic_vector(15 downto 0) ;cnt : OUT std_logic_vector(15 downto 0) ;qout: OUT std_logic_vector(3 downto 0) );END ;ARCHITECTURE hdlarch OF jian ISBEGINprocess(a)beginif a>8999 then cnt<=a-9000;qout<="1001";elsif a>7999 then cnt<=a-8000;qout<="1000";elsif a>6999 then cnt<=a-7000;qout<="0111";elsif a>5999 then cnt<=a-6000;qout<="0110";elsif a>4999 then cnt<=a-5000;qout<="0101";elsif a>3999 then cnt<=a-4000;qout<="0100";elsif a>2999 then cnt<=a-3000;qout<="0011";elsif a>1999 then cnt<=a-2000;qout<="0010";elsif a>999 then cnt<=a-1000;qout<="0001";else cnt<=a ;qout<="0000";end if;end process;end hdlarch;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;USE ieee.std_logic_arith.all;ENTITY jian1 ISport( a: in std_logic_vector(15 downto 0) ;cnt : OUT std_logic_vector(15 downto 0) ;qout: OUT std_logic_vector(3 downto 0) );END ;ARCHITECTURE hdlarch OF jian1 ISBEGINprocess(a)beginif a>899 then cnt<=a-900;qout<="1001";elsif a>799 then cnt<=a-800;qout<="1000";elsif a>699 then cnt<=a-700;qout<="0111";elsif a>599 then cnt<=a-600;qout<="0110";elsif a>499 then cnt<=a-500;qout<="0101";elsif a>399 then cnt<=a-400;qout<="0100";elsif a>299 then cnt<=a-300;qout<="0011";elsif a>199 then cnt<=a-200;qout<="0010";elsif a>99 then cnt<=a-100;qout<="0001";else cnt<=a ;qout<="0000";end if;end process;end hdlarch;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;USE ieee.std_logic_arith.all;ENTITY jian2 ISport( a: in std_logic_vector(15 downto 0) ;cnt : OUT std_logic_vector(15 downto 0) ;qout: OUT std_logic_vector(3 downto 0) );END ;ARCHITECTURE hdlarch OF jian2 ISBEGINprocess(a)beginif a>89 then cnt<=a-90;qout<="1001";elsif a>79 then cnt<=a-80;qout<="1000";elsif a>69 then cnt<=a-70;qout<="0111";elsif a>59 then cnt<=a-60;qout<="0110";elsif a>49 then cnt<=a-50;qout<="0101";elsif a>39 then cnt<=a-40;qout<="0100";elsif a>29 then cnt<=a-30;qout<="0011";elsif a>19 then cnt<=a-20;qout<="0010";elsif a>9 then cnt<=a-10;qout<="0001";else cnt<=a ;qout<="0000";end if;end process;end hdlarch;但是由于2个8位2进制在开发板上不好输入和最后的16位不好译成十进制,故加入几段辅助程序减少其输入次数!library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity test_in isport(test_in: in std_logic_vector(7 downto 0);test_out_ah: out std_logic_vector(3 downto 0);test_out_al: out std_logic_vector(3 downto 0);test_out_bh: out std_logic_vector(3 downto 0);test_out_bl: out std_logic_vector(3 downto 0);clk: in std_logic;led: out std_logic);end entity;architecture one of test_in issignal test_temp: std_logic_vector(7 downto 0);signal cnt: std_logic;begin--process(clk)--begin--if(clk'event and clk='1')then--led<='1';--else--led<='0';--end if;--end process;process(clk)beginif(clk'event and clk='0')thencnt<=not cnt;test_temp<=test_in;end if;end process;process(cnt)begin--if(clk'event and clk='0')thenif(cnt='1')thentest_out_ah<=test_temp(7 downto 4);test_out_al<=test_temp(3 downto 0);elsetest_out_bh<=test_temp(7 downto 4);test_out_bl<=test_temp(3 downto 0);end if;--end if;end process;end architecture;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity de_shake isport(key_in: in std_logic;key_out: out std_logic;clk_1_2hz: in std_logic);end entity;architecture one of de_shake issignal a,b,c: std_logic;beginprocess(clk_1_2hz)variable key_out_temp: std_logic;beginif(clk_1_2hz'event and clk_1_2hz='1')thena<= key_in;b<=a;c<=b;key_out_temp:=(a and b and c );end if;key_out<=key_out_temp;end process;end architecture;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fre_deshake isport(clk_50m: in std_logic;clk_deshake: out std_logic;clk_50: out std_logic);end entity;architecture one of fre_deshake issignal clk_temp: std_logic_vector(20 downto 0); beginclk_50<=clk_50m;process(clk_50m)beginif(clk_50m'event and clk_50m='1')thenclk_temp<=clk_temp+1;end if;end process;clk_deshake<=clk_temp(20);--clk_deshake(1)<=clk_temp(20);end architecture;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity decode isport(clk_50M: in std_logic;input4: in std_logic_vector(3 downto 0);input3: in std_logic_vector(3 downto 0);input2: in std_logic_vector(3 downto 0);input1: in std_logic_vector(3 downto 0);output: out std_logic_vector(7 downto 0);address: out std_logic_vector(7 downto 0));end entity;architecture one of decode issignal div_clk: std_logic_vector(18 downto 0);signal mode: std_logic_vector(7 downto 0);signal data: std_logic_vector(3 downto 0);begindivclk:process(clk_50M)beginif(clk_50M'event and clk_50M='1')thendiv_clk<=div_clk+1;end if;end process;de_code_01: process(clk_50M,div_clk(18 downto 16))beginif(clk_50M'event and clk_50M='1')thencase div_clk(18 downto 16) iswhen "000"=>mode<="01111111";when "001"=>mode<="10111111";when "010"=>mode<="11011111";when "011"=>mode<="11101111";--when "100"=>--mode<="11110111";--when "101"=>--mode<="11111011";--when "110"=>--mode<="11111101";--when "111"=>--mode<="11111110";when others=>mode<="11111111";end case;end if;end process;de_code_02: process(mode)beginaddress <= mode;case mode iswhen "01111111"=>data<=input4;when "10111111"=>data<=input3;when "11011111"=>data<=input2;when "11101111"=>data<=input1;--when "11110111"=>--data<=input(15 downto 12);--when "11111011"=>--data<=input(11 downto 8);--when "11111101" =>--data<=input(7 downto 4);--when "11111110"=>--data<=input(3 downto 0);when others=>null;end case;end process;decode_03: process(data)begincase data iswhen "0000"=>output<="11000000";when "0001"=>output<="11111001";when"0010"=>output<="10100100";when"0011"=>output<="10110000";when"0100"=>output<="10011001";when"0101"=>output<="10010010";when"0110"=>output<="10000010";when"0111"=>output<="11111000";when"1000"=>output<="10000000";when"1001"=>output<="10010000";--when"1010"=>--output<="10001000";--when"1011"=>--output<="10000011";--when"1100"=>--output<="11000110";--when"1101"=>--output<="10100011";--when"1110"=>--output<="10000110";when others=>output<="10001110";end case;end process;end architecture;第二种方案(无硬件测试)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mult16_16 isport(clk: in std_logic;start: in std_logic;ina: in std_logic_vector(15 downto 0);inb: in std_logic_vector(15 downto 0);sout: out std_logic_vector(31 downto 0));end entity;architecture one of mult16_16 issignal cout1: std_logic_vector(19 downto 0);signal cout2: std_logic_vector(23 downto 0);signal cout3: std_logic_vector(27 downto 0);signal cout4: std_logic_vector(31 downto 0);signal a4b1: std_logic_vector(19 downto 0);signal a3b1: std_logic_vector(19 downto 0);signal a2b1: std_logic_vector(19 downto 0);signal a1b1: std_logic_vector(19 downto 0);signal a4b2: std_logic_vector(23 downto 0);signal a3b2: std_logic_vector(23 downto 0);signal a2b2: std_logic_vector(23 downto 0);signal a1b2: std_logic_vector(23 downto 0);signal a4b3: std_logic_vector(27 downto 0);signal a3b3: std_logic_vector(27 downto 0);signal a2b3: std_logic_vector(27 downto 0);signal a1b3: std_logic_vector(27 downto 0);signal a4b4: std_logic_vector(31 downto 0);signal a3b4: std_logic_vector(31 downto 0);signal a2b4: std_logic_vector(31 downto 0);signal a1b4: std_logic_vector(31 downto 0);beginprocess(clk)beginif(clk'event and clk='1')thena4b1<=((ina(15 downto 12)*inb(3 downto 0))&"000000000000");a3b1<=("0000"&(ina(11 downto 8)*inb(3 downto 0))&"00000000");a2b1<=("00000000"&(ina(7 downto 4)*inb(3 downto 0))&"0000");a1b1<=("000000000000"&(ina(3 downto 0)*inb(3 downto 0)));a4b2<=((ina(15 downto 12)*inb(7 downto 4))&"0000000000000000");a3b2<=("0000"&(ina(11 downto 8)*inb(7 downto 4))&"000000000000");a2b2<=("00000000"&(ina(7 downto 4)*inb(7 downto 4))&"00000000");a1b2<=("000000000000"&(ina(3 downto 0)*inb(7 downto 4))&"0000");a4b3<=((ina(15 downto 12)*inb(11 downto 8))&"00000000000000000000");a3b3<=("0000"&(ina(11 downto 8)*inb(11 downto 8))&"0000000000000000");a2b3<=("00000000"&(ina(7 downto 4)*inb(11 downto8))&"000000000000");a1b3<=("000000000000"&(ina(3 downto 0)*inb(11 downto 8))&"00000000");a4b4<=((ina(15 downto 12)*inb(15 downto 12))&"000000000000000000000000");a3b4<=("0000"&(ina(11 downto 8)*inb(15 downto 12))&"00000000000000000000");a2b4<=("00000000"&(ina(7 downto 4)*inb(15 downto 12))&"0000000000000000");a1b4<=("000000000000"&(ina(3 downto 0)*inb(15 downto 12))&"000000000000");end if;end process;process(clk)beginif(clk'event and clk='1')thencout1<=a4b1+a3b1+a2b1+a1b1;cout2<=a4b2+a3b2+a2b2+a1b2;cout3<=a4b3+a3b3+a2b3+a1b3;cout4<=a4b4+a3b4+a2b4+a1b4;end if;end process;process(clk,start)beginif(start='1')thensout<="00000000000000000000000000000000";elsesout<=("000000000000"&cout1)+("00000000"&cout2)+("0000"&cout3)+cout4;end if;end process;end architecture;仿真结果三,参考文献资料,EDA技术和VHDL,和同学一起讨论!四,仿真结果,随便输入几个数字后,进行仿真,结果正确,但只能用16进制看结果,因为是译成8421BCD码,是一位十进制数对应4位2进制,最终的结果范围是0~9801,需要16位2进制来对应!五,硬件测试在硬件上进行测试,结果正确!六,实验总结这次课设让我学会了很多东西,刚开始的时候对很多东西不是很理解,后来请教同学,查资料,虽然有些的程序不是自己写的,但跟同学讨论,请教,大概也懂得的那些程序是干什么用的,在最后测试的时候,在仿真阶段,刚开始一直仿真不对,以为是程序错误,但检验后程序并没有错误,由于是8421BCD码故应该用十六进制进行仿真。
⼗六位运算器ALU实验报告学⽣实验报告实验名称⽤Verilog HDL语句实现16位运算器的功能实验⽇期2013年10⽉19学号2012551212姓名李超班级12计算机科学与技术⼀班⼀、实验⽬的与要求1、了解运算器的组成结构;2、掌握算术逻辑运算器的⼯作原理;3、掌握简单运算器的数据传送通道4、掌握⽤Verilog HDL实现16位简单运算器的设计⼆、实验原理74LS181的逻辑功能表图中,S0到S3是四个控制端,⽤于选择进⾏何种运算。
M ⽤于控制ALU进⾏算术运算还是逻辑运算。
当M=0时,M对进位信号没有任何影响,Fi值与操作数Ai,Bi以及地位向本位进位Cn+1有关,所以M=0时进⾏算术运算。
操作数⽤补码表⽰,“加”只算术加,运算时考虑进位;“+”指逻辑加,不考虑进位;减法运算时,减法取反码运算后⽤加法器实现,结果输出为A减B减1在最末位产⽣⼀个强迫进位(加1),以得到A减B的结果。
当M=1时,封锁了各位的进位输出Cn+i=0,因此各位的运算结果Fi仅与操作数Ai,Bi有关,此时进⾏逻辑运算。
三、实验内容与步骤1.根据书85⾯的逻辑功能表编写Verilog HDL语句,编译,仿真等步骤。
实验代码SN74181:module sn74181(A,B,S,Cn,M,F,C);parameter bit_width=4;output [bit_width-1:0]F;output C;input [bit_width-1:0]A,B,S;input Cn,M;reg C;reg Y=0;reg [bit_width-1:0]F;reg t;initial C=0;always@(S)begincase(S)4'b0000:beginif(M) {t,F}=~{1'b0,A};elsebeginif(Cn) {t,F}={1'b0,A};else {t,F}={1'b0,A}|1;endend4'b0001:beginif(M) {t,F}=~({1'b0,A}|{1'b0,B});endend4'b0010:beginif(M) {t,F}=~{1'b0,A}&{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}|({1'b0,~B});else {t,F}=({1'b0,A}|({1'b0,~B}))+1;endend4'b0011:beginif(M) {t,F}=0;elsebeginif(Cn) {t,F}={t,F}-1;else {t,F}=0;endend4'b0100 :beginif(M) {t,F}=~({1'b0,A}&{1'b0,B});elsebeginif(Cn) {t,F}={1'b0,A}+({1'b0,A}&({1'b0,~B}));else {t,F}={1'b0,A}+({1'b0,A}&({1'b0,~B}))+1;endend4'b0101 :beginif(M) {t,F}={1'b0,~B};elsebeginif (Cn) {t,F}=({1'b0,A}&({1'b0,~B}))+({1'b0,A}|{1'b0,B}); else{t,F}=({1'b0,A}&({1'b0,~B}))+({1'b0,A}|{1'b0,B})+1; endend4'b0110 :beginif(M) {t,F}={1'b0,A}^{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}-{1'b0,B}-1;else {t,F}={1'b0,A}-{1'b0,B};endend4'b0111 :beginelse {t,F}={1'b0,A}&({1'b0,~B});endend4'b1000 :beginif(M) {t,F}={1'b0,~A}|{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}+({1'b0,A}&{1'b0,B});else {t,F}={1'b0,A}+({1'b0,A}&{1'b0,B})+1;end4'b1001 :beginif(M) {t,F}={1'b0,~(A^B)};elsebeginif(Cn) {t,F}={1'b0,A}+{1'b0,B}+1;else {t,F}={1'b0,A}+{1'b0,B};endend4'b1010 :beginif(M) {t,F}={1'b0,B};elsebeginif(Cn){t,F}=({1'b0,A}&{1'b0,B})+({1'b0,A}|({1'b0,~B})); else{t,F}=({1'b0,A}&{1'b0,B})+({1'b0,A}|({1'b0,~B}))+1; end4'b1011 :beginif(M) {t,F}={1'b0,A}&{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}&{1'b0,B}-1;else {t,F}={1'b0,A}&{1'b0,B};endend4'b1100 :beginif(M) {t,F}=1;elsebeginif(Cn) {t,F}={1'b0,A}+{1'b0,A};else {t,F}={1'b0,A}+{1'b0,A}+1;endend4'b1101:beginelse {t,F}={1'b0,A}+({1'b0,A}|{1'b0,B})+1; endend4'b1110 :beginif(M) {t,F}={1'b0,A}|{1'b0,B};elsebeginif(Cn) {t,F}={1'b0,A}+({1'b0,A}|({1'b0,~B})); else {t,F}={1'b0,A}+({1'b0,A}|({1'b0,~B}))+1; endend4'b1111 :beginif(M) {t,F}={1'b0,A};elsebeginif(Cn) {t,F}={1'b0,A}-1;else {t,F}={1'b0,A};endendendcaseC=t;endEndmoduleSHIFT:module shift(A,choose,result); parameter bit_width=16;input [bit_width-1:0]A;input[1:0] choose;output [bit_width-1:0] result;reg [bit_width-1:0]result;always@(A or choose)begincase(choose)2'b01:beginresult=A<<1;end2'b10:beginresult={A[0],A[15:1]};end2'b11:beginresult=$signed(A)>>>1;endendcaseendEndmoduleinput [width-1:0] r;input [1:0]x;output [width-1:0] result; output overflow,z,c,p,n;reg [width-1:0] a,b;reg [3:0]s;reg [1:0]sh;reg cn,m,ov;wire co1,co2,co3;wire [width-1:0]co,re1,re2; always@ (x or r)begincase(x)2'b11: begina=r;end2'b10: beginb=r;end2'b00: begins=r[3:0];sh=r[5:4];m=r[8];cn=r[12]; endendcaseendsn74181 u_sn74181_1(.A(a[3:0]),.B(b[3:0]),.S(s),.M(m),.Cn(cn),.C(co1),.F(re1[3:0]));sn74181 u_sn74181_2 (.A(a[7:4]),.B(b[7:4]),.S(s),.M(m),.Cn(co1),.C(co2),.F(re1[7:4]));sn74181 u_sn74181_3 (.A(a[11:8]),.B(b[11:8]),.S(s),.M(m),.Cn(co2),.C(co3),.F(re1[11:8]).B(b[15:12]),.S(s),.M(m),.Cn(co3),.C(overflow),.F(re1[15:12]));shift u_shift(.A(a),.choose(sh),.result(re2[15:0]));assign result=(sh?re2:re1);assign z=~|result;assign n=result[15];Endmodule仿真波形图按照模式⼀电路图结构图设置对应的引脚参数。
目录引言....................................................................................................................................... - 1 - 摘要....................................................................................................................................... - 2 -一、乘法器概述....................................................................................................................... - 3 -1.1 EDA技术的概念........................................................................................................ - 3 -1.2 EDA技术的特点........................................................................................................ - 3 -1.3 EDA设计流程............................................................................................................ - 5 -1.4硬件描述语言(Verilog HDL)................................................................................ - 5 -二、16位乘法器的设计要求与设计思路.............................................................................. - 6 -2.2 设计要求.................................................................................................................... - 6 -三、16位乘法器的总体框图.................................................................................................. - 6 -四、16位乘法器的综合设计.................................................................................................. - 7 -4.1 16位乘法器功能........................................................................................................ - 7 -4.2 16位乘法器设计思路................................................................................................ - 8 -4.3 基于Verilog HDL 硬件语言的乘法器设计 ............................................................ - 8 -(1)输入模块......................................................................................................... - 8 -(2)乘法模块......................................................................................................... - 9 -五、总体调试与仿真结果..................................................................................................... - 10 -5.1乘法器的RTL Viewer .......................................................................................... - 10 -5.2 16位乘法器的系统程序:....................................................................................... - 11 -5.3计算结果仿真结果................................................................................................... - 12 -5.3.1仿真测试程序(a=6,b=10).............................................................................. - 12 - 总结......................................................................................................................................... - 16 - 参考文献................................................................................................................................. - 16 -引言随着微电子技术的飞速发展,集成电路工艺进入深亚微米阶段,特征尺寸变得越来越小。
基于FPGA的乘法器设计课程设计报告题目名称:基于FPGA的乘法器设计学生姓名:**学号: **********专业年级:电子信息工程2011级指导教师:***时间: 2014.1.5基于FPGA的乘法器设计一、设计任务与要求:1)有输入端口“读入”接收读入指示信号;“读入”信号为“1”时开始读数,信号为“0”时停止读数;2)乘数为位宽16bit的二进制有符号数;3)两个16bit乘数先后经1bit位宽端口串行输入系统;4)两个乘数的16bit均输入完成后送交后续模块做乘法运算;5)乘法运算部分要求利用流水线架构实现;乘法结果保留24bit;6)结果输出时,有指定管脚给出指示信号;7)有“同步复位”端口(1bit),此端口输入“1”后,整个系统强制回归到初始状态;二、方案设计与论证:2.1组合电路乘法器组合电路乘法器采用了很多的寄存器和加法器进行运算,占用了很大的资源,稳定性也比较低,思路复杂难与设计。
2.2基于时序电路的位移相加型16位硬件乘法器基于时序电路的位移相加型16位硬件乘法器从工程实际设计上来说,它往往会利用时序逻辑设计的方法来实现,属于时序逻辑范畴。
其思路清析,好理解,稳定性较高,具有很好的工程实际性,因此选用本方案。
三、基于时序电路的位移相加型16位硬件乘法器基本原理:该乘法器是由16位加法器构成的以时序方式设计的16位乘法器。
其乘法原理是:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
从图10-2的逻辑图及其乘法操作时序图图1(示例中的相乘数为C6H和FDH )上可以清楚地看出此乘法器的工作原理。
图2中,START信号的上跳沿及其高电平有两个功能,即32位寄存器清零和被乘数A[15..0]向移位寄存器SREG16B加载;它的低电平则作为乘法使能信号。
CLK为乘法时钟信号。
当被乘数被加载于16位右移寄存器SREG16B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
摘要随着现代数字技术的高速发展,乘法器在高速实时信号处理中特别是在数字信号处理和数字图像处理系统中起到了重要的作用。
乘法器已经是现代计算机中必不可少的一部分。
随着乘数和被乘数位数的增加,乘法器电路中的加法器位树也要相应的增加。
通过研究CLA电路的特性,也可以在乘法器中开发出更快的加法阵列。
纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器。
这里介绍由十六位加法器构成的以时序逻辑方式设计的十六位乘法器,具有一定的实用价值,而且由FPGA\CPLD构成实验系统后,可以很容易的用ASIC大型集成芯片来完成,性价比高,可操作性强。
其运算速度是决定逻辑运算单元(ALU)工作频率的关键,并在很大程度上决定了系统的性能。
由于DSP芯片是串行执行,速度慢、功耗大,所以现在高速实时信号处理中一般采用FPGA\CPLD来进行并行处理。
现在很多系统设计中,要求速度越来越快,功耗越来越小,因此研究高速低功率的乘法器相当重要。
在此次课设中我将在modelsim的环境下完成十六位的乘法器的设计。
关键词FPGA;加法器;Modelsim;锁存器,;移位寄存器目录引言 (1)1总体电路结构设计 (2)1.1电路功能与性能 (2)1.2关键功能电路设计 (3)1.3电路接口 (3)1.4电路功能框图 (5)1.5验证方案 (6)2模块的设计 (7)2.1 输入信号处理模块设计 (8)2.2 16位移位寄存器模块 (9)2.3 16位计数器模块 (9)2.4 输出信号处理模块 (10)3 设计仿真与测试 (12)3.1仿真与测试的功能列表 (12)3.2 仿真平台构建和仿真结果 (12)3.2.1 顶层仿真平台与激励..................... 错误!未定义书签。
3.2.2 电路功能仿真结果....................... 错误!未定义书签。
3.2.3 电路后仿真结果......................... 错误!未定义书签。
课程名称电子设计自动化
题目十六位乘法器
院系班级信息学院09电子信息工程1班姓名崔钦婉
学号**********
指导老师凌朝东
2011 年7 月6 日
题目名称:
十六位硬件乘法器电路
摘要:
设计一个16位硬件乘法器电路.要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用Quartus II软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
经软件仿真和硬件测试验证后,以达到实验要求。
目录
摘要 (2)
1. 系统设计 (3)
1.1设计要求 (3)
1.2系统设计方案 (3)
2. 单元电路设计 (5)
3. 软件设计 (8)
4. 系统测试 (9)
结论 (9)
参考文献 (9)
附录 (10)
1.系统设计
1.1设计要求
题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出.
1.2系统设计方案
此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.
乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.
乘数和被乘数的输入可用数据开关K1~K10分别代表数字1,2,…,9,0,用编码器对数据开关K1~K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.
方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是0000~1111,即0H~FH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.
乘数和被乘数的输入模块将16进制码的A~F码设计成输出为null.使得减少了无用码的输入.
两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样
反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.
系统总体电路组成原理图如下图所示:
2.单元电路设计
(1)乘数和被乘数的输入模块:可分为两部分:十位输入和个位输入;十位输入的4位16进制码转换为8位2进制码后输入乘数和被乘数组成模块利用’&’与个位输入的4位16进制数组合而成.
模块图如下图所示:
此功能模块的仿真图如下图所示:
结果显示:当乘数十位(a1)输入4,个位(a0)输入7时,out1能输出4;
当被乘数十位(b1)输入8,个位(b0)输入5时,out2能输出85。
(2)两数相乘模块由一个程序组成,其乘法原理是:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为零0,左移后以全零相加,直至被乘数的最高位.
①VHDL程序为:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cf is
port ( clk : in std_logic;
a : in std_logic_vector(7 downto 0);
b : in std_logic_vector(7 downto 0);
outy : out std_logic_vector(15 downto 0));
end cf;
architecture art of cf is
signal qa : std_logic_vector(7 downto 0); signal qb : std_logic_vector(7 downto 0); begin
process(qa,qb,clk,a,b)
variable q0 : std_logic_vector(15 downto 0); variable q1 : std_logic_vector(15 downto 0); variable q2 : std_logic_vector(15 downto 0); variable q3 : std_logic_vector(15 downto 0); variable q4 : std_logic_vector(15 downto 0); variable y : std_logic_vector(15 downto 0); begin
qa<=a;
qb<=b;
q0:="0000000000000000";
q1:="00000000"&a;
if clk='1' then
if qb(0)='1' then y:=q1;
else y:=q0;
end if;
if qb(1)='1' then y:=y+(a&"0");
else y:=y+q0;
end if;
if qb(2)='1' then y:=y+(a&"00");
else y:=y+q0;
end if;
if qb(3)='1' then y:=y+(a&"000"); else y:=y+q0;
end if;
if qb(4)='1' then y:=y+(a&"0000"); else y:=y+q0;
end if;
if qb(5)='1' then y:=y+(a&"00000"); else y:=y+q0;
end if;
if qb(6)='1' then y:=y+(a&"000000"); else y:=y+q0;
end if;
if qb(7)='1' then y:=y+(a&"0000000"); else y:=y+q0;
end if;
end if;
outy<=y;
end process;
end art;
②模块图
③功能仿真图
结果显示:clk使能端为高电平有效,当输入的8位二进制数分别为7和14时,输出为98,改变a、b的输入值,同样得到正确的输出值,即实现了两数相乘的功能。
(3)乘积显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.其原理是,输入的乘积分别和8999,7999,…999做比较,千位显示输出分别显示9,8,…,1.其他位数原理相同.
模块图如图所示:
此功能模块的功能仿真图如下图所示:
结果显示:当模块输入的16位二进制数为8534时,输出也为8534.
3.软件设计
本设计是基于quartusII电路设计软件为平台,借用PC机和GW48EDA/SOPC实验箱为设计工具,运用VHDL硬件描述语言在Cyclone II系列的EP2C5T144C6芯片为设计对象实现的.
Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计
输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
VHDL是非常告诉集成电路硬件描述语言,是可以描述硬件电路的功能,信号连接关系及定时关系的语言,它能比电路原理图更有效地表示硬件电路的特性.使用VHDL语言,可以就系统的总体要求出发,自上至下地设计内容细化,最后完成系统硬件的整体设计.VHDL程序结构包括:实体,结构体,配置,包集合及库.主要特点是:a.功能强大,灵活性高;器件无关性;可移植性好;自顶向下的设计方法等.
利用quartusII软件设计的流程图3如图所示
4.系统测试
(1)经quartus软件综合,结果如图所示
(2)经quartus软件功能仿真,仿真结果如图所示:
(3)硬件验证:
目标芯片型号:EP2C5T144C8 电路模式:NO.1 (4)硬件引脚锁定方案:
结论:经过VHDL程序的设计到软件仿真,再到硬件测试成功,功能的实现,表明这次EDA课程设计非常成功,设计要求全部达成,达到了预期效果.
参考文献:<<EDA技术与VHDL>>第五版,清华大学出版社
附录
仪器设备清单: PC机
GW48EDA/SOPC实验箱。