篮球记分牌verilog设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字逻辑设计及应用课程设计报告

姓名:

学号:

选课号: 79

设计题号: 23

一.设计题目

篮球比赛数字计分牌

二.设计要求

1.分别记录两队得分情况;

2.进球得分加2分,罚球进球得分加1分;

3.纠正错判得分减2分或1分;

4.分别用三个数码管显示器记录两队的得分情况。

三.设计过程

(一)设计方案

1.模块设计

题目中要用三个数码管来记录两队的得分情况,本文采用输出为8421bcd码,外接译码器和数码管的方式来实现。

先设计一个带有进位(co)和借位(ci)输出的模块pad,输出端(num)输出4位8421bcd码外接译码器和数码管,pad模块还带有加一输入端(a1),加二输入端(a2),减一输入端(d1),减二输入端(d2)。输入端与开关相接,操作者按下开关即给该端口一个脉冲信号,各输入端口由上升沿触发。如果操作者同时按下多个端口,输出端口将保持原来的信号不变。pad模块功能图见图1-1。

图 1-1 pad模块输入输出端口及功能

然后将三个相同的pad模块进行级联,构造为新的模块numberpad,从而得到带有三个数码管的篮球记分牌。甲乙两队都将分别使用这个记分牌。级联图见图1-2。

图 1-2 pad模块级联图

2.模块内部的算法流程

每个模块有四个输入端口a1,a2,d1,d2来进行触发,触发事件太多,因此构造rem=a1|a2|d1|d2作为新的触发信号。因此,只要a1,a2,d1,d2中任意一个按键被按下,将会发出一个脉冲,rem也就会产生一个脉冲。但是可能出现多个按键同时按下的情况,这样会产生冲突。所以在always语句块中,进行判断,看是否a1,a2,d1,d2中只有一个处于高电平,若同时处于高电平,则输出维持原来的值不变。

判断完端口a1,a2,d1,d2中哪一个输入了以后,就要进行加1,加2,减1,减2的操作。

加1分为以下情况:(1)若num已经计数到9即1001,再加1则num应变为0000,进位端co输出1;(2)若num不为9,则直接加1,co输出0。

加2分为以下情况:(1)若num已经计数到8即1000,再加2则num应变为0000,进位端co输出1;(2)num已经计数到9即1001。再加2则num应变为0001,进位端co输出1;(3)若num不为8或9,则直接加2,co输出0/。

减1分为以下情况:(1)若num此时为0,再减1则num应变为9即1001,借位端ci 输出1;(2)若num不为0,则直接减1,ci输出0。

减2分为以下情况:(1)若num此时为0,再减2则num应变为8即1000,借位端ci 输出1;(2)若num此时为1,再减2则num应变为9即1001,借位端ci输出1;(3)若num不为0或1,则直接减2,ci输出0

算法流程图见图1-3

图1-3 算法流程图

(二)Verilog程序

(注:在quatus2中不能编写中文注释,这里的注释为后期编写)

//将pad级联成新的模块numberpad,其中num1,num2,num3分别输出个十百位的8421bcd码

module numberpad(a1,a2,d1,d2,num1,num2,num3);

output [3:0] num1,num2,num3;

input a1,a2,d1,d2; //a1为加1端口,a2为加2端口,d1为减1端口,d2为减2端口

wire co1,co2,co3,ci1,ci2,ci3;

pad(a1,a2,d1,d2,num1,co1,ci1); //将三个pad级联

pad(co1,0,ci1,0,num2,co2,ci2);

pad(co2,0,ci2,0,num3,co3,ci3);

endmodule

//pad模块,输出为4为8421bcd码,由a1,a2,d1,d2来实现加减1、2,有进位和借位端口module pad(a1,a2,d1,d2,num,co,ci);

output reg [3:0] num; //输出4位8421bcd码

output reg co,ci; //co 进位信号, ci is 借位信号

input a1,a2,d1,d2; ///a1为加1端口,a2为加2端口,d1为减1端口,d2为减2端口

wire rem;

initial

num<=4'b0000;

assign rem=a1|a2|d1|d2;

always @(posedge rem)

begin

if(a1&&!a2&&!d1&&!d2) //仅a1输入脉冲时加1,必要时进位

begin

if(num==4'b1001)

begin

num<=4'b0000;

co<=1'b1;

end

else

begin

num<=num+4'b0001;

co<=1'b0;

end

end

else if(a2&&!a1&&!d1&&!d2) //仅a2输入脉冲时加2,必要时进位

begin

if(num==4'b1000)

begin

num<=4'b0000;

co<=1'b1;

end

else if(num==4'b1001)

begin

num<=4'b0001;

co<=1'b1;

end

else

begin

num<=num+4'b0010;

co<=1'b0;

end

end

else if(d1&&!a1&&!a2&&!d2) //仅d1输入脉冲时减1,必要时借位

begin

if(num==4'b0000)

begin

num<=4'b1001;

ci<=1'b1;

end

else

begin

num<=num-4'b0001;

ci<=1'b0;

end

end

else if(d2&&!a1&&!a2&&!d1) //仅d2输入脉冲时减2,必要时借位

begin

if(num==4'b0001)

begin

num<=4'b1001;

ci<=1'b1;

相关文档
最新文档