当前位置:文档之家› 乘法器(EDA)

乘法器(EDA)

基于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后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。

当为1时,1位乘法器ANDARITH打开,16位乘数B[15..0]在同一节拍进入16位加法器,与上一次锁存在16位锁存器REG16B 中的高16位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。

而当被乘数的移出位为0时,与门全零输出。

如此往复,直至16个时钟脉冲后,最后乘积完整出现在REG32B端口。

在这里,1位乘法器ANDARITH的功能类似于1个特殊的与门,即当ABIN为‘1’时,DOUT直接输出DIN,而当ABIN为‘0’时,DOUT输出全“0000000000000000”。

图1 16位移位相加乘法器运算逻辑波形图
图2 16位乘法器逻辑原理图
四、FPGA的乘法器各个模块设计:
基于时序电路的位移相加型16位硬件乘法器包括:16位加法器ADDER16、1位乘法器ANDARITH、32位锁存器(右移寄存器)REG32B、16位右移寄存器SREG16B。

4.116位加法器(ADDER16):
LIBRARY IEEE; --16位加法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER16 IS
PORT(B, A : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(16 DOWNTO
0) );
END ADDER16;
ARCHITECTURE behav OF ADDER16 IS
BEGIN
S <= '0'&A + B ;
END behav;
4.21位乘法器(ANDARITH):
LIBRARY IEEE; --1位乘法器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ANDARITH IS -- 选通与门模块PORT ( ABIN : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(15 DOWNTO
0);
DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) );
END ANDARITH;
ARCHITECTURE behav OF ANDARITH IS
BEGIN
PROCESS(ABIN, DIN)
BEGIN
FOR I IN 0 TO 15 LOOP -- 循环,完成8位与1位运算
DOUT(I) <= DIN(I) AND ABIN;
END LOOP;
END PROCESS;
END behav;
4.332位锁存器(REG32B):
LIBRARY IEEE; --32位锁存器/右移寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT ( CLK,CLR : IN STD_LOGIC;
D : IN STD_LOGIC_VECTOR(16 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
END REG32B;
ARCHITECTURE behav OF REG32B IS
SIGNAL R32S : STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
PROCESS(CLK, CLR)
BEGIN
IF CLR = '1' THEN R32S <= (OTHERS =>'0') ; -- 清零信号
ELSIF CLK'EVENT AND CLK = '1' THEN --时钟到来时,锁存输入值,并右移低8
R32S(14 DOWNTO 0) <= R32S(15 DOWNTO 1); -- 右移低8位
R32S(31 DOWNTO 15) <= D; -- 将输入
锁到高8位
END IF;
END PROCESS;
Q <= R32S;
END behav;
4.416位右移寄存器(SREG16B):
LIBRARY IEEE; -- 16位右移寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SREG16B IS
PORT ( CLK ,LOAD : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(15 DOWNTO
0);
QB : OUT STD_LOGIC );
END SREG16B;
ARCHITECTURE behav OF SREG16B IS
SIGNAL REG16 : STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
PROCESS (CLK, LOAD)
BEGIN
IF LOAD = '1' THEN REG16 <= DIN;
ELSIF CLK'EVENT AND CLK = '1' THEN
REG16(14 DOWNTO 0) <= REG16(15 DOWNTO
1);
END IF;
END PROCESS;
QB <= REG16(0); -- 输出最低位END behav;
五、仿真结果:
图3仿真结果六、原理图:
图4原理图七、心得体会:
EDA实用教程一门很有些意义的课程。

从最初的一步一步的学习,让我学到更多,对计算机的最底层有了更深一步的了解。

在做这个课程设计时,比想象的更加困难些,虽然通过许多途径找到了相关的资料,但是实现着实不简单。

对于我来说写程序是一个比较困难的事情,所以做这个课程设计确实很纠结。

不过做完这个课程设计,我学到了很多,在编程方面也有了一定的提升。

这门课程设计必须理论和实践相结合。

整个的设计过程中,要充分利用软件工程中的模块化设计思想,这样使设计减少了许多繁杂的问题,使程序看起来更加明了,不易混乱。

任何事情不可能一下子完成,程序的实现更是要一步一步来完成,急于求成,很大程度上会增加软件开发的难度,造成开发过程中不必要的麻烦。

只要坚持去做,努力去做,就会有收获。

我在进步,也会继续进步。

在经过那段设计困难时期后,经过查阅大量的参考书籍,同学之间不断的探讨以及老师的细心讲解,及时的指导后,设计的思路终于有了眉目。

这次课程设计,给了我们将学过的理论知识付诸实践的机会,让我发现,理论和实践其实确实是不一样的。

通过编写程序,增加了学习的积极性和趣味性。

通过课程实践,巩固加深对课堂教学内容的理解,提高我的VHDL设计能力,培养克服困难的毅力和精神。

参考文献:
[1]赵倩.基于流水线重构技术的16×16位乘加器的设计.微计算机信息,2006(2)[2]潘松.黄继业.EDA技术实用教程VHDL版(第四版).科学出版社,2011.11。

相关主题