8位十进制乘法器

XX 学 院 课 程 论 文

(2012 -2013学年第一学期)

课程论文题目:8位乘法器的设计

学生姓名:

EDA 期末考试 设计报告

设计题目:8位乘法器的设计 学校:XX 学院 系别:电子信息工程系 班别:10电本2班 姓名:XXX 学号: 组员: 指导老师:

摘要:本设计通过对一个8×8的二进制乘法器的设计。在此次设计中该乘法器是由十进制计数器、BCD 码(输入)转二进制码、8位寄存器、8位加法器、 16位寄存器、8x1乘法器、二进制码转BCD 码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD 码,再由BCD_B(BCD 码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD 码) 转化成BCD 码输入到数码管中显示。

关键词:VHDL 语言、十进制计数器、BCD 码转二进制码、8位寄存器、8位加法器、16位寄存器、8x1乘法器、二进制转BCD 码

一、 设计功能要求

能设置输入两个乘数(十进制),按操作键后以十进制的方式显示乘积。

二、设计原理

本设计中该乘法器是由十进制计数器,BCD 码(输入)转二进制码,8位寄存器,8位加法器, 16位寄存器,8x1乘法器,二进制码转BCD 码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD 码,再由BCD_B(BCD 码转二进制码)

转化成二进制码后计算,计算结果由B_BCD(二进制转BCD 码) 转化成BCD 码输入到数码管中显示。使用中只要输入乘数,被乘数,按下键3(脉冲)就可以直接得出结果,显示结果稳定。可以满足两位十进制乘法的计算。

三、整体结构图: 输出高八位

四、设计步骤:

4.1 利用VHDL 语言来实现各个结构模块,其实现的用途及功能如下: 1. 十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。

2. BCD码转二进制模块:实现将输入的8位BCD 码转化成二进制

3. 8位右移寄存器模块:将乘法运算中的被乘数加载于其中,同时进行乘法

运算的移位操作。

4. 8位加法器模块:进行操作数的加法运算。 5. 1位乘法器模块:完成8位与1位的乘法运算。

6. 16位锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。

7. 二进制转BCD 码模块:将16位寄存器的值(积)转化成BCD 码,配合数码管显示

4.2 利用VHDL 语言来实现各个结构模块如下: 4.2.1十进制加计数器设计:

十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位。

Library ieee; --使用ieee 设计库 --0到9计数器

Use ieee.std_logic_unsigned.all; - --允许用户对操作符重新定义 Use ieee.std_logic_1164.all; -- 使用std_logic_1164 程序包 Entity cnt10 is -- 实体名cnt10

Port (clk,clr: in std_logic; --clk 时钟频率,rst 清零

q: out std_logic_vector(3 downto 0)); --四位输出 end cnt10;

architecture behav of cnt10 is -- 结构体名behav begin

process(clk,clr) –-时钟,清零为敏感信号

variable cqi: std_logic_vector(3 downto 0); --定义计数器 begin

if clr='1' then cqi:="0000"; --如果clr='1',则cqi:="0000"

elsif clk'event and clk='1' then----否则,若clk 为上升沿,即上升沿触发 if cqi=9 then cqi:="0000";--如果cqi=9,则cqi:="0000" else cqi:=cqi+1; --否则cqi 自加1 end if; end if; q

编译cnt10.vhd 生成原理图文件,如下图:

图1 cnt10封装图

4.2.2 BCD码转二进制码BCD_B的设计:

将十进制计数器产生的十位和个位合并后,为BCD 码,而计算时使用二进制码计算,所以采用该模块来转化。

Library ieee; --使用ieee 设计库 --(0到99)BCD 码转二进制码 Use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义 Use ieee.std_logic_1164.all; -- 使用std_logic_1164 程序包 Entity BCD_B is --实体名BCD_B

Port ( a: in std_logic_vector(7 downto 0); --输入8位 q: out std_logic_vector(7 downto 0)); --输出8位 end BCD_B;

architecture behav of BCD_B is --结构体名behav

signal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0);--定义四个内部信号 begin

process(a)--a为敏感信号 begin

a1

编译BCD_B.vhd生成原理图文件,如下图

图2 BCD_B封装图

4.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; --使用ieee 设计库 ---8位移位寄存器 use ieee.std_logic_1164.all;--使用std_logic_1164 程序包 use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity reg_8 is --实体名reg_8 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 --结构体名 arc_reg_8

signal reg8:std_logic_vector(7 downto 0); --定义一个内部信号,其位宽为8位 begin

