VHDL的乘法器设计——数字电路课程设计
VHDL的乘法器设计——数字电路课程设计

cout=>c4,s=>s4(1));
------------------------------last u12:full_adder port map (a=>d4(1),b=>d4(2),cin=>d4(3),
【第二章】:设计思路及方案 算法结构(无符号)
由上图可见,乘法的运算最终是加法的运算,两个 4BIT 输入,输出为 7BIT。 模块一、半加器:单比特输入相加,
模块二、全加器:由两个半加器组成,有一个进位输入,
模块三、进位保留加法器:
3
最终程序结构图
流水设计的原理:在前向割集上加入四级流水
图一 图二
elsif clk'event and clk='1' then
--------------------------------------first d1(1)<= x(1); d1(2)<= x(2); d1(3)<= x(3);
7
d1(4)<= x(4); d1(5)<= x(5); d1(6)<= x(6); d1(7)<=c1(1) ; d1(8)<=s1(1); d1(9)<= x(9); d1(10)<=x(10); d1(11)<=c1(2); d1(12)<=s1(2); d1(13)<=x(13); d1(14)<=c1(3) ; d1(15)<=s1(3) ; d1(16)<=x(16);
原码一位乘法器设计实验报告

原码一位乘法器设计实验报告一位乘法器设计实验报告本次实验的目的是设计一个1位乘法器,使用VHDL语言在FPGA平台上进行编程,以模拟数字系统中常用的数字乘法操作。
(1)实验介绍本次实验采用FPGA对1位乘法器进行设计,通过综合语言VHDL对1位乘法器进行编程,实现乘法操作,考核我们所学习到的技能,及其在数字电路中的运用。
(2)原理1位乘法器(One-bit Multiplier)主要包括一个数据输入端A,输入一位A;B输入端,输入一位B;两个控制端,乘法指令和正负指令;产生和端为Cout,乘法结果输出端为Dout。
1位乘法器的功能是:如果A、B都为0时,整个乘法器保持空闲,如果A>0或者 B>0,就会开始乘法运算,Cout为A与B的AND运算结果,Dout=A*B,即当B=1时,Dout=A;当B=0时,Dout=0。
(3)实验流程(1)设计多位乘法器的功能模块,完成模块之间的接口描述;(2)设计1位乘法器的VHDL代码,其中包括输入、输出、控制部分;(3)利用Xilinx ISE 14.6完成编译,查看综合错误情况;(4)绘制电路图,添加模块;(5)进行仿真测试,将模块内各部分功能输入实际值,验证运算正确性;(6)在DE2开发板上运行代码,上传新的程序,查看实际运行情况,确认乘法器可以正确工作;(7)验证结果,完成整个乘法器的设计。
(4)实验结果本次实验通过编写VHDL语言,绘制电路图,仿真测试,烧写程序等步骤,设计出一位乘法器,实现了正确乘法运算功能,实验结果如下图所示:此外,实验中使用的FPGA开发板的硬件设计采用Cyclone ll,有良好的性能和可编程性,在编程和复杂数字电路处理领域有很强的优势。
(5)总结本次实验通过实验,熟悉了1位乘法器的结构及其工作原理,掌握综合语言VHDL和FPGA编程技术,掌握了数字电路设计。
最后,本次实验完成了乘法器的设计,检验结果满足预期,获得有意义的实验教训,实现了实验目标。
数字系统设计VHDL课设报告

模块名:ieee7542point(clk,rst_n,inp,pointdata);
出入参数说明:clk:时钟。
rst_n:异步复位信号输入。
Inp:三十二位浮点数输入,规定为ieee754格式,切指数范围为0——127,因为为了配合之前cordic算法的±90的输入。
-30度(14’h3fbd)
-0.5000(0x1fc0)
0.8750(0x0070)
90度(14’h00C9)
0.9843(0x7e)
0.0078(0x0001)
-90度(14’h3f37)
-1.000(0x1f80)
0.0000(0x0000)
结果分析:设计中采用流水线结构,第九个时钟以后,每个时钟都会产生一个结果,是一种高速度的运算器,从综合的结果看,运算器的运算速度可以达到200M以上,满足一般工程应用的需求。从采样出来的几组经典数据来看,也能够充分验证该运算器的精度,同时证明该设计的合理性和正确性。
clk:时钟信号输入端,一位。
rst_n:异步复位输入端,一位。
inp:十四位定点数输入端,采用补码形式输入,输入范围±90度,采用弧度形式输入。
res_sin,res_cos:十三位输出端,也是带符号补码形式。
所有过程变量:均未补码形式。
六,实验结果
本设计采用SynplifyPro 9.6.2进行综合,采用modelsim6.5进行仿真,仿真结果如下所示:
(1)、cordic算法原理
CORDIC算法包含圆周系统,线性系统,双曲系统三种旋转系统。本文仅以圆周系统推导如下。该系统完成的是一个平面坐标旋转如图1所示,可以看出,将向量( Xi, Yi)旋转θ角,得到一个新的向量( Xi, Yi) ,那么有:
八位乘法器VHDL及功能模块说明

EDA课程设计报告实验名称:八位乘法器目录一.引言1.1 EDA技术的概念••1.2 EDA技术的特点••1.3 EDA设计流程••1.4 VHDL介绍••二.八位乘法器的设计要求与设计思路••2.1 设计目的••2.2 设计要求••三.八位乘法器的综合设计••3.1 八位乘法器功能••3.2 八位乘法器设计方案••3.3 八位乘法器实体设计••3.4 八位乘法器VHDL设计••3. 5八位乘法器仿真图形••心得体会••参考文献••一、引言1.1 EDA技术的概念EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
1.2 EDA技术的特点利用EDA技术进行电子系统的设计,具有以下几个特点:①用软件的方式设计硬件;②用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;③设计过程中可用有关软件进行各种仿真;④系统可现场编程,在线升级;⑤整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。
因此,EDA技术是现代电子设计的发展趋势。
1.3 EDA设计流程典型的EDA设计流程如下:1、文本/原理图编辑与修改。
首先利用EDA工具的文本或图形编辑器将设计者的设计意图用文本或图形方式表达出来。
2、编译。
完成设计描述后即可通过编译器进行排错编译,变成特定的文本格式,为下一步的综合做准备。
3、综合。
将软件设计与硬件的可实现性挂钩,是将软件转化为硬件电路的关键步骤。
4、行为仿真和功能仿真。
利用产生的网表文件进行功能仿真,以便了解设计描述与设计意图的一致性。
VHDL移位相加8位硬件乘法器电路设计

课程名称:EDA技术实验实验名称:移位相加8位硬件乘法器电路设计一、实验目的:1、学习移位相加8位硬件乘法器电路设计;2、进一步提高学生应用EDA技术进行项目设计的能力。
二、实验原理纯组合逻辑结构构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器;基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。
本实验由8位加法器构成的以时序逻辑方式设计锝位乘法器,具有一定的实用价值。
其原理是:乘法通过逐位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全0相加,直至被乘数的最高位。
三、实验内容1、打开Q 软件,新建VHDL程序输入文件,用VHDL语言设计乘法器的各个模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SREG8B ISPORT ( 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;图1.1 8位右移寄存器LIBRARY IEEE;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;图1.2 8位加法器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ANDARITH ISPORT ( ABIN : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ANDRITH;ARCHITECTURE behav OF ANDARITH ISBEGINPROCESS(ABIN,DIN)BEGINFOR I IN 0 TO 7 LOOPDOUT(I) <= DIN(I) AND ABIN;END LOOP;END PROCESS;END behav;图1.3 选通与门模块LIBRARY IEEE;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' THENR16S(6 DOWNTO 0) <= R16S(7 DOWNTO 1);R16S(15 DOWNTO 7) <= D;END IF;END PROCESS;Q <= R16S;END behav;图1.4 16位锁存器2、对各个模块进行编译并打包成电路元件,如上图1所示。
基于VHDL语言的乘法器的设计

利用VHDL設計乘法器Implement of Multiplier by Using VHDL許地申Dih-Shen Hsu中華技術學院電機系副教授Associate ProfessorDepartment of Electrical EngineeringChina Institute of Technology摘 要在計算機結構裡加,減,乘,除是常被用到的運算,本文提出以非常高速積體電路硬體描述語言(VHDL)來描述硬體,說明如何將兩個運算元作相乘的運算。
我們首先以無號數整數做乘法運算來說明其原理,設計其電路結構。
其實在VHDL 程式中,我們更可以載入STD_LOGIC_ARITH與STD_LOGIC_UNSIGNED元件盒之後,直接進行乘法運算,既簡單又容易擴充。
最後,我們將以4-bit X 4-bit 的例子來做電路描述、電路合成、電路模擬並以七段顯示器將其結果顯示出來。
關鍵字:非常高速積體電路硬體描述語言、電路描述、電路合成、電路模擬AbstractWe have known operation that perform addition, subtraction, multiplication, and division. In this paper we are presented primarily to describe hardware using by VHDL. We can explain how multiplication may be performed for two operand. Multiplication of unsigned numbers illustrates the main issues involved in the design of multiplier circuit. In fact, after the STD_LOGIC_ARITH and STD_LOGIC_UNSIGNED packages were added to the VHDL program, it became not only simple but also easy to extended. Next, consider a 4 x 4 example to circuit description, circuit synthesis, and circuit simulation by using VHDL. Finally, this approach can also be displayed by 7-segment.Keyword : VHDL , circuit description , circuit synthesis, circuit simulation壹.簡介VHDL是Very High Speed Integrated Circuit Hardware Description Language 的英文縮寫。
乘法器课程设计

摘要:基于VHDL的数字系统设计具有设计技术齐全、方法灵活、支持广泛等优点,同时也是EDA技术的重要组成部分.文章用VHDL语言设计了左移法和进位节省法实现的两种组合乘法器,通过功能仿真,对两种乘法器的性能进行了比较,从而得知后者的传输延迟时间小,即速度较快.通过设计实例,介绍了利用VHDL语言进行数字系统设计的方法.关键词:VHDL语言左移法进位节省法Abstract:Digital system design based on VHDL has complete design techniques, methods, the advantages of flexible and wide support, at the same time also is the important component of the EDA technology. The article using VHDL language to design the left shift method and carry save method to realize the combination of two kinds of multiplier, through the function simulation, compares the performance of the two kinds of multiplier, which the latter's small transmission delay time, namely fast. Through the design example, introduced the method of using VHDL language to design digital system.Keywords:VHDL language ,left shift method ,carry save method目录1.前言 (1)2.系统设计总述 (2)2.1 设计要求 (2)2.2系统组成.............................................. ..22.2.1 乘法器电路基本原理.............................................................32.2.2 输入数据的获得............................................................. (3)2.2.3 数据的选择输入和输出控制 (3)3.设计步骤 (4)3.1整体原理框图: (4)3.2乘法器整体电路原理图: (5)3.3输入模块: (5)3.4运算模块: (5)3.5显示控制模块: (6)3.6显示模块: (7)4.整体仿真┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉105.调试中遇到的问题及解决的方法┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉11 6.设计总结┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉12 7.参考文献┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉13附录:程序代码┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉141.前言电子EDA技术发展迅猛,逐渐在教学、科研、产品设计与制造等各方面都发挥着巨大的作用。
9X9乘法表VHDL

9*9乘法器的VHDL的设计1 设计任务制作一个9*9乘法器2 设计说明输入两个四位二进制信号a,b分别作为被乘数和乘数,以8421bcd码编号,输入一个一位信号oc作为控制信号;输出两个四位二进制信号c,d分别作为结果的十位和个位,以8421bcd码编号。
3 设计结果3.1 原理图图1 原理图3.2 信号表a:被乘数,用4位二进制8421bcd码表示;b:乘数,用4位二进制8421bcd码表示;oc:控制信号;c:结果的十位,用4位二进制8421bcd码表示;d:结果的个位,用4位二进制8421bcd码表示;图2 信号表3.3仿真结果图3 oc、a、b分别为0、2、8和0、4、3时结果图4 oc、a、b分别为1、2、8和1、4、3时结果图5 oc、a、b分别为0、10、8和0、4、11时结果3.4 电路图图6 原理图3.5 程序清单LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY mul9 ISPORT (oc: IN std_logic;a,b: IN std_logic_vector (3 downto 0);c,d: OUT std_logic_vector(3 downto 0));END;ARCHITECTURE one OF mul9 ISBEGINPROCESS(a,b)BEGINIF(oc = '1') THENIF(a = "0001") THENCASE b ISWHEN "0001" =>c <= "0000"; d <= "0001"; WHEN "0010" =>c <= "0000"; d <= "0010";WHEN "0011" =>c <= "0000"; d <= "0011"; WHEN "0100" =>c <= "0000"; d <= "0100";WHEN "0101" =>c <= "0000"; d <= "0101"; WHEN "0110" =>c <= "0000"; d <= "0110";WHEN "0111" =>c <= "0000"; d <= "0111"; WHEN "1000" =>c <= "0000"; d <= "1000";WHEN "1001" =>c <= "0000"; d <= "1001"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;CASE b ISWHEN "0001" =>c <= "0000"; d <= "0010"; WHEN "0010" =>c <= "0000"; d <= "0100";WHEN "0011" =>c <= "0000"; d <= "0101"; WHEN "0100" =>c <= "0000"; d <= "1000";WHEN "0101" =>c <= "0001"; d <= "0000"; WHEN "0110" =>c <= "0001"; d <= "0010";WHEN "0111" =>c <= "0001"; d <= "0100"; WHEN "1000" =>c <= "0001"; d <= "0110";WHEN "1001" =>c <= "0001"; d <= "1000"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;ELSIF(a = "0011") THENCASE b ISWHEN "0001" =>c <= "0000"; d <= "0101"; WHEN "0010" =>c <= "0000"; d <= "0110";WHEN "0011" =>c <= "0000"; d <= "1001"; WHEN "0100" =>c <= "0001"; d <= "0010";WHEN "0101" =>c <= "0001"; d <= "0101"; WHEN "0110" =>c <= "0001"; d <= "1000";WHEN "0111" =>c <= "0010"; d <= "0001"; WHEN "1000" =>c <= "0010"; d <= "0100";WHEN "1001" =>c <= "0010"; d <= "0111"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;CASE b ISWHEN "0001" =>c <= "0000"; d <= "0100"; WHEN "0010" =>c <= "0000"; d <= "1000";WHEN "0011" =>c <= "0001"; d <= "0010"; WHEN "0100" =>c <= "0001"; d <= "0110";WHEN "0101" =>c <= "0010"; d <= "0000"; WHEN "0110" =>c <= "0010"; d <= "0100";WHEN "0111" =>c <= "0010"; d <= "1000"; WHEN "1000" =>c <= "0011"; d <= "0010";WHEN "1001" =>c <= "0011"; d <= "0101"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;ELSIF(a = "0101") THENCASE b ISWHEN "0001" =>c <= "0000"; d <= "0101"; WHEN "0010" =>c <= "0001"; d <= "0000";WHEN "0011" =>c <= "0001"; d <= "0101"; WHEN "0100" =>c <= "0010"; d <= "0000";WHEN "0101" =>c <= "0010"; d <= "0101"; WHEN "0110" =>c <= "0011"; d <= "0000";WHEN "0111" =>c <= "0011"; d <= "0101"; WHEN "1000" =>c <= "0100"; d <= "0000";WHEN "1001" =>c <= "0100"; d <= "0101"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;CASE b ISWHEN "0001" =>c <= "0000"; d <= "0110"; WHEN "0010" =>c <= "0001"; d <= "0010";WHEN "0011" =>c <= "0001"; d <= "1000"; WHEN "0100" =>c <= "0010"; d <= "0100";WHEN "0101" =>c <= "0011"; d <= "0000"; WHEN "0110" =>c <= "0011"; d <= "0110";WHEN "0111" =>c <= "0100"; d <= "0010"; WHEN "1000" =>c <= "0100"; d <= "1000";WHEN "1001" =>c <= "0101"; d <= "0100"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;ELSIF(a = "0111") THENCASE b ISWHEN "0001" =>c <= "0000"; d <= "0111"; WHEN "0010" =>c <= "0001"; d <= "0100";WHEN "0011" =>c <= "0010"; d <= "0001"; WHEN "0100" =>c <= "0010"; d <= "1000";WHEN "0101" =>c <= "0011"; d <= "0101"; WHEN "0110" =>c <= "0100"; d <= "0010";WHEN "0111" =>c <= "0100"; d <= "1001"; WHEN "1000" =>c <= "0101"; d <= "0110";WHEN "1001" =>c <= "0110"; d <= "0011"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;CASE b ISWHEN "0001" =>c <= "0000"; d <= "1000"; WHEN "0010" =>c <= "0001"; d <= "0110";WHEN "0011" =>c <= "0010"; d <= "0110"; WHEN "0100" =>c <= "0011"; d <= "0010";WHEN "0101" =>c <= "0100"; d <= "0000"; WHEN "0110" =>c <= "0100"; d <= "1000";WHEN "0111" =>c <= "0101"; d <= "0110"; WHEN "1000" =>c <= "0110"; d <= "0100";WHEN "1001" =>c <= "0111"; d <= "0010"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;ELSIF(a = "1001") THENCASE b ISWHEN "0001" =>c <= "0000"; d <= "1001"; WHEN "0010" =>c <= "0001"; d <= "1000";WHEN "0011" =>c <= "0010"; d <= "0111"; WHEN "0100" =>c <= "0010"; d <= "0110";WHEN "0101" =>c <= "0100"; d <= "0101"; WHEN "0110" =>c <= "0101"; d <= "0100";WHEN "0111" =>c <= "0101"; d <= "0110"; WHEN "1000" =>c <= "0111"; d <= "0010";WHEN "1001" =>c <= "1000"; d <= "0001"; WHEN OTHERS =>c <= "0000"; d <= "0000";END CASE;ELSEc <= "0000";d <= "0000";END IF;ELSE c <= "0000"; d <= "0000";END IF;END PROCESS;END one;4 实验总结通过这次课程设计,我进一步加深了对电子设计自动化的了解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路课程设计题目乘法器设计班级实验二班学号姓名时间第十三、十四周地点科A-304指导陈学英唐青【摘要】:用FPGA设计完成基于半加器、全加器和保留进位思想设计的4BIT四级流水乘法器,用modelsim仿真其结果。
【目录】:第一章、实验任务及原理第二章、设计思路方法及方案第三章、FPGA模块程序设计与仿真第四章、结束语【正文】【第一章】:实验任务及原理本实验只要求编写乘法器的硬件代码,并用Modelsim进行仿真测试。
设计乘法器,两个输入都是4BIT,对所有输入相乘都得到正确结果,乘法器采用四级流水设计,以增加处理速度。
用modelsim仿真时,要求用时钟上升沿方式遍历所有输入,检查输出结果是否正确。
原理用到流水,进位保留思想。
【第二章】:设计思路及方案算法结构(无符号)由上图可见,乘法的运算最终是加法的运算,两个4BIT输入,输出为7BIT。
模块一、半加器:单比特输入相加,模块二、全加器:由两个半加器组成,有一个进位输入,模块三、进位保留加法器:最终程序结构图流水设计的原理:在前向割集上加入四级流水图一图二如上图所示方框代表触发器,五边形代表组合逻辑块,假设图一中逻辑块输入输出延时为Ta,图二将逻辑块切割成两块,延时分别为T1,T2,且Ta=T1+T2,并在两逻辑块之间加触发器,两个逻辑块工作频率都可以达到clk频率,故工作速度增加一倍,虽然时延增加了,但资源优化了许多。
【第三章】:FPGA程序模块及仿真半加器的程序模块:entity half_adder isport(a,b:in std_logic;s,cout:out std_logic);end half_adder;architecture Behavioral of half_adder isbegins<=a xor b;cout<=a and b;end Behavioral;全加器的程序模块:调用半加器,采用顶层设计entity full_adder isport(a,b,cin:in std_logic;s,cout:out std_logic);end full_adder;architecture Behavioral of full_adder iscomponent half_adderport(a,b:in std_logic;cout,s:out std_logic);end component;signal h1s,h1cout,h2cout:std_logic;beginu1:half_adder port map(a,b,h1cout,h1s);u2:half_adder port map(cin,h1s,h2cout,s);cout<=h1cout or h2cout;end Behavioral;乘法器的程序模块:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity mm isport(a:in std_logic_vector(3downto0);b:in std_logic_vector(3downto0);clk:in std_logic;reset:in std_logic;psum:out std_logic_vector(7downto0));end mm;architecture Behavioral of mm iscomponent half_adderport(a,b:in std_logic;s,cout:out std_logic);end component;component full_adderport(a,b,cin:in std_logic;s,cout:out std_logic);end component;signal x:std_logic_vector(1to16);-----原理图中从左到右------------原理图中,触发器从左到右,共四层,依次定义信号signal d1:std_logic_vector(1to16);signal d2:std_logic_vector(1to13);signal d3:std_logic_vector(1to10);signal d4:std_logic_vector(1to9);-----------原理图中,加法器从左到右,依次定义加法器输出的进位信号signal c1:std_logic_vector(1to3);signal c2:std_logic_vector(1to3);signal c3:std_logic_vector(1to3);signal c4:std_logic;signal c5:std_logic;----------原理图中,加法器从左到右,依次定义加法器输出的和信号signal s1:std_logic_vector(1to3);signal s2:std_logic_vector(1to3);signal s3:std_logic_vector(1to3);signal s4:std_logic_vector(1to2);signal s5:std_logic;--------第四层加法器间的信号signal e:std_logic;beginx(1)<=a(3)and b(3);x(2)<=a(3)and b(2);x(3)<=a(2)and b(3);x(4)<=a(3)and b(1);x(5)<=a(2)and b(2);x(6)<=a(1)and b(3);x(7)<=a(3)and b(0);x(8)<=a(2)and b(1);x(9)<=a(1)and b(2);x(10)<=a(0)and b(3);x(11)<=a(2)and b(0);x(12)<=a(1)and b(1);x(13)<=a(0)and b(2);x(14)<=a(1)and b(0);x(15)<=a(0)and b(1);x(16)<=a(0)and b(0);-------------------------------------all dff process(clk,reset)beginif reset='0'thend1<="0000000000000000";d2<="0000000000000";d3<="0000000000";d4<="000000000";elsif clk'event and clk='1'then --------------------------------------first d1(1)<=x(1);d1(2)<=x(2);d1(3)<=x(3);d1(4)<=x(4);d1(5)<=x(5);d1(6)<=x(6);d1(7)<=c1(1);d1(8)<=s1(1);d1(9)<=x(9);d1(10)<=x(10);d1(11)<=c1(2);d1(12)<=s1(2);d1(13)<=x(13);d1(14)<=c1(3);d1(15)<=s1(3);d1(16)<=x(16);--------------------------------------second d2(1)<=d1(1);d2(2)<=d1(2);d2(3)<=d1(3);d2(4)<=c2(1);d2(5)<=s2(1);d2(6)<=d1(6);d2(7)<=c2(2);d2(8)<=s2(2);d2(9)<=d1(10);d2(10)<=c2(3);d2(11)<=s2(3);d2(12)<=d1(15);d2(13)<=d1(16);--------------------------------------third d3(1)<=d2(1);d3(2)<=c3(1);d3(3)<=s3(1);d3(4)<=c3(2);d3(5)<=s3(2);d3(6)<=c3(3);d3(7)<=s3(3);d3(8)<=d2(11);d3(9)<=d2(12);d3(10)<=d2(13);-------------------------------------fourthd4(1)<=d3(1);d4(2)<=d3(2);d4(3)<=c4;d4(4)<=s4(1);d4(5)<=s4(2);d4(6)<=d3(7);d4(7)<=d3(8);d4(8)<=d3(9);d4(9)<=d3(10);end if;end process;----------共五层,每一层都是从左到右,依次调用映射。
------------------------------firstu1:half_adder port map(a=>x(7),b=>x(8),cout=>c1(1),s=>s1(1)); u2:half_adder port map(a=>x(11),b=>x(12),cout=>c1(2),s=>s1(2)); u3:half_adder port map(a=>x(14),b=>x(15),cout=>c1(3),s=>s1(3)); ------------------------------secondu4:full_adder port map(a=>d1(4),b=>d1(5),cin=>d1(7),cout=>c2(1),s=>s2(1));u5:full_adder port map(a=>d1(8),b=>d1(9),cin=>d1(11),cout=>c2(2),s=>s2(2));u6:full_adder port map(a=>d1(12),b=>d1(13),cin=>d1(14),cout=>c2(3),s=>s2(3));------------------------------thirdu7:full_adder port map(a=>d2(2),b=>d2(3),cin=>d2(4),cout=>c3(1),s=>s3(1));u8:full_adder port map(a=>d2(5),b=>d2(6),cin=>d2(7),cout=>c3(2),s=>s3(2));u9:full_adder port map(a=>d2(8),b=>d2(9),cin=>d2(10),cout=>c3(3),s=>s3(3));------------------------------fourthu10:half_adder port map(a=>d3(5),b=>d3(6),cout=>e,s=>s4(2));u11:full_adder port map(a=>d3(3),b=>d3(4),cin=>e,cout=>c4,s=>s4(1));------------------------------lastu12:full_adder port map(a=>d4(1),b=>d4(2),cin=>d4(3),cout=>c5,s=>s5);------------------------------overpsum(7)<=c5;psum(6)<=s5;psum(5)<=d4(4);psum(4)<=d4(5);psum(3)<=d4(6);psum(2)<=d4(7);psum(1)<=d4(8);psum(0)<=d4(9);end Behavioral;仿真模块:LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;ENTITY testnew ISEND testnew;ARCHITECTURE behavior OF testnew IS--Component Declaration for the Unit Under Test(UUT) COMPONENT mmPORT(a:IN std_logic_vector(3downto0);b:IN std_logic_vector(3downto0);clk:IN std_logic;reset:IN std_logic;psum:OUT std_logic_vector(7downto0));END COMPONENT;--Inputssignal a:std_logic_vector(3downto0):=(others=>'0');signal b:std_logic_vector(3downto0):=(others=>'0');signal clk:std_logic:='0';signal reset:std_logic:='0';--Outputssignal psum:std_logic_vector(7downto0);--Clock period definitionssignal s0,s1,s2,s3:std_logic_vector(7downto0);signal test:std_logic;BEGIN--Instantiate the Unit Under Test(UUT)uut:mm PORT MAP(a=>a,b=>b,clk=>clk,reset=>reset,psum=>psum);--Clock process definitionsclk_process:processbeginclk<='0';wait for1us;clk<='1';wait for1us;end process;reset_process:processbeginreset<='0';wait for10ns;reset<='1';wait;end process;--时钟上升沿计数遍历所有可能输入值stim_proc:process(clk,reset)beginif reset='0'thena<="0000";b<="0000";elsif clk'event and clk='1'thenif a<"1111"then a<=a+'1';elsif a>"1110"thena<=(others=>'0');if b<"1111"then b<=b+'1';elsif b>"1110"thenb<=(others=>'0');end if;end if;-----------------------延迟四拍,使之与输出结果同步s0<=a*b;s1<=s0;s2<=s1;s3<=s2;---------信号test检验结果的正确与否,若正确,输出1,否则为0 if s3=psum then test<='1';else test<='0';end if;end if;end process;END;仿真结果:上图检测信号(test)一直是高电平;下图由开始部分看出,输出结果与输入延时了四拍;由此可见仿真结果是正确的。