大一数字逻辑大作业——乒乓球比赛模拟机的设计题目:乒乓球比赛模拟机的设计院系:软件学院专业年级: 14姓名与学号:王峥 1143710510孙一铀 1143710513周擎阳 1143710312指导老师:张彦航2015年6月18日目录1 绪论1.1设计目的 (3)1.2设计要求 (3)2 电路组成及工作原理2.1系统逻辑模型 (4)2.1.1系统模块需求 (4)2.1.2组员分工 (4)2.2系统模块结构 (4)2.2.1全局控制模块 (4)2.2.1.1连续四脉冲发生单元 (5)2.2.1.2数据初始化单元 (6)2.2.1.3倒计时显像单元 (7)2.2.1.4 开球信号产生单元 (8)2.2.1.5 模块总体设计展示 (9)2.2.1.4.1逻辑图 (9)2.2.1.4.1波形图 (10)2.2.2中央控制模块 (10)2.2.2.1程序综述 (10)2.2.2.2 代码实现 (11)2.2.2.3实现效果 (13)2.2.3计数模块 (14)2.2.3.1局比分计数单元 (14)2.2.3.2大比分计数单元 (15)2.2.3.3数据清零单元 (16)2.2.3.4信息反馈单元 (17)2.2.3.5显像管显示单元 (18)3 调试过程3.1全局控制模块 (20)3.2中央控制模块 (24)3.3计数模块 (26)4 设计结论 (27)5 设计心得与总结 (28)附录一:总体器件表及相关器件的功能表、管脚分布 (29)附录二:总体设计图 (30)附录三:仿真结果 (32)附录四:工作说明 (32)参考文献 (32)1 绪论随着科学技术的发展,人类社会已进入到高度发达的信息化社会, 信息社会的发展离不开电子产品的进步。
现代电子产品的发展越来越快, 各种新型电子元器件和智能化的电子产品已经在国民经济的各个领域和人民生活的各个方面得到了日益广泛的应用。
实现这种进步的主要原因就是生产制造技术和电子设计技术的发展。
其中电子玩具的发展也是在日益成熟。
乒乓球游戏机控制电路是有甲、乙双方参赛,自动控制发“球”的三人乒乓球游戏机;它能完成自动裁判和自动计分是一个带数字显示的模拟游戏机。
其结构简单、成本低、易操作,安全性强、无污染。
乒乓球游戏机还能在娱乐的同时提高我们的反应、应变能力。
具有良好的市场发展前景。
1.1 设计目的本次课程设计的内容是独立完成一个乒乓球比赛游戏机的设计,采用Max+Plus2电路仿真设计软件完成乒乓球比赛游戏机电路的设计及仿真调试,在微机上仿真实现乒乓球比赛游戏机的设计。
通过这次课程设计让我们了解和熟悉了乒乓球游戏机的原理和Max+Plus2仿真设计软件的操作,也让我们加深了解了对双向移位寄存器、双D触发器及逻辑门电路的一些实际用途,并将理论与实践相结合。
1.2 设计要求(1)至少用8个LED排成直线,以中点为界,两边各代表参赛双方的位置,其中一个点亮的LED(乒乓球)依次从左到右,或从右到左移动,“球”的移动速度可以调节。
(2)当球(被点亮的那只LED)移动到某方的最后一位时,参赛者应该果断按下自己的按扭使“球”转向,即表示启动球拍击中,若行动迟缓或超前,表示未击中或违规,则对方得一分。
(3)设计甲乙双方自动记分电路,用数码管显示得分,每记满11分为一局。
(4)甲乙双方各设一个发光二极管表示拥有发球权,每得5分自动交换发球权,拥有发球权的一方发球才能有效。
(5)能显示发球次数。
附加功能设计:1、一方得分,电路自动提示3秒,此期间发球无效2、某方达到11分后自动清0重新计数,用LED灯管显示获胜局数2 电路组成及工作原理2.1 系统逻辑模型2.1.1 系统模块需求(1)全局控制模块:1、外界输入的全局开始信号2、接受一个回合的结束信号,在数码管上显示倒计时,倒计时期间发球无效。
3、接受一局结束的信号,使大部分单元清0功能。
4、接受计数模块送来的换发球信号,交换发球权。
(2)中央控制模块:1、外界输入的挥拍信号2、全局控制模块送来的开球使能信号3、模拟球台上显示球的双向移动4、回合结束后给出一个回合的结束信号(3)计数模块:1、接受一个回合的结束信号,在数码管上显示比分计数2、在数码管上显示发球计数3、在数码管上显示双方获胜局数统计4、一局结束后送出一局结束的信号5、每记满5分送出交换发球信号2.1.2 组员分工(1) 全局控制模块:孙一铀(2) 中央控制模块:周擎阳(3) 计数模块:王铮2.2 系统模块结构2.2.1 全局控制单元2.2.1.1连续四脉冲发生单元1、单元需求:当一个回合开始信号脉冲到来时,从第一个时钟上升沿开始拷贝连续四段波形。
2、单元目的:给倒计时显像单元连续四个脉冲便于显像3、单元管脚:(1) Start(In):回合开始信号,由中央控制单元给出,经技术单元转发到该模块(2) Clean(In):清0端(3) Clock(In):时钟端(4) Mb(In):恒为1(5) Ma(In):由数据初始化单元给定(6) D_cp(Out):连续四脉冲输出时钟端4、单元设计思路:该单元由两部分构成,一部分由双D触发器构成,一部分由74194双向移位寄存器构成,采用双D触发器能使在第四个脉冲到来时不再产生多余脉冲(具体原理设计可参见调试过程),采用74194双向移位计数其来控制电路产生正好四个脉冲,从逻辑图中可知,ABC端接地,D端接电源,每次回合开始信号到来时,Ma先送入一个逻辑“1”信号,而Mb端恒为“0”,此时进行读操作,后来Ma置为“0”,此时进行左移操作,当左移四次后,Qa端产生一个下降沿,由双D触发器控制74194不再进行工作,同时数据清0.5、单元逻辑图展示:6、单元波形图展示:2.2.1.2数据初始化单元1、单元需求:当一个开始信号到来时,给出一个Ma的“0-1-0”脉冲,要求该脉冲上升沿与start信号重合,下降沿与start信号后第一个时钟信号的下降沿重合。
保证在第一个时钟上升沿到来时2、单元目的:外界信号只有Start、Clock 所以Ma信号一定是由电路自身给定,要求该脉冲正好覆盖start上升沿后的第一个时钟。
3、单元管脚:(1) Start(In):回合开始信号,由中央控制单元给出,经技术单元转发到该模块(2) Clock(In):时钟端(3) Ma(Out):初始化信号输出端4、单元设计思路:该单元由三个部分构成,右边的部分由D触发器构成,该部分功能是1个摩2计数器,时钟端仅接法如图所示,仅当start上升沿与有效时钟的下降沿触发。
当Start信号上升沿到来时,上部分的D触发器的清0端被置为1,时钟端接收到有效的上升脉冲,Q端输出由0变为1,下方的信号输出方为有效(通过中央与门)。
下方的部分由两个D触发器构成,第一个触发器的功能也为模2计数器,第二个触发器的清0端由第一个触发器控制,仅当第一个触发器的Q端输出为一时,第二个触发器才能正常工作,换言之,只有接收到一个时钟上升沿后,再接受一个下降沿才是有效的信号,仅仅一个下降沿的输出是无效的。
为什么要这么做呢?由下图波形图所示,由Start信号的任意性可知,Start信号的上升沿后,收到的第一个时钟变化沿可能就是一个下降沿,然而这不是一个完整的时钟信号,不符合我们的需求,所以为了覆盖一个完整的时钟,所以只有当遇到一个时钟上升沿后,送入的下降沿才是有效的。
5、单元逻辑图展示:2.2.1.3倒计时显像单元1、单元需求:根据送入连续四个脉冲分别显示0-3-2-1-0字形。
2、单元目的:用7段数码管显示倒计时信号3、单元管脚:(1)Clock(In):时钟端,四个连续脉冲,由连续四脉冲发生单元给出(2)syy_a ——syy_g(Out):数码管接入信号(3)Enable(Out):由syy_a给出,经观察发现,syy_a端正好在四个脉冲结束后给出一个上升沿,正好可以作为送给中央控制单元的发球使能信号。
4、单元设计思路:该单元分为两个部分,第一个部分为双D触发器构成的模4计数器,第二个部分为译码器电路。
设计如下:逻辑表达式如下:a = A’+ B’b = 1c = A’+ Bd = ae = B’f = A’·B’g = A⊕B5、单元波形图展示:2.2.1.4 开球信号产生单元1、单元需求:每一个结束信号到来时,完成以下时序图的转变。
2、单元目的:每一回合结束时,交换发球权。
3、单元管脚:(1) Change(In):换发球时钟信号,由计数单元给出(2) Ca(Out):逻辑0表示发球权不在a手中(3) Cb(Out):逻辑0表示发球权不在b手中4、单元设计思路:只有3种状态,所以用双D触发器即可实现该同步时序计数器的转换5、单元逻辑图展示:6、单元波形图展示:2.2.1.4 模块总体设计展示2.2.1.4.1逻辑图2.2.1.4.1波形图2.2.2 中央控制模块本单元难度较大,单纯用连线图的方式很难实现.因此决定采用vhdl 进行硬件语言编程,从而更好的调节程序.2.2.2.1 程序综述程序图如图所示其中输入:clk是时钟端,负责接受时钟信号.Ca,Cb是开球信号,Enable是使能信号,a,b则是模拟挥拍信号.输出:Ball是模拟乒乓球的输出信号Sa,Sb是给计数模块的胜负信号Over是比赛结束后送给计数模块的一个上升沿端2.2.2.2 代码实现由于对vhdl并不熟悉,在实现过程中部分参考了[1]/link?url=WMEVDGL Y90wHgMZNvq5aWxnvzPxfzKN29oUDH9m2hA UuFrLkuoJdHQrrx4yeISvYfmsiik58H_TROIdgU2fIRkLDeGY umeXkIAlZtegxhpq对代码进行了理解和重写,写出了自己的控制代码.library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity CENTER isport (clk:in STD_LOGIC;--时钟信号Ca:in STD_LOGIC;--a端发球信号Cb:in STD_LOGIC;--b端发球信号Enable: in STD_LOGIC;--使能信号a:in STD_LOGIC;--a挥拍信号b:in STD_LOGIC;--b挥拍信号ball:out STD_LOGIC_VECTOR(16 downto 0);--模拟球的运行Sa:out STD_uLOGIC;--a是否获胜Sb:out STD_uLOGIC;--b时候获胜over:inout STD_uLOGIC--一局结束提供一个上升沿);end CENTER;architecture behavior of CENTER issignal direction : integer range 0 to 2; --指定方向0:a->b1:b->a2:未发球signal num : integer range -1 to 17; --确定那盏灯点亮beginprocess (Enable,clk,a,b,Ca,Cb)beginif Enable = '0' then --使能信号未来,初始化over <= '0';Sa <= '0';Sb <= '0';num <= 1;direction <= 2;elsif rising_edge(clk) then--上升沿进行判断if direction = 2 then--未发球检测发球信号if Ca = '1' thendirection <= 0;num <= 1;elsif Cb = '1' thendirection <= 1;num <= 8;elsedirection <= 2;num <= 1;end if;elsif direction = 0 and num <= 8 then--球从a->bif b = '1' then--此时b挥拍if num >= 6 then--击中,反向num <= num - 1;direction <= 1;Else--未击中,结束direction <= 2;Sa <= '1';Sb <= '0';over <=not over;end if;else num <= num + 1; direction <= 0;--b未挥拍,继续运行end if;elsif direction = 1 and num >= 1 then--球从b->aif a = '1' then--a挥拍if num <= 2 then--a击中,反向num <= num + 1;direction <= 0;Else--未击中,结束direction <= 2;Sa <= '0';Sb <= '1';over <= not over;end if;else direction <= 1; num <= num - 1;--a未挥拍,继续end if;end if;end if;end process;process (num)--输出球的运动轨迹begincase num iswhen 1 => ball<="10000000";when 2 => ball<="01000000";when 3 => ball<="00100000";when 4 => ball<="00010000";when 5 => ball<="00001000";when 6 => ball<="00000100";when 7 => ball<="00000010";when 8 => ball<="00000001";when others => ball <="00000000";end case;end process;end behavior;2.2.2.3 实现效果与预期相同,证明程序正确2.2.3 计数模块2.2.3.1局比分计数单元1.单元需求:来自中央控制模块的回合结束信号,以及表示AB胜负关系的01,10信号2、单元目的:记录单局比分(一局11分)3、单元管脚:CLK、CLN、QA、QB、QC、QD4、单元设计思路:利用74161的异步清零实现11进制加法计数器,利用中央控制模块的回合结束信号,以及表示AB胜负关系的01,10信号,通过与门连接后作为计数器的时钟端,则胜利方每回合结束后其计数器会得到一个信号,是计数器加一,当信号给出1011时计数器清零,并通过计数清零单元实现计数器的同时清零5、单元逻辑图展示:6、单元波形图展示:本部分借用显示管显像单元的波形图展示局分计数器的功能2.2.3.2大比分计数单元1.单元需求:局分计数单元在一局比赛结束后发出的信号2、单元目的:记录双方的大比分3、单元管脚:CLK、QB、QC、QD4、单元设计思路:设置本游戏为九局五胜制,利用74290的五进制功能实现五进制加法计数器,由于74161为异步清零,利用最后1011信号作为作为时钟信号,是每局比赛结束后获胜方大比分加一,当总分为5时比赛结束5、单元逻辑图展示:6、单元波形图展示:如图当A1~A11的二极管全亮时(A得11分),QA1由0变1,即大比分加一2.2.3.3数据清零单元1.单元需求:某一方一局得分为11时给出的1011信号2、单元目的:当一方先得到11分时,双分的比分同时清零3、单元管脚:CLK、QA、QB、QC、QD4、单元设计思路:通过与门连接QA、QB、QD端,并由抑或非门连接,当且仅当有一方为1011信号时,异或非的输出端会由1变0,此时传给清零信号,实现清零功能5、单元逻辑图展示:6、单元波形图展示:当A得到11分时,AB的分数同时清零(A1的下一个1的出现是由于下一回合A 又得了一分)2.2.3.4信息反馈单元1.单元需求:比分计数器的清零信号,以及中央控制模块的回合结束信号2、单元目的:传递给全局控制单元开球信号、每五个回合换发球的信号以及每局开始信号3、单元管脚:clock、CLK、QA、QB、QC、QD4、单元设计思路:wave1为每五回合换发球信号,由74290设计的五进制加法计数器,利用其每五次一个的清零信号设计成一个,wave2为每局开始时的发球信号,利用局分计数器1011信号,同样可以提供5、单元逻辑图展示:6、单元波形图展示:2.2.3.5二极管显示单元1.单元需求:局分计数器和大比分计数器的记分信号2、单元目的:将二进制数码转换为直观的二极管显示3、单元管脚:A1~A11、B1~B114、单元设计思路:A1=A+B+C+DA2=A+B+CA3=A+B+CDA4=A+BA5=A+BD+BCA6=A+BCA7=A+BCDA8=AA9=AD+ACA10=ACA11=ACD则可以得出逻辑图,同理可得出大比分计数器的二极管显示单元的逻辑电路5、单元逻辑图展示:6、单元波形图展示:3 调试过程3.1 全局控制模块——By 孙一铀Debug1:连续四脉冲发生单元还还只处于雏形的时候。