process(r8_clk,clr,r8_load)----三个敏感信号 begin

if clr='1'then

reg8

沿触发

if r8_load='1' then

reg8

reg8(6 downto 0)

end if; -- reg8(6 downto 0)

r8_out

编译reg_8.vhd生成原理图文件,如下图

:

图3 reg_8封装图

4.2.4 8位加法器adder_8的设计:

该加法器由八位二进制加法器组成。其中设计八位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb, 将加数a8_a,a8_b分别与0连接后赋值给aa,bb ,形成9位二进制数,然后aa ,bb 相加赋值给ss ,最后将ss 的低八位赋值给和a8_s,同时将ss 的最高位送给a8_out输出。 library ieee; --使用ieee 设计库 --8位加法器

use ieee.std_logic_1164.all----使用std_logic_1164程序包;

use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity adder_8 is --实体名adder_8

port(a8_a,a8_b:in std_logic_vector(7 downto 0);--定义两个输入端口 a8_s:out std_logic_vector(7 downto 0);--定义输出端口 a8_out:out std_logic);--定义输出端口

end adder_8;

architecture arc_adder_8 of adder_8 is --结构体名arc_adder_8

signal ss:std_logic_vector(8 downto 0); --定义一个内部信号 signal aa,bb:std_logic_vector(8 downto 0);--定义两个内部信号

begin

aa

a8_s

a8_out

end arc_adder_8;

编译adder_8.vhd生成原理图文件,如下图

:

图4 adder_8封装图

4.2.5 1位乘法器multi_1的设计:

利用if 语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时,m1_out输出全为零。

library ieee; --使用ieee 设计库 --1位乘法器

use ieee.std_logic_1164.all;--使用std_logic_1164程序包

use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity multi_1 is --实体名multi_1

port(m1_x:in std_logic;

m1_y:in std_logic_vector(7 downto 0);---输入

m1_out:out std_logic_vector(7 downto 0));---输出

end multi_1;

architecture arc_multi_1 of multi_1 is ---结构体名arc_multi_1

begin

process(m1_x,m1_y)---两个敏感信号

begin

if m1_x='1' then m1_out

end if;

end process;

end arc_multi_1;

编译multi_1.vhd 生成原理图文件,如下图

:

图5 multi_1封装图

4.2.6 16位移位寄存器reg_16的设计:

当清零信号(clr='1')到来时,定义信号变量reg_16归零;信号(r16_clr='1')到来时,定义信号变量reg16清零;否则在时钟信号r16_clk上升沿到来时,将reg16的低8位进行移位操作,同时将8位的数据输入r16_in锁存到reg16的高8位,最后赋值给r16_out输出,cout 控制位输出1。

library ieee; -- 使用ieee 设计库 -- 16位移位寄存器

use ieee.std_logic_1164.all;--使用std_logic_1164程序包

use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity reg_16 is --实体名reg_16

port(r16_clk,clr,r16_clr:in std_logic;

r16_in:in std_logic_vector(8 downto 0);---输入

cout:out std_logic;--定义进位信号

r16_out:out std_logic_vector(15 downto 0));---输出

end reg_16;

architecture arc_reg_16 of reg_16 is --结构体名arc_reg_16

signal reg16:std_logic_vector(15 downto 0); --定义内部信号reg16,位宽为16位

signal i: std_logic_vector(3 downto 0);--定义内部信号i ,位宽为4位 begin

process(r16_clk,r16_clr) --两个敏感信号

begin --当清零信号(clr='1')到来时 if clr='1'then cout

elsif r16_clr='1' then --否则信号(r16_clr='1')到来时 reg16

elsif r16_clk'event and r16_clk='1' then --时钟信号r16_clk上升沿到来时

if (i="1000") then reg16

else

reg16(6 downto 0)

reg16(15 downto 7)

i

end if;

end if;

end process;

r16_out

end arc_reg_16;编译reg_16.vhd 生成原理图文件,如下图

:

图6 reg_16封装图

4.2.7 16位二进制转BCD 码B_BCD的设计:

当reg_16乘积结束时,cout 输出1,为B_BCD的使能信号,r16_out为B_BCD的输入信号,随着时钟上升沿的到来,开始转化,16个周期后完成16为二进制码到BCD 码的转化,输出接数码管显示

Library ieee; ---使用ieee 设计库 --16位二进制转BCD 码(0到9999) Use ieee.std_logic_unsigned.all;--- 允许用户对操作符重新定义

Use ieee.std_logic_1164.all; ---使用std_logic_1164程序包

