2.乘法器初步设计
2.1设计思想
本设计首先要了解乘法器的基本原理 ,我所设计的16位乘法器采用移位
和加法来实现,主要用到原码一位乘运算规则。然后对乘法器的进行顶层设计,把乘法器的设计分成几个功能模块,并逐步细化,因此需要了解各个模块的引脚含义以及它们的内部构造,并对各个模块的实现功能进行分析,通过标准硬件描述语言对它们模块进行编程,调试。最后在Quartus_II9.0应用软件进行模拟仿真,得出正确的运行结果。 2.2乘法器原理
16位乘法器可用移位和加法来实现,两个16位数相乘,总共需要执行16次加法运算和16次移位运算,由乘数的末位值确定被乘数是否与原部分积相加,从乘数的最低位开始,若乘数为1,加被乘数,然后右移一位,形成新的部分积,乘数同时右移一位;若乘数为0,加上零值,然后右移一位,形成新的部分积,乘数同时右移一位,直到乘数的最高位为止,从而得出最终的乘积结果。
实现原码一位乘法的硬件逻辑结构图如下图所示。用寄存器R0存放部分积;R1存放乘数Y,并且最低位Yn作判断为;R0和R1都具有右移功能并且是连通的;寄存器R2存放被乘数X,加法器完成部分积与位积求和,计数器记录相加移位的操作次数。 R0 部分积 R1 乘数Y Yn 计数加法器 器 移位控制 控制门
R2 X0 被乘数X 5
控制电路
16位乘法器的顶层设计主要分成四大功能模块 ,并可根据分解的层次进行设计, 各个功能模块作用介绍如下:
1) 右移寄存器模块:是指寄存器中所存的代码能够在移位脉冲的作用
下依次左移或右移,本设计采用的一个16位寄存器,能存放16位二进制代码,需用16个触发器来构成,它可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。
2) 加法器:本设计用到一个16位加法器,主要进行操作数的加法运算。 3) 乘1模块:主要实现16位与1位的乘法运算。
4) 锁存器:它所实现的功能是把当前的状态锁存起来,使CPU送出的数
据在接口电路的输出端保持一段时间锁存后状态不再发生变化,直到解除锁定。本次设计采用32位锁存器,同时也是一个右移寄存器,在时钟信号作用下,进行输入值的移位与锁存。
2.3乘法器设计流程
本设计采用移位和加法来实现两个16位二进制数相乘。由乘数的末尾值来
确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时,乘数也右移一位,由次低位作新的末位,空出最高位放部分积的最高位。例如被乘数为00000101,乘数为01101111,初始条件下,部分积为0,乘数最低位为1,加被乘数,和为00000101,使其右移一位,形成新的部分积为00000010,乘数同时右移一位,原和最低位1被放到乘数的最高位,此时,乘数最低位为1,加00000101,和为00000111,使其右移一位,形成新的部分积为0000011,依次类推,循环16次,总共需要进行16次相加和16次移位操作,最终得出乘积结果。其设计流程图所如下所示:
6
开始 乘数 0=1 检查乘数将被乘数寄存器与乘积寄存器的左半部分相加,并将结果写回乘积寄存器的左半部分 乘数 0=0 少于16将乘积寄存器右移1位 次 将乘数寄存器右移1是否已循环执行了16次? 是 已循环16次 完成 7
3.乘法器设计模块 3.1右移寄存器的设计
16位右移寄存器是当时钟信号CLK处于上升沿时,当LOAD=‘1’时,将16位被乘送达分数加载进去;而当LOAD=‘0’时,数据进行移位操作;同时定义一个信号REG8用来装载新数据及移位后的操作数,在完成这些操作后,寄存器的最低位REG8(0)传送给QB输出。该模块的VHDL程序设计如下所示。
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;
8
END PROCESS;
QB <= REG16(0); -- 输出最低位
END behav;
3.2 加法器模块的设计(ADDER16B)
定义实体ADDER16 ,,A,B端口都为输入16位数的输入端口,S为存储两个8位数相加结果的输出端口VHDL定义如下:
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;
3.3.乘1模块设计(ANDARITH)
乘1模块即1位乘法器,可通过选通与门逻辑,利用FOR_LOOP循环语句完成16位二进制数与1位二进制数的乘法运算,即16位二进制DIN从最低位到最高位与1位二进制数ABIN分别做与运算,最后将结果依次传送到DOUT的最低位到最高位输出,即当ABIN为1时,DOUT直接输出DIN, 位0时,DOUT输出全零。1位乘法器的元件引脚图如下所示:
9