EDA技术课程大作业设计题目:移位相加8位乘法器的设计院系:电子信息与电气工程学院学生姓名:学号:200902070017专业班级:09电子信息工程专升本2010年12月3日移位相加8位乘法器的设计1.设计背景和设计方案1.1设计背景EDA技术(即Electronic Design Automation技术)就是依赖强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Ddscription Langurage)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
它在硬件实现方面融合了大规模集成电路制造技术、IC版图设计、ASIC 测试和封装、FPGA(Gield Peogrammable Gate Array)/CPLD(Complex Programmable Logic Device)编程下载和自动测试等技术;在计算机辅助工程方面融合了计算机辅助设计(CAD),计算机辅助制造(CAM),计算机辅助测试(CAT),计算机辅助工程(CAE)技术以及多种计算机语言的设计概念;而在现代电子学方面则容纳了更多的内容,如电子线路设计理论、数字信号处理技术、数字系统建模和优化技术及长线技术理论等。
本文介绍设计一个两个5位数相乘的乘法器。
用发光二极管显示输入数值,用7段显示器显示十进制结果。
乘数和被乘数分两次输入。
在输入乘数和被乘数时,要求显示十进制输入数据。
输入显示和计算结果显示,采用分时显示方式进行,可参见计算器的显示功能1.2设计方案此设计是由八位加法器构成的以时序逻辑方式设计的八位乘法器,它的核心器件是八位加法器,所以关键是设计好八位加法器。
方案一:八位直接宽位加法器,它的速度较快,但十分耗费硬件资源,对于工业化设计是不合理的。
方案二:由两个四位加法器组合八位加法器,其中四位加法器是四位二进制并行加法器,它的原理简单,资源利用率和进位速度方面都比较好。
综合各方面的考虑,决定采用方案二。
该乘法器是由8位加法器构成的以时序方式设计的8位乘法器。
其乘法原理是乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
从图(一)的原理图及乘法操作时序图图(二)上可以清楚地看出此乘法器的工作原理。
图(一)中,START信号的上跳沿及其高电平有两个功能,即16位寄存器清零和被乘数A[7..0]向移位寄存器SREG8B加载;它的低电平则作为乘法使能信号。
CLK为乘法时钟信号。
当被乘数被加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,1位乘法器ANDARITH打开,8位乘数B[7..0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器REG16B中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此往复,直至8个时钟脉冲后,最后乘积完整出现在REG16B端口。
在这里,1位乘法器ANDARITH的功能类似于1个特殊的与门,即当ABIN为‘1’时,DOUT直接输出DIN,而当ABIN为‘0’时,DOUT输出全“00000000”。
移位相加8位乘法器整体电路原理图图(一)2. 方案实施2.1 8位右移寄存器模块:LIBRARY IEEE; -- 8位右移寄存器USE IEEE.STD_LOGIC_1164.ALL;ENTITY SREG8B IS PORT ( CLK : IN STD_LOGIC; LOAD : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);QB : OUT STD_LOGIC );END SREG8B;ARCHITECTURE behav OF SREG8B ISSIGNAL REG8 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPROCESS (CLK, LOAD)BEGINIF LOAD = '1' THEN REG8 <= DIN;ELSIF CLK'EVENT AND CLK = '1' THENREG8(6 DOWNTO 0) <= REG8(7 DOWNTO 1);END IF;END PROCESS;QB <= REG8(0); -- 输出最低位END behav;2.2 8位加法器模块LIBRARY IEEE; --8位加法器USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER8 ISPORT(B, A : IN STD_LOGIC_VECTOR(7 DOWNTO 0);S : OUT STD_LOGIC_VECTOR(8 DOWNTO 0) );END ADDER8;ARCHITECTURE behav OF ADDER8 ISBEGINS <= '0'&A + B ;END behav;2.3 1位乘法器模块LIBRARY IEEE; --1位乘法器USE IEEE.STD_LOGIC_1164.ALL;ENTITY ANDARITH IS -- 选通与门模块PORT ( ABIN : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END ANDARITH;ARCHITECTURE behav OF ANDARITH ISBEGINPROCESS(ABIN, DIN)BEGINFOR I IN 0 TO 7 LOOP -- 循环,完成8位与1位运算 DOUT(I) <= DIN(I) AND ABIN;END LOOP;END PROCESS;END behav;2.4 16位锁存器模块LIBRARY IEEE; --16位锁存器/右移寄存器USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG16B ISPORT ( CLK,CLR : IN STD_LOGIC;D : IN STD_LOGIC_VECTOR(8 DOWNTO 0);Q : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) );END REG16B;ARCHITECTURE behav OF REG16B ISSIGNAL R16S : STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINPROCESS(CLK, CLR)BEGINIF CLR = '1' THEN R16S <= (OTHERS =>'0') ; -- 清零信号ELSIF CLK'EVENT AND CLK = '1' THEN --时钟到来时,锁存输入值,并右移低8 R16S(6 DOWNTO 0) <= R16S(7 DOWNTO 1); -- 右移低8位R16S(15 DOWNTO 7) <= D; -- 将输入锁到高8位END IF;END PROCESS;Q <= R16S;END behav;2.5 乘法运算控制器library ieee; --乘法运算控制器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity arictl isport( clk,start:in std_logic;clkout,rstall,ariend:out std_logic);end;architecture one of arictl issignal cnt4b:std_logic_vector(3 downto 0);beginrstall<=start;process(clk,start)beginif start='1' then cnt4b<="0000";elsif clk'event and clk='1' thenif cnt4b<8 then --小于8则计数,等于8则表明乘法运算已经结束cnt4b<=cnt4b+1;end if;end if;end process;process(clk,cnt4b,start)beginif start='0' thenif cnt4b<8 thenclkout<=clk; ariend<='0';else clkout<='0'; ariend<='1';end if;else clkout<=clk; ariend<='0';end if;end process;end;2.6 8位乘法器顶层设计library ieee; --8位乘法器顶层设计use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity multi8x8 isport( clk:in std_logic;start:in std_logic;a,b:in std_logic_vector(7 downto 0);dout:out std_logic_vector(15 downto 0);end multi8x8 ;architecture struc of multi8x8 iscomponent arictlport( clk , start :in std_logic;clkout , rstall :out std_logic);end component;component andarithport( abin:in std_logic;din:in std_logic_vector(7 downto 0);dout:out std_logic_vector(7 downto 0)); end component;component adder8bport(cin :in std_logic;a,b:in std_logic_vector(7 downto 0);s:out std_logic_vector(7 downto 0);cout : out std_logic );end component;component reg16b isport( clk,clr:in std_logic;d:in std_logic_vector(8 downto 0);q:out std_logic_vector(15 downto 0));end component;component sreg8b isport( clk,load:in std_logic;din:in std_logic_vector(7 downto 0);qb:out std_logic);end component;signal gndint ,intclk,rstall,newstart,qb,:std_logic;signal andsd :std_logic_vector(7 downto 0);signal dtbin :std_logic_vector(8 downto 0);signal dtbout :std_logic_vector(15 downto 0);begindout<=dtbout; gndint<='0';process ( clk,start )beginif start='1' then newstart<='1' ;elsif clk='0' then newstart<='0' ;end if;end process;u1:arictl port map( clk=>clk,start=>newstart,clkout=>intclk,rstall=>restall);u2:sreg8b port map(clk=>intclk,load=>rstall,din=>b,qb=>qb);u3:andarith port map(abin=>qb,din=>a,dout=>andsd);u4:adder8b port map(cin=>gndint,a=>dtbout(15 downto 8),b=>andsd,s=>dtbin(7 downto 0),cout=>dtbin(8));u5:reg16b port map(clk=>intclk,clr=>rstall,d=>dtbin,q=>dtbout);end struc;8位移位相加乘法器运算逻辑波形图如下:图(二)3.结果和结论通过这次大作业对EDA技术有了更进一步的熟悉,VHDL 语言和C语言等其他语言还是有很大的区别。