Entity B_BCD is ---实体名B_BCD

Port ( clk,ena:in std_logic;--- clk时钟,ena 使能

a: in std_logic_vector(15 downto 0);---输入端口

q: out std_logic_vector(15 downto 0));--输出端口

end B_BCD;

architecture behav of B_BCD is ---结构体名behav

begin

process(clk,a) ---敏感信号clk,a

variable i: std_logic_vector(4 downto 0);

variable in_a,out_a :std_logic_vector(15 downto 0);

begin

if ena='0'then

in_a:=a; i:="00000"; out_a:="[**************]0";

elsif clk'event and clk='1' then

if i="10000" then out_a:=out_a;

else out_a:=out_a(14 downto 0)&in_a(15);

in_a:=in_a(14 downto 0)&'0';

i:=i+1;

if i

if out_a( 3 downto 0)>4 then out_a( 3 downto 0):=out_a( 3 downto 0)+3;

end if; --如果大于 4加 3

if out_a( 7 downto 4)>4 then out_a( 7 downto 4):=out_a( 7 downto

4)+3;

end if;

if out_a(11 downto 8)>4 then out_a(11 downto

downto 8)+3;

end if;

if out_a(15 downto 12)>4 then out_a(15 downto

downto 12)+3;

end if;

end if; end if; end if ;

q

end process; end behav;

编译B_BCD.vhd 生成原理图文件,如下图:

8):=out_a(11 12):=out_a(15

图7 B_BCD封装图

4.2.8 8位乘法器的顶层设计:

当输入a ,b 后,随着STAR 上升沿到来,将乘数a 锁存到REG_8中,同时将16位的移位寄存器REG_16清零,然后随着时钟CLK 上升沿的到来,对REG_8中的乘数进行移位操作,最低位在前,由低到高逐位输出。1位乘法器中进行与8位被乘数的相乘运算,并与锁存在16位寄存器reg_16中的高8位进行相加,其和(包含进位)在下一个时钟的上升沿到来时锁存到16位寄存器中。如此进行直到第八个时钟上升沿到来时,reg_16的输出即为所求的乘积,此时reg_16输出端cout 输出高电平,B_BCD使能端有效,随着时钟的到来后,开始二进制到BCD 码的转化,16个时钟后转化完成,输出结果。由(clr )清零端归零后,可以进行下一次的计算。

其顶层程序如下:

library ieee;---使用ieee 设计库

use ieee.std_logic_1164.all;---使用std_logic_1164程序包

use ieee.std_logic_unsigned.all;--- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;--- 定义了相关的算术运算符和数据类型转换函数

entity multi_8x8 is

port(clk,clk_a1,clk_a0,clk_b1,clk_b0,clr,start:in std_logic;--7个输入

out_a1,out_a0,out_b1,out_b0: buffer std_logic_vector(3 downto 0);4个输出

result: out std_logic_vector(15 downto 0));---结果输出 end multi_8x8;

architecture arc_multi_8x8 of multi_8x8 is --结构体名arc_multi_8x8

component cnt10 --调用0到9计数器声明

Port (clk,clr: in std_logic;

q: out std_logic_vector(3 downto 0));

end component;

component BCD_B --调用0到99)BCD 码转二进制码声明 Port ( a: in std_logic_vector(7 downto 0); q: out std_logic_vector(7 downto 0)); end component;

component B_BCD --调用16位二进制转BCD 码(0到9999)声明 Port ( clk,ena:in std_logic;

a: in std_logic_vector(15 downto 0); q: out std_logic_vector(15 downto 0)); end component;

component multi_1 --调用1位乘法器声明 port(m1_x:in std_logic;

m1_y:in std_logic_vector(7 downto 0); m1_out:out std_logic_vector(7 downto 0)); end component;

component adder_8 --调用8位加法器声明 port(a8_a,a8_b:in std_logic_vector(7 downto 0); a8_s:out std_logic_vector(7 downto 0); a8_out:out std_logic); end component;

component reg_8 --调用8位寄存器声明 port(r8_clk,clr,r8_load:in std_logic;

r8_in:in std_logic_vector(7 downto 0); r8_out:out std_logic); end component;

component reg_16 --调用16位寄存器声明 port(r16_clk,clr,r16_clr:in std_logic;

r16_in:in std_logic_vector(8 downto 0); cout:out std_logic;

r16_out:out std_logic_vector(15 downto 0)); end component;

signal q_a,cout:std_logic;

