九九乘法表系统的设计
天津工艺美术职业学院-学雷锋好榜样作文
河南科技大学
课 程 设 计 说 明 书
课程名称
题
目
学 院
班 级
专 业
学 号
学生姓名
指导教师
__
现代数字系统设计
____
九九乘法表系统的设计_____
___电子信息工程学院__
__ 研1104班
电力电子与电力传动
__ 201104188
___ 邵鸿翔
_ _ 刘 珊 中 __
九九乘法表系统的设计
1. 系统功能和技术指标
九九乘
法表系统能够自动或手动进行两个1位十进制数的乘法,并自动显示
被乘数、乘数和乘积,该系统示意图
如下图所示。图中AA和BB分别为被乘数和
乘数的外部输
入端,它们用 1位 BCD码表示。系统用十进制七段数字显示器显示被乘数A、
乘数B和乘
积M的值,其中M用2位十进制显示器显示。
系统的功能和指标如下:
(
1)自动进行乘法运算并显示。用户将控制开关ARH置逻辑1,则系统内
部自动产生被乘数A’和乘数
B’,并按常规的九九乘法表方式,依照一定速率自
动进行 A’= 0~9和 B’=
0~9的乘法运算,即 A’×B’= 0 × 0,……,
0×9;1×0,……,1×9;……;
8×0;……,8×9;9×0,……,9×9。相应
有乘积M=0,……,0;0,……,9;……;
0,……,72;0,……,81等。
由于被乘数和乘数的最大值为9,故配置1位十进制显示;而乘积最大值为
81
,则配置两位十进制数字显示。
(2)手动进行乘法运算并显示。当控制开关ARH为逻辑0
时,则乘法表系
统仅对外部输人被乘数AA和乘数BB的特定数据进行乘法运算并输出。在手动工
作状态时,分别采用两组4位开关产生被乘数和乘数的BCD码输人。
(3)乘法运算是以二进制数的乘法来进行的,而其结果要用变换器转换为
2位
BCD码输出,并应配有相应的显示译码器。
2. 算法设计
乘法器M=A*B具有自动运
算和手动运算两种方式,自动方式时,
AA
,
BB
;在手动方式时,A=AA,B=BB,这由控制开关ARH的来决定。
现设定信号EE为九九乘法表
完成一次自动工作,从
000,9981
,
全过
程的结束信号;TT
是某定时器(计数器)的结束信号,该定时器确定手动运算
的显示时间。则本系统的算法流程图如图所示
。这张图是系统算法流程,在增加
了状态标注和明确了输出信号后,也可看做系统控制器的ASM图,有
关状态标识
和输出信号等已在图中给出。
图1
九九乘法表系统算法流程图(系统控制器的ASM图)
3. 数据处理单元的实现
九九乘法表系统的数据处理单元结构框图如图2所示。
图2
九九乘法表系统的数据处理单元结构框图
(1)高速乘法器电路
图3 乘法器电路
对于4位乘法器而言,设A=1011,B=1101,则
运算过程可由图8.3-2所示。从
乘法运算过程可知,乘法运算可分解为移位和相加两种子运算,而且
是多次相加
运算,所以是一个累加的过程。实现这一累加过程的方法是,把每次相加的结果
用部
分积P表示,若B中某一位 Bi=1,把部分积P与A相加后右移1位;若B
中某一位Bi= 0,
则部分积P与0相加后右移1位(相当于只移位不累加)。通
过4次累加和移位,最后得到的部分积P就
是A与B的乘积。
(2)被乘数、乘数自动发生器。系统处于自动工作状态时,被乘数和乘数应自动、有序地产生,为此采用两只模10加计数器分别实现。被乘数计数器由0→9
记满时,进位信号
CO=1,则乘法计数器加1,从而达到被乘数的从0→9变化和
乘数的从0→9变化按次序相乘。 <
br>(3)被乘数、乘数选择电路。由于在自动和手动工作状态时,乘法器的输入分
别为数据处理单元
内部自动产生或系统外部输入被乘数和乘数,为此配置两个4
位2选1数据选择器来选择恰当的输入,其
地址变量由控制器根据ARH的状态来
确定。
(4)码制变换电路。快速乘法器输出乘积M=
A×B为7位二进制数,即
Mm
6
m
5
m
4
m<
br>3
m
2
m
1
m
0
,必须转换为两位8421
BCD码显示,也就是说,从0×0=0
直到9×9=81,均应以十进制显示,以使用户直接观察到十
进制运算结果(被乘
数、乘数也用十进制数字显示),码制变换电路就是为实现该功能而设置的。 (5)显示译码电路。把BCD码表示的A、B和M变换为1位或2位十进制数字显
示器(七段显示
器)的控制信号,这是显示译码器应实现的功能。
4. 设计输入
建立九九乘法表系统的输
入文件可以有多种方式:图形描述方式、VHDL或
VerilogHDL语言描述方式或者图形和文本
相结合的描述方式。但是,无论采用
何种描述方式,对于复杂的系统,总采用层次化设计描述的思路,九
九乘法表系
统也不例外。因为在一个设计文件中完成全部的逻辑描述是非常困难的,也不利
于设
计调试,因而单层次的描述不是一种优良的设计风格。
利用VHDL支持层次化设计的功能,依据图2
所示的结构框图,采用了如图
3的层次结构来建立九九乘法表系统的VHDL文件输入文件。
图4 系统层次结构
在本系统的设计文件中,由于各种元件都是通
用型的,为此采用程序包。该系统
使用了两个程序包:一个是std_logic_1164,它才是I
EEE标准制定的程序包,
包含在IEEE库中,其中说明了一些基本的数据类型和对应的运算规则,满
足普
通设计的需要。另一个是PLUS_LIB,它是本设计作者自定义的程序包,我们把
如图
4所示的模块均放在自定义的PLUS_LIB程序包中,他们说明了在顶层文件
内要使用的元件。
程序包PLUS_LIB的描述文件如下:
LIBRARY
IEEE;
USE _LOGIC_;
PACKAGE PLUS_LIB
IS
COMPONENT PLUSCONTROL
PORT(CLK :IN STD_LOGIC;
START,ARH,TT,EE :IN STD_LOGIC;
DONE,CRT,S,ENT :OUT STD_LOGIC);
END
COMPONENT;
COMPONENT COUNT8
PORT(CLK :IN STD_LOGIC;
CRT,ENT
:IN STD_LOGIC;
TT :OUT STD_LOGIC);
END COMPONENT;
COMPONENT CNT1
PORT(CLK : IN STD_LOGIC;
CRT :IN
STD_LOGIC;
OC :OUT STD_LOGIC;
QA
:OUT INTEGER RANGE 0 TO 9);
END COMPONENT;
COMPONENT CNT2
PORT(CLK :IN STD_LOGIC;
CRT :IN
STD_LOGIC;
EN2 :IN STD_LOGIC;
EE
:OUT STD_LOGIC;
QB :OUT INTEGER RANGE 0 TO
9);
END COMPONENT;
COMPONENT MUX1
PORT(BB,QB:IN INTEGER RANGE 0 TO 9;
S:IN STD_LOGIC;
B:OUT INTEGER RANGE 0 TO
9);
END COMPONENT;
COMPONENT MUX2
PORT(AA,QA :IN INTEGER RANGE 0 TO 9;
S
:IN STD_LOGIC;
A :OUT INTEGER RANGE 0 TO
9);
END COMPONENT;
COMPONENT PLUS
PORT(A:IN INTEGER RANGE 0 TO 9;
B:IN
INTEGER RANGE 0 TO 9;
M:OUT INTEGER RANGE 0
TO 81);
END COMPONENT;
COMPONENT
TRANS
PORT(M:IN
INTEGER RANGE 0 TO 81;
BD1,BD2:OUT INTEGER
RANGE 0 TO 9);
END PLUS_LIB;
COMPONENT DISPLAY
PORT(DB1:IN INTEGER RANGE 9 TO 0;
XA1:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
END
COMPONENT;
END PLUS_LIB;
系统顶层设计:
LIBRARY IEEE;
USE _LOGIC_;
USE _;
ENTITY PLUS_TOP IS
PORT(CLK:IN
STD_LOGIC;
AA,BB: IN INTEGER RANGE 0 TO 9;
A,B:BUFFER INTEGER RANGE 0 TO 9;
EE,OC: BUFFER STD_LOGIC;
BD1,BD2:OUT INTEGER
RANGE 0 TO 9;
START,ARH:IN STD_LOGIC);
END PLUS_TOP;
ARCHITECTURE XYB OF
PLUS_TOP IS
SIGNAL
ENT,CRT,DONE,S,TT:STD_LOGIC;
SIGNAL
QA,QB,TA,TB:INTEGER RANGE 0 TO 9;
SIGNAL M:
INTEGER RANGE 0 TO 81;
BEGIN
A<=TA;
B<=TB;
CONTROL:PLUSCONTROL
PORT
MAP(CLK,START,ARH,TT,EE,DONE,CRT,S,ENT);
COUNT1:COUNT8
PORT MAP(CLK,CRT,ENT,TT);
COUNT2:CNT1
PORT MAP(CLK,CRT,OC,QA);
COUNT3:CNT2
PORT
MAP(CLK,CRT,OC,EE,QB);
M1:MUX1
PORT
MAP(BB,QB,S,TB);
M2:MUX2
PORT
MAP(AA,QA,S,TA);
P1:PLUS
PORT
MAP(TA,TB,M);
P2:TRANS
PORT
MAP(M,BD1,BD2);
END XYB;
控制器的设计:
LIBRARY IEEE;
USE _LOGIC_;
ENTITY
PLUSCONTROL IS
PORT(CLK:IN STD_LOGIC;
START,ARH,TT,EE:IN STD_LOGIC;
DONE,CRT,S,ENT:OUT STD_LOGIC);
END
PLUSCONTROL;
ARCHITECTURE XYB OF
PLUSCONTROL IS
TYPE STATE_SPACE
IS(S0,S1,S2,S3);
SIGNAL STATE:STATE_SPACE;
BEGIN
PROCESS(CLK)
BEGIN
IF
CLK'EVENT AND CLK='1' THEN
CASE STATE IS
WHEN S0=>
IF START='1'THEN
STATE<=S1;
END IF;
WHEN S1=>
IF ARH='1'THEN
STATE<=S3;
ELSE
STATE<=S2;
END IF;
WHEN S2=>
IF TT='1'THEN
STATE<=S0;
ELSE
STATE<=S2;
END IF;
WHEN S3=>
IF EE='1'THEN
STATE<=S1;
END IF;
END
CASE;
END IF;
END PROCESS;
DONE<='1' WHEN STATE=S0 ELSE '0';
CRT<='0'
WHEN STATE=S0 ELSE '1';
S<='1' WHEN STATE=S3
ELSE '0';
ENT<='1' WHEN STATE=S2 ELSE '0';
END XYB;
定时计数器的设计:
LIBRARY
IEEE;
USE _LOGIC_;
ENTITY COUNT8 IS
PORT(CLK : IN STD_LOGIC;
CRT,ENT:IN
STD_LOGIC;
TT:OUT STD_LOGIC);
END;
ARCHITECTURE XYB OF COUNT8 IS
BEGIN
PROCESS(CLK)
VARIABLE COUNT:INTEGER RANGE 0
TO 7;
BEGIN
IF CLK'EVENT AND CLK='1'
THEN
IF CRT='1' AND ENT='1' THEN
IF
COUNT=7 THEN
COUNT:=0;
TT<='1';
ELSE
COUNT:=COUNT+1;
TT<='0';
END IF;
END IF;
END IF;
END PROCESS;
END XYB;
被乘数发生器的设计:
LIBRARY IEEE;
USE
_LOGIC_;
ENTITY CNT1 IS
PORT(CLK : IN
STD_LOGIC;
CRT:IN STD_LOGIC;
OC:OUT
STD_LOGIC;
QA:OUT INTEGER RANGE 0 TO 9);
END;
ARCHITECTURE XYB OF CNT1 IS
BEGIN
PROCESS(CLK)
VARIABLE
COUNT:INTEGER RANGE 0 TO 9;
BEGIN
IF
CLK'EVENT AND CLK='1' THEN
IF CRT='1' THEN
IF COUNT=9 THEN
COUNT:=0;
OC<='0';
ELSIF COUNT=8 THEN
COUNT:=COUNT+1;
OC<='1';
ELSE
COUNT:=COUNT+1;
OC<='0';
END
IF;
END IF;
END IF;
QA<=COUNT;
END PROCESS;
END XYB;
乘数发生器的设计:
LIBRARY IEEE;
USE _LOGIC_;
ENTITY CNT2 IS
PORT(CLK :IN STD_LOGIC;
CRT :IN STD_LOGIC;
EN2 :IN STD_LOGIC;
EE :OUT STD_LOGIC;
QB :OUT INTEGER
RANGE 0 TO 9);
END;
ARCHITECTURE XYB
OF CNT2 IS
BEGIN
PROCESS(CLK)
VARIABLE COUNT:INTEGER RANGE 0 TO 9;
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF
CRT='1' THEN
IF EN2='1' THEN
IF
COUNT=9 THEN
COUNT:=0;
EE<='1';
ELSE
COUNT:=COUNT+1;
END
IF;
ELSE
EE<='0';
END IF;
END IF;
END IF;
QB<=COUNT;
END PROCESS;
END XYB;
乘数选择器的设计:
LIBRARY IEEE;
USE _LOGIC_;
ENTITY MUX1 IS
PORT(BB,QB:IN INTEGER RANGE
0 TO 9;
S:IN STD_LOGIC;
B:OUT INTEGER
RANGE 0 TO 9
);
END MUX1;
ARCHITECTURE XYB OF MUX1 IS
BEGIN
B<=QB WHEN S='1'ELSE BB;
END XYB;
被乘数选择器的设计:
LIBRARY IEEE;
USE
_LOGIC_;
ENTITY MUX2 IS
PORT(AA,QA:IN
INTEGER RANGE 0 TO 9;
S:IN STD_LOGIC;
A:OUT INTEGER RANGE 0 TO 9
);
END
MUX2;
ARCHITECTURE XYB OF MUX2 IS
BEGIN
A<=QA WHEN S='1'ELSE AA;
END XYB;
乘法器的设计:
LIBRARY
IEEE;
USE _LOGIC_;
ENTITY plus IS
PORT(a:IN INTEGER RANGE 0 TO 9;
b:IN
INTEGER RANGE 0 TO 9;
m:OUT INTEGER RANGE 0 TO
81);
END plus;
ARCHITECTURE XYB OF
plus IS
BEGIN
m<=a*b;
END XYB;
码制变换器的设计:
LIBRARY IEEE;
USE
_LOGIC_;
ENTITY trans IS
PORT(m:IN
INTEGER RANGE 0 TO 81;
bd2,bd1:out INTEGER
RANGE 0 TO 9);
END trans;
ARCHITECTURE XYB OF trans IS
BEGIN
process(m)
begin
if m<=9 then
bd2<=0;
bd1<=m;
elsif m<=19
then
bd2<=1;
bd1<=m-10;
elsif m<=29
then
bd2<=2;
bd1<=m-20;
elsif m<=39
then
bd2<=3;
bd1<=m-30;
elsif m<=49
then
bd2<=4;
bd1<=m-40;
elsif m<=59
then
bd2<=5;
bd1<=m-50;
elsif m<=69
then
bd2<=6;
bd1<=m-60;
elsif m<=79
then
bd2<=7;
bd1<=m-70;
else
bd2<=8;
bd1<=m-80;
end if;
end
process;
end xyb;
5. 系统的功能仿真
设计输入文件经maxplus软件开发系统编译、处理,由功能仿真器进行模拟,
获得仿真波形如图
6所示。其中输入用1位十进制数表示,输出乘积已用2位十
进制数表示,BD2位高位,BD1是低位
。
例如,模拟开始时,ARH=0,系统执行手动功能,输入被乘数AA和乘数BB
有效:7
×8=56。在200.0ns以后,ARH=1,系统执行自动功能,被乘数和乘数按
九九乘法表要求
自动产生,则乘积BD2、BD1输出相应的数值。
6. 实验心得
经过几周EDA实验的学习,使我受益匪浅。这不仅增
强了我对EDA设计的兴趣,更掌
握了基本的电路设计流程、方法以及技巧。具备了这些基本知识,为今
后的自主学习奠定了
良好的基础。在编写时可以相互借鉴,这样可以节省一定的时间,尤其是24进制的
处理上,
我们采用了简单的方法即可完成多个功能的顺利实现。此次设计不足之处是不能进行定时闹钟,这是有待改进的地方,当然我们也可以在闹钟的时候采用音乐提醒,可以和乐曲硬件演
奏电路设
计相结合,这样数字钟的功能才算是完美。
在设计中还是需要注意一些常见的问题,比如实体名、项目
名等,还有在编写VHDL文
件时,一些文件名也是需要注意的。通过本次实验使我更进一步地熟悉了V
HDL硬件描述
语言的设计思想,也锻炼了自己独立思考问题的能力,同时通过对程序的调试也使自己对
VHDL语言的语法,结构和基本语句有了更深刻的了解。
最后感谢刘老师对我的指导,以及同学们对我的帮助,使得实验能够顺利完成!