当前位置:文档之家› 16位(8x8)硬件乘法器设计报告

16位(8x8)硬件乘法器设计报告

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);

相关主题