signal andsd,a,b,aa,bb:std_logic_vector(7 downto 0); signal dtbin:std_logic_vector(8 downto 0); signal dtbout:std_logic_vector(15 downto 0); begin

aa

u1:cnt10 --例化语句 port map(clk_a1,clr,out_a1); u2:cnt10

port map(clk_a0,clr,out_a0); u3:cnt10

port map(clk_b1,clr,out_b1); u4:cnt10

port map(clk_b0,clr,out_b0); u5:BCD_B port map(aa,a); u6:BCD_B

port map(bb,b); u7:reg_8

port map(clk,clr,start,a,q_a); u8:multi_1

port map(q_a,b,andsd); u9:adder_8

port map(dtbout(15 downto 8),andsd,dtbin(7 downto 0),dtbin(8)); u10:reg_16

port map(clk,clr,start,dtbin,cout,dtbout); u11:B_BCD

port map(clk,cout,dtbout,result); end arc_multi_8x8;

编译multi_8x8.vhd 生成原理图文件,如下图

:

图8 multi_8x8封装图

五.软件设计

5.1程序流程方框图

图9 电路框图

图10 简单流程图

分析说明:首先由计数器输入乘数被乘数,经BCD_B转化成二进制码,记作a ,b 。图中8位移位寄存器reg_8存放(二进制)乘数a ,从a 的最低位开始,每次从reg_8中移出一位,送至1×8位乘法器multi_1中,同时将被乘数加至multi_1中,进行乘法运算,运算的结果再送至8位加法器adder_8中,同时取出16位移位寄存器reg_16的高8位与之进行相加,相加后结果即部分积存入reg_16中,进行移位后并保存。这样经过8次对乘数a 的移位操作,

所以的部分积已全加至reg_16中,此时锁存器reg_16存放的值即所要求的积,再经过B_BCD转化成BCD 码显示 六.引脚锁定:

6.1 根据乘法器原理图选择最佳电路图结构模式,这里我们选择模式3,以下是模式3电路结构图:

6.2 实验引脚分配如下图:

引脚分配图

7.3 操作说明:

7.3.1 键8为被乘数十位输入,键7为被乘数个位输入,键6为乘数十位输入,键5为乘数个位输入,键4为清零键,键3为“=“键。如需进行下一次计算,则需要按一下清零键。

7.3.2 乘数和被乘数在前四位数码管上显示。当数据输入完成后,按下键3(“=”) ,后四位数码管显示积 八. 测试数据及结果仿真图 8.1 测试数据:

表1 数据测试表

8.2 数据测试结果仿真图:

仿真图1 32*42=1344

仿真图2 30*40=1200

仿真图3

6*40=2400

仿真图4

5*32=160

仿真图5 4*4=16

仿真图6 99*99=9801

九.参考文献

[1].EDA技术与VHDL (第三版)潘松,黄继业 编著 清华大学出版社

[2]. EDA原理及应用实验教程(第一版) 何宾 编著 清华大学出版社

[3].EDA技术与应用 (第三版) 江国强 编著 电子工业出版社

31

XX 学 院 课 程 论 文

(2012 -2013学年第一学期)

课程论文题目:8位乘法器的设计

学生姓名:

EDA 期末考试 设计报告

设计题目:8位乘法器的设计 学校:XX 学院 系别:电子信息工程系 班别:10电本2班 姓名:XXX 学号: 组员: 指导老师:

摘要:本设计通过对一个8×8的二进制乘法器的设计。在此次设计中该乘法器是由十进制计数器、BCD 码(输入)转二进制码、8位寄存器、8位加法器、 16位寄存器、8x1乘法器、二进制码转BCD 码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD 码,再由BCD_B(BCD 码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD 码) 转化成BCD 码输入到数码管中显示。

关键词:VHDL 语言、十进制计数器、BCD 码转二进制码、8位寄存器、8位加法器、16位寄存器、8x1乘法器、二进制转BCD 码

一、 设计功能要求

能设置输入两个乘数(十进制),按操作键后以十进制的方式显示乘积。

二、设计原理

本设计中该乘法器是由十进制计数器,BCD 码(输入)转二进制码,8位寄存器,8位加法器, 16位寄存器,8x1乘法器,二进制码转BCD 码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD 码,再由BCD_B(BCD 码转二进制码)

转化成二进制码后计算,计算结果由B_BCD(二进制转BCD 码) 转化成BCD 码输入到数码管中显示。使用中只要输入乘数,被乘数,按下键3(脉冲)就可以直接得出结果,显示结果稳定。可以满足两位十进制乘法的计算。

