广东科学技术职业学院机电学院主讲:陈锐强,林熙德项目题目:拔河游戏机设计要求•设计一个能进行拔河游戏的电路。•电路使用15个(或9个)发光二极管表示拔河的“电子绳”,开机后只有中间一个发亮,此即拔河的中心点。•游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快,亮点就向谁的方向移动,每按一次,亮点移动一次。•亮点移到任一方终端二极管时,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后才使亮点恢复到中心。•由裁判下达比赛开始命令后,甲乙双方才能输入信号,否则,输入信号无效。•用数码管显示获胜者的盘数,每次比赛结束自动给获胜方加分。示意图按键模块主控制电路模块拔河LED显示模块计分数码管显示模块分频moduleDivided_Frequency(_10000HzOut,_25HzOut,_50MHzIn);input_50MHzIn;output_10000HzOut,_1HzOut;parameterwidth1=16,value1=2499;parameterwidth2=10,value2=499;reg_10000HzOut,_25HzOut;reg[width1-1:0]Count;reg[width2-1:0]Cnt;always@(posedge_50MHzIn)//2500*2*10000Hz=50MHzif(Count==value1)//BinaryCounter(0~2499)beginCount=15'd0;_10000HzOut=~_10000HzOut;endelseCount=Count+1'b1;always@(posedge_50MHzIn)//100000*2*25Hz=50MHzif(Cnt==value2)//BinaryCounter(0~99999)beginCnt=15'd0;_25HzOut=~_25HzOut;endelseCnt=Cnt+1'b1;endmodule按键模块脉冲25Hz,使用消抖电路,如下:modulexiaodou(key1,key2,_50H,k1,k2);inputkey1;////按键1inputkey2;////按键2input_25H;//脉冲25Hzoutputk1;outputk2;assignk1=(a1|a2|a3);////assignk2=(b1|b2|b3);////采用3个或门消抖rega1,a2,a3,b1,b2,b3;always@(posedge_50H)begina1=key1;a2=a1;a3=a2;b1=key2;b2=b1;b3=b2;endendmodule主控制电路modulethe_first_contraler(k1,k2,rst,nrst,_50H,q,left,right);inputk1;//inputk2;//inputrst;//拔河开始复位按键inputnrst;//计分清零按键input_25H;//output[2:0]q;//拔河led显示输出output[2:0]left;//左边分数数码管输出output[2:0]right;//右边分数数码管输出reg[2:0]q;regn;reg[2:0]left,right;//reg寄存器always@(negedgerstorposedge_50Hornegedgenrst)beginif(~rst)beginq=3;n=1;end//q,led回中点n使能开elseif(~nrst)beginleft=0;right=0;end//计分清零elseif(n)//判断使能是否开!begincase({k2,k1})//按键组2‘b01:q=q+1;///led向左移一位2‘b10:q=q-1;////led向右移一位default:q=q;///保持endcase//case(q)3‘b000:beginn=0;left=left+1;end//左+1分,n使能关3‘b110:beginn=0;right=right+1;end//右+1分,n使能关default:n=n;//保持endcaseendendendmodule拔河LED显示模块moduleled(q,_50M,led);input[2:0]q;input_50M;output[7:0]led;reg[7:0]led;always@(posedge_50M)case(q)3‘d0:led=8’b00111111;3'd1:led=8'b10011111;3'd2:led=8'b11001111;3‘d3:led=8’b11100111;//中点3'd4:led=8'b11110011;3'd5:led=8'b11111001;3'd6:led=8'b11111100;default:led=led;endcaseendmodule拔河数码管显示模块module_7seg(left,right,_10000H,segout,wx);input[2:0]left;input[2:0]right;input_10000H;output[6:0]segout;//数码管输出output[2:0]wx;reg[2:0]wx;reg[6:0]segout;reg[1:0]count;reg[3:0]seg_in;always@(posedge_10000H)case(count)2'd0:beginwx=3'b011;seg_in=left;count=count+1;end//leftwx+,计数输入=left,count进一位继续判断2'd1:beginwx=3'b101;seg_in=4'd8;count=count+1;end//-wx+,计数输入=8,同上2'd2:beginwx=3'b110;seg_in=right;count=0;end//rihhtwx+,计数输入=right,conunt归零,重新判断endcasealways@(seg_in)case(seg_in)//gfedcba//4'd0:segout=7'b1000000;//04'd1:segout=7'b1111001;//14'd2:segout=7'b0100100;//24'd3:segout=7'b0110000;//34'd4:segout=7'b0011001;//44'd5:segout=7'b0010010;//54'd6:segout=7'b0000010;//64'd7:segout=7'b1111000;//74'd8:segout=7'b0111111;//-default:segout=7'b1000000;endcaseendmodule程序示意电路图演示结束!