数字系统课程设计辩论赛计时器.docx
《数字系统课程设计辩论赛计时器.docx》由会员分享,可在线阅读,更多相关《数字系统课程设计辩论赛计时器.docx(14页珍藏版)》请在冰豆网上搜索。
![数字系统课程设计辩论赛计时器.docx](https://file1.bdocx.com/fileroot1/2023-2/24/5154d97b-dc7f-42da-bdaa-d5ee88abb242/5154d97b-dc7f-42da-bdaa-d5ee88abb2421.gif)
数字系统课程设计辩论赛计时器
数字系统设计实验
课程设计
题目:
辩论赛计时器
学生姓名:
文超周李旭11380191138033
班级专业:
11级自动化
指导教师:
潘秀琴
1.实验名称:
辩论赛计时器
2.实验学时:
24学时
3.实验目的:
1、深入了解VerilogHDL语言语法。
2、学会独立思考、设计及实现较大规模的数字电路系统。
4.实验要求
实验报告应包含实验目的、实验原理,设计思路,实验程序,实验结果,实验总结。
其中具体要求为:
1)程序实现模块化设计,写出设计思路,认真标注代码注释;
2)达到正确地运行结果;
3)实验中出现的问题进行详细总结。
5.实验原理:
本实验中将依照现有辩论赛规则,制作一个简易的计时装置。
辩论赛由开篇立论、双方攻辩、攻辩小结、自由辩论和总结陈词五部分组成。
1)开篇立论、攻辩小结、总结陈词部分需一方发言终止后,另一方才允许发言。
2)双方攻辩和自由辩论中,双方需要交替发言,一方发言时,本方计时器工作;另一方计时器处于停滞状态。
本实验中要完成倒数计时,状态控制与过渡,文字提示的显示,按键消抖等功能。
系统正常工作时,发光二极管循环闪烁提醒辩手时间的流逝;八段数码管显示剩余时间;发光数码管显示发言者属于哪一方(正方/反方);拨码开关控制是对正方计时,还是对反方计时;按键1控制计时状态;按键2实现计时状态的转换。
6.实验步骤:
根据实验要求作预习报告。
根据实验需求,进行程序的设计。
根据以前设计的经验,反复调试程序。
调试通过,下载到FPGA开发板上进行实践调试。
完成整个过程,写实验报告。
7.实验结果
8.附录:
modulekeshe(clk,stop,zf,C,R,led_seg,led_dig,ledin,zt,ft);
inputclk,stop,zf,zt,ft;//stop-正方或反方倒计时使能0-有效zf-选择正方或反方1-选择正方0-选择反方zt/ft分别为正方或反方清零
outputC,R,led_seg,led_dig,ledin;//设定点阵管脚C-1亮R-0亮设定LED显示管脚led_seg-1亮,led_dig-0亮,
reg[5:
0]z,f;//z循环控制正方倒计时30-00f循环控制反方倒计时30-00
reg[0:
7]R,ledin;
reg[0:
15]C;
reg[0:
7]led_seg,led_dig;
reg[4:
0]m;
reg[2:
0]n;//计时器
reg[25:
0]i,j;
regtick1,tick2;
regts;
reg[3:
0]zs,zg,fs,fg;//正方十位正方个位反方十位反方个位
integerjjjj;
always@(posedgeclk)//分频
begin
if(i==9999999)
begin
tick1<=~tick1;
i<=0;
end
else
i<=i+1;
end
always@(posedgeclk)
begin
if(j>999)
begin
tick2<=~tick2;
j<=0;
end
else
j<=j+1;
end
always@(posedgetick1)
begin
if(zf)
begin
if(stop==0)//z循环控制正方倒计时30-00
begin
if(z==0)
beginz<=30;zs<=3;zg<=0;end
else
beginz<=z-1;zs<=z/10;zg<=z%10;end
if(zt)//正方倒计时清零操作
beginz<=30;zs<=0;zg<=0;end
end
end
else
begin
if(stop==0)//f循环控制反方倒计时30-00
begin
if(f==0)
beginf<=30;fs<=3;fg<=0;end
else
beginf<=f-1;fs<=f/10;fg<=f%10;end
if(ft)//反方倒计时清零操作
beginf<=30;fs<=0;fg<=0;end
end
end
end
always@(posedgetick2)
begin
case(n)
0:
begin
led_dig<=8'b11011111;
case(zs)//显示正方十位0-3
0:
led_seg<=8'b11111100;
1:
led_seg<=8'b01100000;
2:
led_seg<=8'b11011010;
3:
led_seg<=8'b11110010;
4:
led_seg<=8'b01100110;
5:
led_seg<=8'b10110110;
6:
led_seg<=8'b10111110;
endcase
end
1:
begin
led_dig<=8'b11101111;
case(zg)//显示正方个位0-9
0:
led_seg<=8'b11111100;
1:
led_seg<=8'b01100000;
2:
led_seg<=8'b11011010;
3:
led_seg<=8'b11110010;
4:
led_seg<=8'b01100110;
5:
led_seg<=8'b10110110;
6:
led_seg<=8'b10111110;
7:
led_seg<=8'b11100000;
8:
led_seg<=8'b11111110;
9:
led_seg<=8'b11110110;
endcase
end
2:
begin
led_dig<=8'b11111101;
case(fs)//显示反方十位0-3
0:
led_seg<=8'b11111100;
1:
led_seg<=8'b01100000;
2:
led_seg<=8'b11011010;
3:
led_seg<=8'b11110010;
4:
led_seg<=8'b01100110;
5:
led_seg<=8'b10110110;
6:
led_seg<=8'b10111110;
endcase
end
3:
begin
led_dig<=8'b11111110;
case(fg)//显示反方个位0-9
0:
led_seg<=8'b11111100;
1:
led_seg<=8'b01100000;
2:
led_seg<=8'b11011010;
3:
led_seg<=8'b11110010;
4:
led_seg<=8'b01100110;
5:
led_seg<=8'b10110110;
6:
led_seg<=8'b10111110;
7:
led_seg<=8'b11100000;
8:
led_seg<=8'b11111110;
9:
led_seg<=8'b11110110;
endcase
end
endcase
if(n==4)
n<=0;
else
n<=n+1;
end
always@(posedgetick2)
begin
if(zf&&z>5)//显示正方
begin
case(m)
0:
beginC=16'b0001000000000000;R=8'b01111111;end
1:
beginC=16'b0000100001111110;R=8'b10111111;end
2:
beginC=16'b0111111100001000;R=8'b11011111;end
3:
beginC=16'b0000100000101000;R=8'b11101111;end
4:
beginC=16'b0001111000101110;R=8'b11110111;end
5:
beginC=16'b0010001000101000;R=8'b11111011;end
6:
beginC=16'b0100001000101000;R=8'b11111101;end
7:
beginC=16'b1000011011111111;R=8'b11111110;end
endcase
if(m==7)
m<=0;
else
m<=m+1;
end
elseif(zf==0&&f>5)//显示反方
begin
case(m)
0:
beginC=16'b0001000001111110;R=8'b01111111;end
1:
beginC=16'b0000100001000000;R=8'b10111111;end
2:
beginC=16'b0111111101111110;R=8'b11011111;end
3:
beginC=16'b0000100001100010;R=8'b11101111;end
4:
beginC=16'b0001111001010100;R=8'b11110111;end
5:
beginC=16'b0010001001001000;R=8'b11111011;end
6:
beginC=16'b0100001001010100;R=8'b11111101;end
7:
beginC=16'b1000011001000011;R=8'b11111110;end
endcase
if(m==7)
m<=0;
else
m<=m+1;
end
elseif(zf==1&&z<6)//正方闪烁
begin
if(jjjj<20000)
begin
jjjj<=jjjj+1;
end
else
begin
jjjj<=0;
end
if(jjjj<10000)
begin
case(m)
0:
beginC=16'b0001000000000000;R=8'b01111111;end
1:
beginC=16'b0000100001111110;R=8'b10111111;end
2:
beginC=16'b0111111100001000;R=8'b11011111;end
3:
beginC=16'b0000100000101000;R=8'b11101111;end
4:
beginC=16'b0001111000101110;R=8'b11110111;end
5:
beginC=16'b0010001000101000;R=8'b11111011;end
6:
beginC=16'b0100001000101000;R=8'b11111101;end
7:
beginC=16'b1000011011111111;R=8'b11111110;end
endcase
if(m==7)
m<=0;
else
m<=m+1;
end
else
begin
C=16'b00000000000000000;R=8'b00000000;
end
end
elseif(zf==0&&f<6)//反方闪烁
begin
if(jjjj<20000)
begin
jjjj<=jjjj+1;
end
else
begin
jjjj<=0;
end
if(jjjj<9999)
begin
case(m)
0:
beginC=16'b0001000001111110;R=8'b01111111;end
1:
beginC=16'b0000100001000000;R=8'b10111111;end
2:
beginC=16'b0111111101111110;R=8'b11011111;end
3:
beginC=16'b0000100001100010;R=8'b11101111;end
4:
beginC=16'b0001111001010100;R=8'b11110111;end
5:
beginC=16'b0010001001001000;R=8'b11111011;end
6:
beginC=16'b0100001001010100;R=8'b11111101;end
7:
beginC=16'b1000011001000011;R=8'b11111110;end
endcase
if(m==7)
m<=0;
else
m<=m+1;
end
else
begin
C=16'b00000000000000000;R=8'b00000000;
end
end
end
always@(posedgetick1)
begin
if(zf)
begin
ledin=8'b00001111;
if(zs==0&&zg<=5)
begin
case(ts)
0:
beginledin=8'b00001111;end
1:
beginledin=8'b00000000;end
endcase
end
end
else
begin
ledin=8'b11110000;
if(fs==0&&fg<=5)
begin
case(ts)
0:
beginledin=8'b11110000;end
1:
beginledin=8'b00000000;end
endcase
end
end
ts<=ts+1;
if(ts==1)
ts<=0;
end
endmodule