三、整体结构图: 输出高八位

四、设计步骤:

4.1 利用VHDL 语言来实现各个结构模块,其实现的用途及功能如下: 1. 十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。

2. BCD码转二进制模块:实现将输入的8位BCD 码转化成二进制

3. 8位右移寄存器模块:将乘法运算中的被乘数加载于其中,同时进行乘法

运算的移位操作。

4. 8位加法器模块:进行操作数的加法运算。 5. 1位乘法器模块:完成8位与1位的乘法运算。

6. 16位锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。

7. 二进制转BCD 码模块:将16位寄存器的值(积)转化成BCD 码,配合数码管显示

4.2 利用VHDL 语言来实现各个结构模块如下: 4.2.1十进制加计数器设计:

十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位。

Library ieee; --使用ieee 设计库 --0到9计数器

Use ieee.std_logic_unsigned.all; - --允许用户对操作符重新定义 Use ieee.std_logic_1164.all; -- 使用std_logic_1164 程序包 Entity cnt10 is -- 实体名cnt10

Port (clk,clr: in std_logic; --clk 时钟频率,rst 清零

q: out std_logic_vector(3 downto 0)); --四位输出 end cnt10;

architecture behav of cnt10 is -- 结构体名behav begin

process(clk,clr) –-时钟,清零为敏感信号

variable cqi: std_logic_vector(3 downto 0); --定义计数器 begin

if clr='1' then cqi:="0000"; --如果clr='1',则cqi:="0000"

elsif clk'event and clk='1' then----否则,若clk 为上升沿,即上升沿触发 if cqi=9 then cqi:="0000";--如果cqi=9,则cqi:="0000" else cqi:=cqi+1; --否则cqi 自加1 end if; end if; q

编译cnt10.vhd 生成原理图文件,如下图:

图1 cnt10封装图

4.2.2 BCD码转二进制码BCD_B的设计:

将十进制计数器产生的十位和个位合并后,为BCD 码,而计算时使用二进制码计算,所以采用该模块来转化。

Library ieee; --使用ieee 设计库 --(0到99)BCD 码转二进制码 Use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义 Use ieee.std_logic_1164.all; -- 使用std_logic_1164 程序包 Entity BCD_B is --实体名BCD_B

Port ( a: in std_logic_vector(7 downto 0); --输入8位 q: out std_logic_vector(7 downto 0)); --输出8位 end BCD_B;

architecture behav of BCD_B is --结构体名behav

signal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0);--定义四个内部信号 begin

process(a)--a为敏感信号 begin

a1

编译BCD_B.vhd生成原理图文件,如下图

图2 BCD_B封装图

4.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; --使用ieee 设计库 ---8位移位寄存器 use ieee.std_logic_1164.all;--使用std_logic_1164 程序包 use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity reg_8 is --实体名reg_8 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 --结构体名 arc_reg_8

signal reg8:std_logic_vector(7 downto 0); --定义一个内部信号,其位宽为8位 begin

process(r8_clk,clr,r8_load)----三个敏感信号 begin

if clr='1'then

reg8

沿触发

if r8_load='1' then

reg8

reg8(6 downto 0)

end if; -- reg8(6 downto 0)

r8_out

编译reg_8.vhd生成原理图文件,如下图

:

图3 reg_8封装图

4.2.4 8位加法器adder_8的设计:

该加法器由八位二进制加法器组成。其中设计八位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb, 将加数a8_a,a8_b分别与0连接后赋值给aa,bb ,形成9位二进制数,然后aa ,bb 相加赋值给ss ,最后将ss 的低八位赋值给和a8_s,同时将ss 的最高位送给a8_out输出。 library ieee; --使用ieee 设计库 --8位加法器

use ieee.std_logic_1164.all----使用std_logic_1164程序包;

use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity adder_8 is --实体名adder_8

port(a8_a,a8_b:in std_logic_vector(7 downto 0);--定义两个输入端口 a8_s:out std_logic_vector(7 downto 0);--定义输出端口 a8_out:out std_logic);--定义输出端口

end adder_8;

architecture arc_adder_8 of adder_8 is --结构体名arc_adder_8

signal ss:std_logic_vector(8 downto 0); --定义一个内部信号 signal aa,bb:std_logic_vector(8 downto 0);--定义两个内部信号

begin

aa

a8_s

a8_out

end arc_adder_8;

编译adder_8.vhd生成原理图文件,如下图

:

图4 adder_8封装图

4.2.5 1位乘法器multi_1的设计:

