16位(8x8)硬件乘法器设计
华侨大学
- 1 - EDA课程设计
16位(8x8)硬件乘法器设计
学校:华侨大学
学院:信息与工程学院
班级:10集成
姓名:项传煜
学号:1015251031
老师:凌朝东
16位(8x8)硬件乘法器设计
华侨大学
- 2 - 目录
摘要
一.
设计要求
二.
正文
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 16位(8x8)硬件乘法器设计
华侨大学
- 3 - 摘要
本设计通过对一个8×8的二进制乘法器的设计,学习利用VHDL语言来描述简单的算法,掌握利用移位相加方法实现乘法运算的基本原理。在此次设计中该乘法器是由十进制计数器,BCD码(输入)转二进制码,8位寄存器,8位加法器, 16位寄存器,8x1乘法器,二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。此次设计的创新点在于cnt10,BCD_B,B_BCD的设计,使得电路的输入简单,显示方式为十进制,符合人们的习惯。使用中只要输入乘数,被乘数,按下键3(脉冲)就可以直接得出结果,显示结果稳定。可以满足两位十进制乘法的计算。
一.设计要求
设计一个十六位(8*8)硬件乘法器(难度系数1.0)
要求:2位十进制乘法;能同时显示乘数,被乘数和积的信息(LED数码管)。
二.正文
2.1. 系统设计
2.1.1 系统设计方案
方案一:直接生成乘法器,再配合输入,输出电路,构成2位十进制乘法器,该方案简单,原理清晰明了,但占用资源比较多,且不易于了解内部结构,及其乘法原理。
方案二:移位相加方法实现乘法运算再配合输入,输出电路,构成2位十进制乘法器,该方案原理简单,占用资源少,易于初学者掌握移位相加方法实现乘法运算的原理,但电路模块较多。
方案选择:由于现在属初学阶段,掌握原理较为重要,故经小组讨论,一致同意采用方案二。 16位(8x8)硬件乘法器设计
华侨大学
- 4 - 2.1.2 系统设计原理
在此次设计中该乘法器是由十进制计数器,BCD码(输入)转二进制码,8位寄存器,8位加法器, 16位寄存器,8x1乘法器,二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。
例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101和10010011,其计算过程如下:
2.2. 各子模块设计
下面分解8位乘法器的层次结构,分为以下7个模块:
1. 十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。
2. BCD码转二进制模块:实现将输入的8位BCD码转化成二进制
3. 右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中的被乘数加载于其中,同时
进行乘法运算的移位操作。
4. 加法器模块:这是一个8位加法器,进行操作数的加法运算。
5. 1位乘法器模块:完成8位与1位的乘法运算。
6. 锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。 16位(8x8)硬件乘法器设计
华侨大学
- 5 - 7. 二进制转BCD码模块:将16位寄存器的值(积)转化成BCD码,配合数码管显示
2.2.1 十进制加计数器设计
十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位
Library ieee; --0到9计数器
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_1164.all;
Entity cnt10 is
Port (clk,clr: in std_logic;
q: out std_logic_vector(3 downto 0));
end cnt10;
architecture behav of cnt10 is
begin
process(clk,clr)
variable cqi: std_logic_vector(3 downto 0);
begin
if clr='1' then cqi:="0000";
elsif clk'event and clk='1' then
if cqi=9 then cqi:="0000";
else cqi:=cqi+1;
end if;
end if;
q<=cqi;
end process;
end behav;
2.2.2 BCD码转二进制码BCD_B的设计
将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化
Library ieee; --(0到99)BCD码转二进制码
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_1164.all;
Entity BCD_B is
Port ( a: in std_logic_vector(7 downto 0);
q: out std_logic_vector(7 downto 0));
end BCD_B;
architecture behav of BCD_B is
signal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0); 16位(8x8)硬件乘法器设计
华侨大学
- 6 - begin
process(a)
begin
a1<="0000"&a(3 downto 0);
a2<="0000"&a(7 downto 4);
a3<=a2(6 downto 0)&'0';
a4<=a2(4 downto 0)&"000";
cq<=a4+a3+a1;
q<=cq;
end process;
end behav;
2.2.3 8位移位寄存器reg_8的设计
8位移位寄存器是在时钟(r8_clk'event and r8_clk='1')信号作用下,当r8_load='1'时,将8位乘数加载进入;而当r8_load='0'时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。
library ieee; ---8位移位寄存器
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity reg_8 is
port(r8_clk,clr,r8_load:in std_logic;
r8_in:in std_logic_vector(7 downto 0);
r8_out:out std_logic);
end reg_8;
architecture arc_reg_8 of reg_8 is
signal reg8:std_logic_vector(7 downto 0);
begin
process(r8_clk,clr,r8_load)
begin
if clr='1'then
reg8<="00000000";
elsif r8_clk'event and r8_clk='1' then
if r8_load='1' then
reg8<=r8_in;
else
reg8(6 downto 0)<=reg8(7 downto 1);
end if;
end if;
end process;
r8_out<=reg8(0);