目录
一、摘要
1.1功能:
1.2要求:
1.3要点:
二、各模块的总结
2.1、功能描述
2.2系统结构框图
2.3I/O说明
三、各模块详细设计
3.1倒计时模块:
3.2两队比分模块
3.3 control控制及数码管模块
四、代码设计
4.1顶层模块
4.2按键消抖模块
4.3control控制模块
4.4 24s倒计时模块
4.5 12min倒计时模块
4.6两个比赛队记分模块
4.7数码管显示模块
五、仿真验证
5.2 basys2开发板验证 1.1功能:
按照篮球赛赛制进行设计。须具有24秒倒计时功能,十二分钟计时功能,暂停功能,进球计分功能(1分,2分,3分)等。 1.2要求:
比分与计时须在数码管实时显示,显示状态可通过按键或者拨码开关切换,计分可通过按键进行设计(不限制)。 1.3要点:
顶层模块的使用(Top-Down思想),倒计时的实现,两队的记分(10进制转8421BCD码),动态数码管,按键消抖。
功能1:24s倒计时
(1)实现从24:00s至00:00s的倒计时,计时精度为0.01s。
(2)暂停计时功能。
(3)每节比赛和每个进攻回合结束,开始新的一轮24s倒计时。
功能2:12min倒计时
(1)实现从12:00min至00:00min的倒计时,计时精度为1s。
(2)暂停计时功能。
(3)每节比赛,开始新的一轮12min倒计时。
功能3:两个比赛队记分
(1)实现红蓝两队的计分。
(2)进球记分功能,包含三分球,两分球和一分球。
输入端口:
clk
rst_n //总开关
sys_key_1//一分球按键
sys_key_2//两分球按键
sys_key_3//三分球按键
key_team //切换队伍进行进球记分
sys_key_ctrl//按键控制
en_24s //24s使能(复位)
en_score //记分使能(复位)
en_stop_n//暂停使能
en_time //倒计时复位
输出端口:
dis_sel //位选输出
dis_seg //段选输出 3.1倒计时模块:
小模块1:16位输出的控制(倒计时的主模块)
这一部分的算法我没有使用加三移位转BCD码的方法,而是使用最小精度的时钟分频(24s倒计时最小精度为0.01s),再利用if-else语句对多种情况进行判断赋值。
具体解释:
if-else语句判别条件的罗列 :if(复位信号==0):else if([最高位:0]==0):else if([本位 :0]==0):else if([低位 :0]==0) (低位=(本位—4)): else
([本位 :本位—4])
各判别语句的赋值,
①,② 输出: [本位 :本位—4]=初始值;
③ 输出:[本位 :本位—4]= 4’h9
④ 输出:[本位 :本位—4]= [本位 :本位—4]—1’b1;
⑤ 输出:[本位 :本位—4]= [本位 :本位—4]; 3.2两队比分模块
小模块1:16位记分输出
首先定义两个8位的reg信号r_out和b_out,用来寄存两队的得分,输出时用assign语句将r_out和b_out拼接后赋值给16位的输出score。
在描述两个reg信号时,例如r_out,由于牵扯到要将十进制数转化为8421BCD码,这里还是没有采用加三移位法,我利用的是将一分、两分和三分分为三种情况。
例如三分,只需考虑低四位r_out[3:0]。
当(r_out[3:0]<4'd7)时,不需要考虑向高四位进位,只需给第三位正常加3即可。
当(r_out[3:0]>=4'd7)时,此时需要向高四位进位,并且根据加三后的数值大小
判断低四位大小,此例为每次加三分,因而考虑三种情况即可。
代码展示:
3.3 control控制及数码管模块
设计思想:
在control模块中,利用计数器计数,当输入信号(key_ctrl)为1时cnt复位,使输出 (ctrl)循环计数,从而确定数码管显示哪组数据。
在动态数码管模块中,定义两个reg信号 [15:0] dis_num, [3:0] dis_tmp,第一个用来寄存要显示的16位数据,第二个用来寄存16位数据中4位的值,而寄存哪四位由分频时钟控制,使16位数据循环输入,从而形成动态显示。 4.1顶层模块
4.2按键消抖模块
4.3control控制模块
4.4 24s倒计时模块
4.5 12min倒计时模块
4.6两个比赛队记分模块
4.7数码管显示模块
5.1 tb仿真文件
5.2 basys2开发板验证
文章声明:以上内容(如有图片或视频在内)除非注明,否则均为原创文章,转载或复制请以超链接形式并注明出处。
本文作者:admin本文链接:https://www.cnemw.com/post/361.html
还没有评论,来说两句吧...