利用if 语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时,m1_out输出全为零。

library ieee; --使用ieee 设计库 --1位乘法器

use ieee.std_logic_1164.all;--使用std_logic_1164程序包

use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity multi_1 is --实体名multi_1

port(m1_x:in std_logic;

m1_y:in std_logic_vector(7 downto 0);---输入

m1_out:out std_logic_vector(7 downto 0));---输出

end multi_1;

architecture arc_multi_1 of multi_1 is ---结构体名arc_multi_1

begin

process(m1_x,m1_y)---两个敏感信号

begin

if m1_x='1' then m1_out

end if;

end process;

end arc_multi_1;

编译multi_1.vhd 生成原理图文件,如下图

:

图5 multi_1封装图

4.2.6 16位移位寄存器reg_16的设计:

当清零信号(clr='1')到来时,定义信号变量reg_16归零;信号(r16_clr='1')到来时,定义信号变量reg16清零;否则在时钟信号r16_clk上升沿到来时,将reg16的低8位进行移位操作,同时将8位的数据输入r16_in锁存到reg16的高8位,最后赋值给r16_out输出,cout 控制位输出1。

library ieee; -- 使用ieee 设计库 -- 16位移位寄存器

use ieee.std_logic_1164.all;--使用std_logic_1164程序包

use ieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;-- 定义了相关的算术运算符和数据类型转换函数 entity reg_16 is --实体名reg_16

port(r16_clk,clr,r16_clr:in std_logic;

r16_in:in std_logic_vector(8 downto 0);---输入

cout:out std_logic;--定义进位信号

r16_out:out std_logic_vector(15 downto 0));---输出

end reg_16;

architecture arc_reg_16 of reg_16 is --结构体名arc_reg_16

signal reg16:std_logic_vector(15 downto 0); --定义内部信号reg16,位宽为16位

signal i: std_logic_vector(3 downto 0);--定义内部信号i ,位宽为4位 begin

process(r16_clk,r16_clr) --两个敏感信号

begin --当清零信号(clr='1')到来时 if clr='1'then cout

elsif r16_clr='1' then --否则信号(r16_clr='1')到来时 reg16

elsif r16_clk'event and r16_clk='1' then --时钟信号r16_clk上升沿到来时

if (i="1000") then reg16

else

reg16(6 downto 0)

reg16(15 downto 7)

i

end if;

end if;

end process;

r16_out

end arc_reg_16;编译reg_16.vhd 生成原理图文件,如下图

:

图6 reg_16封装图

4.2.7 16位二进制转BCD 码B_BCD的设计:

当reg_16乘积结束时,cout 输出1,为B_BCD的使能信号,r16_out为B_BCD的输入信号,随着时钟上升沿的到来,开始转化,16个周期后完成16为二进制码到BCD 码的转化,输出接数码管显示

Library ieee; ---使用ieee 设计库 --16位二进制转BCD 码(0到9999) Use ieee.std_logic_unsigned.all;--- 允许用户对操作符重新定义

Use ieee.std_logic_1164.all; ---使用std_logic_1164程序包

Entity B_BCD is ---实体名B_BCD

Port ( clk,ena:in std_logic;--- clk时钟,ena 使能

a: in std_logic_vector(15 downto 0);---输入端口

q: out std_logic_vector(15 downto 0));--输出端口

end B_BCD;

architecture behav of B_BCD is ---结构体名behav

begin

process(clk,a) ---敏感信号clk,a

variable i: std_logic_vector(4 downto 0);

variable in_a,out_a :std_logic_vector(15 downto 0);

begin

if ena='0'then

in_a:=a; i:="00000"; out_a:="[**************]0";

elsif clk'event and clk='1' then

if i="10000" then out_a:=out_a;

else out_a:=out_a(14 downto 0)&in_a(15);

in_a:=in_a(14 downto 0)&'0';

i:=i+1;

if i

if out_a( 3 downto 0)>4 then out_a( 3 downto 0):=out_a( 3 downto 0)+3;

end if; --如果大于 4加 3

if out_a( 7 downto 4)>4 then out_a( 7 downto 4):=out_a( 7 downto

4)+3;

end if;

if out_a(11 downto 8)>4 then out_a(11 downto

downto 8)+3;

end if;

if out_a(15 downto 12)>4 then out_a(15 downto

downto 12)+3;

end if;

end if; end if; end if ;

q

end process; end behav;

编译B_BCD.vhd 生成原理图文件,如下图:

8):=out_a(11 12):=out_a(15

图7 B_BCD封装图

4.2.8 8位乘法器的顶层设计:

当输入a ,b 后,随着STAR 上升沿到来,将乘数a 锁存到REG_8中,同时将16位的移位寄存器REG_16清零,然后随着时钟CLK 上升沿的到来,对REG_8中的乘数进行移位操作,最低位在前,由低到高逐位输出。1位乘法器中进行与8位被乘数的相乘运算,并与锁存在16位寄存器reg_16中的高8位进行相加,其和(包含进位)在下一个时钟的上升沿到来时锁存到16位寄存器中。如此进行直到第八个时钟上升沿到来时,reg_16的输出即为所求的乘积,此时reg_16输出端cout 输出高电平,B_BCD使能端有效,随着时钟的到来后,开始二进制到BCD 码的转化,16个时钟后转化完成,输出结果。由(clr )清零端归零后,可以进行下一次的计算。

其顶层程序如下:

library ieee;---使用ieee 设计库

use ieee.std_logic_1164.all;---使用std_logic_1164程序包

use ieee.std_logic_unsigned.all;--- 允许用户对操作符重新定义

use ieee.std_logic_arith.all;--- 定义了相关的算术运算符和数据类型转换函数

entity multi_8x8 is

port(clk,clk_a1,clk_a0,clk_b1,clk_b0,clr,start:in std_logic;--7个输入

out_a1,out_a0,out_b1,out_b0: buffer std_logic_vector(3 downto 0);4个输出

result: out std_logic_vector(15 downto 0));---结果输出 end multi_8x8;

architecture arc_multi_8x8 of multi_8x8 is --结构体名arc_multi_8x8

component cnt10 --调用0到9计数器声明

Port (clk,clr: in std_logic;

q: out std_logic_vector(3 downto 0));

end component;

component BCD_B --调用0到99)BCD 码转二进制码声明 Port ( a: in std_logic_vector(7 downto 0); q: out std_logic_vector(7 downto 0)); end component;

component B_BCD --调用16位二进制转BCD 码(0到9999)声明 Port ( clk,ena:in std_logic;

a: in std_logic_vector(15 downto 0); q: out std_logic_vector(15 downto 0)); end component;

component multi_1 --调用1位乘法器声明 port(m1_x:in std_logic;

m1_y:in std_logic_vector(7 downto 0); m1_out:out std_logic_vector(7 downto 0)); end component;

component adder_8 --调用8位加法器声明 port(a8_a,a8_b:in std_logic_vector(7 downto 0); a8_s:out std_logic_vector(7 downto 0); a8_out:out std_logic); end component;

component reg_8 --调用8位寄存器声明 port(r8_clk,clr,r8_load:in std_logic;

r8_in:in std_logic_vector(7 downto 0); r8_out:out std_logic); end component;

component reg_16 --调用16位寄存器声明 port(r16_clk,clr,r16_clr:in std_logic;

r16_in:in std_logic_vector(8 downto 0); cout:out std_logic;

r16_out:out std_logic_vector(15 downto 0)); end component;

signal q_a,cout:std_logic;

signal andsd,a,b,aa,bb:std_logic_vector(7 downto 0); signal dtbin:std_logic_vector(8 downto 0); signal dtbout:std_logic_vector(15 downto 0); begin

aa

u1:cnt10 --例化语句 port map(clk_a1,clr,out_a1); u2:cnt10

port map(clk_a0,clr,out_a0); u3:cnt10

port map(clk_b1,clr,out_b1); u4:cnt10

port map(clk_b0,clr,out_b0); u5:BCD_B port map(aa,a); u6:BCD_B

port map(bb,b); u7:reg_8

port map(clk,clr,start,a,q_a); u8:multi_1

port map(q_a,b,andsd); u9:adder_8

port map(dtbout(15 downto 8),andsd,dtbin(7 downto 0),dtbin(8)); u10:reg_16

port map(clk,clr,start,dtbin,cout,dtbout); u11:B_BCD

port map(clk,cout,dtbout,result); end arc_multi_8x8;

编译multi_8x8.vhd 生成原理图文件,如下图

:

图8 multi_8x8封装图

五.软件设计

5.1程序流程方框图

图9 电路框图

图10 简单流程图

分析说明:首先由计数器输入乘数被乘数,经BCD_B转化成二进制码,记作a ,b 。图中8位移位寄存器reg_8存放(二进制)乘数a ,从a 的最低位开始,每次从reg_8中移出一位,送至1×8位乘法器multi_1中,同时将被乘数加至multi_1中,进行乘法运算,运算的结果再送至8位加法器adder_8中,同时取出16位移位寄存器reg_16的高8位与之进行相加,相加后结果即部分积存入reg_16中,进行移位后并保存。这样经过8次对乘数a 的移位操作,

所以的部分积已全加至reg_16中,此时锁存器reg_16存放的值即所要求的积,再经过B_BCD转化成BCD 码显示 六.引脚锁定:

6.1 根据乘法器原理图选择最佳电路图结构模式,这里我们选择模式3,以下是模式3电路结构图:

6.2 实验引脚分配如下图:

引脚分配图

7.3 操作说明:

7.3.1 键8为被乘数十位输入,键7为被乘数个位输入,键6为乘数十位输入,键5为乘数个位输入,键4为清零键,键3为“=“键。如需进行下一次计算,则需要按一下清零键。

7.3.2 乘数和被乘数在前四位数码管上显示。当数据输入完成后,按下键3(“=”) ,后四位数码管显示积 八. 测试数据及结果仿真图 8.1 测试数据:

表1 数据测试表

8.2 数据测试结果仿真图:

仿真图1 32*42=1344

仿真图2 30*40=1200

仿真图3

6*40=2400

仿真图4

5*32=160

仿真图5 4*4=16

仿真图6 99*99=9801

九.参考文献

[1].EDA技术与VHDL (第三版)潘松,黄继业 编著 清华大学出版社

[2]. EDA原理及应用实验教程(第一版) 何宾 编著 清华大学出版社

[3].EDA技术与应用 (第三版) 江国强 编著 电子工业出版社

31


相关文章

  • 一位十进制BCD码加法器设计
  • 一位十进制 BCD 码加法器设计 年3月30日 2012 实验目的: 熟悉基于EDA 平台的电路设计,掌握MAXPLUS 的使用,并运用 MAXPLUS 设计电路图,模拟其工作环境 实验原理: MAXPLUS 软件能够模拟电路工作的实际情况 ...查看


  • 浮点数除法器的FPGA实现
  • 第39卷 专辑2008年5月 * 太原理工大学学报 JO U RN A L O F T A IYU A N U N IV ER SIT Y OF T ECH N OL O GY V ol. 39Spec. Issue M ay 2008 文 ...查看


  • 8位二进制乘法电路
  • 作业名称:8位二进制乘法电路 1题目分析 该乘法电路要实现的功能为8位二进制的乘法电路,具体的乘法过程是采用移位相加的方法.即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得 ...查看


  • 直接补码阵列乘法器的设计原理
  • 直接补码阵列乘法器的设计原理 * 李澄举 (嘉应学院 计算机系, 广东 梅州 514015) [摘要]直接补码阵列乘法器的工作原理是<计算机组成原理>课程的难点.本文从组成阵列乘法器的四类全加器的工作原理分析开始,结合补码和真值 ...查看


  • 基于FPGA的RS编码器的设计与实现 - 21IC中国电子网
  • 基于FPGA的RS编码器的设计与实现 时间:2009-03-09 09:55:18 来源:电子科技 作者:何秋阳 1 RS编码原理 RS编码是一种线性的块编码,其表示形式为RS(N,K).当编码器接收到一个数据信息序列,该数据信息序列被分割 ...查看


  • 近似加法器
  • 电子科技大学 UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA 数字电路 课程设计报告 课程设计题目 近似加法器 学 号 [1**********]09 作者姓名 宁博宇 指导 ...查看


  • 小学数学第七册教案
  • 小学数学第七册教案 小数四教案一 第一单元 课题一 数的产生 十进制计数法 目的: 1 认识自然数和整数 2 认识亿级的数和计数单位,掌握亿级数的数位顺序表和十进制计数法,能正确读出亿级数. 过程: 一 数字的产生 结合日常生活中的数字应用 ...查看


  • 8位加法器的设计
  • 实验二 8位加法器设计 一.实验目的 熟悉利用Quartus Ⅱ的图形编辑输入法设计简单组合电路,掌握层次化设计方法,并通过8位全加器的设计,进一步熟悉利用EDA 软件进行数字系统设计的流程. 二.实验仪器与器材 计算机1台,GW48-PK ...查看


  • 门电路型号对照
  • 门电路 四2输入或非门 4001/7402 复合门电路 4007 四2输入与非门 4011 /7408 双4输入与非门4012/7420 三3入与非门4023/7410 四异或门4030/4070/4077/7486 4输入可扩展多功能门4 ...查看


热门内容