青岛农业大学电子设计自动化及专用集成电路 课程设计报告.docx
- 文档编号:5354517
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:15
- 大小:109.82KB
青岛农业大学电子设计自动化及专用集成电路 课程设计报告.docx
《青岛农业大学电子设计自动化及专用集成电路 课程设计报告.docx》由会员分享,可在线阅读,更多相关《青岛农业大学电子设计自动化及专用集成电路 课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
青岛农业大学电子设计自动化及专用集成电路课程设计报告
青岛农业大学
理学与信息科学学院
电子设计自动化及专用集成电路
课程设计报告
设计题目一、设计一个二人抢答器二、密码锁
学生专业班级
学生姓名(学号)
指导教师
完成时间
实习(设计)地点信息楼121
年11月1日
一、课程设计目的和任务
课程设计目的:
本次课程设计是在学生学习完数字电路、模拟电路、电子设计自动化的相关课程之后进行的。
通过对数字集成电路或模拟集成电路的模拟与仿真等,熟练使用相关软件设计具有较强功能的电路,提高实际动手,为将来设计大规模集成电路打下基础。
课程设计任务:
一、设计一个二人抢答器。
要求:
(1)两人抢答,先抢有效,用发光二极管显示是否抢到答题权。
(2)每人两位计分显示,打错不加分,答对可加10、20、30分。
(3)每题结束后,裁判按复位,重新抢答。
(4)累积加分,裁判可随时清除。
二、密码锁
设计四位十进制密码锁,输入密码正确,绿灯亮,开锁;不正确,红灯亮,不能开锁。
密码可由用户自行设置。
二、分析与设计
1、设计任务分析
(1)二人抢答器用Verilog硬件描述语言设计抢答器,实现:
1、二人通过按键抢答,最先按下按键的人抢答成功,此后其他人抢答无效。
2、每次只有一人可获得抢答资格,一次抢答完后主持人通过复位按键复位,选手再从新抢答。
3、有从新开始游戏按键,游戏从新开始时每位选手初始分为零分,答对可选择加10分、20分,30分,最高九十分。
4、选手抢答成功时其对应的分数显示。
(2)密码锁
1、第一个数字控制键用来进行密码的输入
2、第二个按键控制数字位数的移动及调用密码判断程序。
当确认后如果显示数据与预置密码相同,则LED亮;如不相等,则无反应。
按下复位键,计数等均复位
2、设计方案论证详细设计
(1)抢答器的主要利用D触发器的反馈,当检测到第一个上升沿时将按键(未按下时接低电平)接入的与门锁住,以保证与门只有一个上升沿输出,从而实现“最先按下按键的人抢答成功,此后其他人抢答无效”。
在与门输出上升沿的同时检测按键,以确定是哪位选手抢答,用寄存器存下抢答选手的信息,最后确定哪个led灯亮以及那位选手对应的分数闪烁。
将各模块代码写好并测试后,在主模块中调用并分配引脚,引脚分配好后,从新编译、下载就可实验了。
分别验证上述的各种功能,看是否达到预期的效果。
(2)根据密码输入信号控制I/0口的输出,第一个按键控制数字的递加,第二个按键控制数字位数的移动及调用密码判断程序。
当确认后如果显示数据与预置密码相同,则LED亮;如不相等,则无反应。
按下复位键,计数等均复位。
系统流程如下:
3、详细设计
(1)二人抢答器。
顶层模块部分在在quartusII下的仿真原理图如下所示:
抢答部分的仿真图:
加分模块部分(对应snatch模块)在quartusII下的仿真原理图如下所示:
数码管显示模块部分(对应snatch模块)在quartusII下的仿真原理图如下所示:
(2)密码锁
密码锁模块部分(对应snatch模块)在quartusII下的仿真原理图如下所示:
4、源代码分析
(1)二人抢答器代码
moduletop(reset,key,score,clr,led,opin);//顶层模块部分
inputreset;//开始抢答按钮
input[1:
0]key;//双人抢答按键
input[2:
0]score;//加分按钮
inputclr;//清零按钮
output[1:
0]led;//显示灯
output[31:
0]opin;//数码管引脚控制
wire[1:
0]m;
wire[7:
0]q;
snatchsnatch(reset,key,led,m);//调用抢答模块
storestore(score,clr,m,q);//调用加分模块
deleddeled(q,opin);//调用显示模块
endmodule
modulesnatch(reset,key,led,m);//抢答模块部分
inputreset;
input[1:
0]key;
output[1:
0]led;
output[1:
0]m;
regq;
reg[1:
0]s;
wireout=key[0]|key[1];
wireclk=(!
q)&out;
assignm=s;
always@(posedgeclkorposedgereset)//判断是否清零
if(reset)
begin
q<=1'b0;
end
elseq<=1'b1;
always@(posedgeclk)//当开始抢答时,判断是否有人抢答,并将抢答的选手记录下来
case(key)
2'b01:
s<=2'b01;
2'b10:
s<=2'b10;
default:
s<=2'b?
?
;
endcase
assignled=s;//对应选手的灯亮
endmodule
modulestore(score,clr,s,q);//加分模块
inputclr;
input[2:
0]score;
input[1:
0]s;
output[7:
0]q;
reg[7:
0]q;
wireclk=score[0]|score[1]|score[2];//判断是否进行加分
always@(posedgeclrorposedgeclk)//判断是清零还是加分
begin
if(clr)q<=8'h00;
else
begin
case(s)//判断那位选手加分
2'b01:
beginif(q[3:
0]<4'h9)
begin
if(score==3'b001)q[3:
0]<=q[3:
0]+4'b0001;//选手一加10分
elseif(score==3'b010)q[3:
0]<=q[3:
0]+4'b0010;//选手一加20分
elseq[3:
0]<=q[3:
0]+4'b0011;//选手一加30分
end
end
2'b10:
beginif(q[7:
4]<4'h9)
begin
if(score==2'b001)q[7:
4]<=q[7:
4]+4'b0001;//选手二加10分
elseif(score==2'b010)q[7:
4]<=q[7:
4]+4'b0010;//选手二加20分
elseq[7:
4]<=q[7:
4]+4'b0011;//选手二加30分
end
end
endcase
end
end
endmodule
moduledeled(pin,opin);//数码管显示模块
input[7:
0]pin;
output[31:
0]opin;
reg[31:
0]opin;
always@(pin[0]orpin[1]orpin[2]orpin[3]orpin[4]orpin[5]orpin[6]orpin[7])//判断是否有加分显示部分
begin
case(pin[3:
0])//判断一号选手的分数
4'b0000:
opin[15:
0]<=16'h3f3f;//显示零分
4'b0001:
opin[15:
0]<=16'h063f;//显示十分
4'b0010:
opin[15:
0]<=16'h5b3f;//显示二十分
4'b0011:
opin[15:
0]<=16'h4f3f;//显示三十分
4'b0100:
opin[15:
0]<=16'h663f;//显示四十分
4'b0101:
opin[15:
0]<=16'h6d3f;//显示五十分
4'b0110:
opin[15:
0]<=16'h7d3f;//显示六十分
4'b0111:
opin[15:
0]<=16'h073f;//显示七十分
4'b1000:
opin[15:
0]<=16'h7f3f;//显示八十分
4'b1001:
opin[15:
0]<=16'h6f3f;//显示九十分
endcase
case(pin[7:
4])//判断二号选手的分数
4'b0000:
opin[31:
16]<=16'h3f3f;
4'b0001:
opin[31:
16]<=16'h063f;
4'b0010:
opin[31:
16]<=16'h5b3f;
4'b0011:
opin[31:
16]<=16'h4f3f;
4'b0100:
opin[31:
16]<=16'h663f;
4'b0101:
opin[31:
16]<=16'h6d3f;
4'b0110:
opin[31:
16]<=16'h7d3f;
4'b0111:
opin[31:
16]<=16'h073f;
4'b1000:
opin[31:
16]<=16'h7f3f;
4'b1001:
opin[31:
16]<=16'h6f3f;
endcase
end
endmodule
(2)密码锁
moduleKeyPress(sysclk,reset,keyin,data_out,LED,YN);
inputsysclk;//系统时钟
regclk;//分频1
regclk2;//分频2
inputreset;//复位
input[2:
0]keyin;//三位输入
output[7:
0]data_out;//八位数码管输入
reg[7:
0]data_out;
outputYN;//判断密码正确与否的Led灯
regYN;
reg[2:
0]keyAA[2:
0];//输入缓冲,防抖
reg[25:
0]count;//分频1计数?
reg[25:
0]count2;//分频2计数
reg[3:
0]count3;//分频2计数2
reg[7:
0]countA;//数码管显示延迟计数
reg[3:
0]key;//输入计数器
reg[3:
0]num;//数字计算
reg[3:
0]numSAT[3:
0];//数字输出
reg[3:
0]movX;//Led灯选择计数和判断密码
reg[3:
0]LEDtem;//led灯选择缓冲
output[3:
0]LED;//led灯选择
reg[3:
0]LED;
regenterX;//未定义(本来用作可以自定密码的)
//分频1
always@(posedgesysclkornegedgereset)
if(!
reset)
begin
count<=26'B0;
end
elseif(count==120000)
begin
count<=26'B0;
clk<=~clk;
end
else
begin
count<=count+26'B1;
end
//分频2
always@(posedgesysclkornegedgereset)
if(!
reset)
begin
count2<=26'B0;
count3<=4'B0000;
end
elseif(count2==1200000)
begin
count2<=26'B0;
count3<=count3+4'B0001;
if(count3==4'B0011)
begin
clk2<=~clk2;
count3<=4'B0000;
end
end
else
begin
count2<=count2+26'B1;
end
//输入
always@(posedgeclkornegedgereset)
if(!
reset)
begin
keyAA[0]<=3'B111;
keyAA[1]<=3'B111;
keyAA[2]<=3'B111;
end
else
begin
keyAA[0]<=keyin;
keyAA[1]<=keyAA[0];
end
//判断按键并且比较,赋值,主程序
always@(posedgeclk2ornegedgereset)
begin
if(!
reset)
begin
movX<=4'B0000;
enterX<=1'B0;
numSAT[0]=4'B0;
numSAT[0]=4'B0;
numSAT[0]=4'B0;
numSAT[0]=4'B0;
YN<=1'B1;
end
elseif(keyin==keyAA[1])
begin
if(keyin==3'B110)
key=4'B0001;
elseif(keyin==3'B101)
key=4'B0010;
elseif(keyin==3'B011)
key=4'B0011;
//按键1,数值递增,赋值
if(key==4'B0001)
begin
#20;
num<=num+4'B1;
if(movX==4'B0000)
numSAT[0]=num;
elseif(movX==4'B0001)
numSAT[1]=num;
elseif(movX==4'B0010)
numSAT[2]=num;
elseif(movX==4'B0011)
numSAT[3]=num;
if(num==4'B1010)
num<=4'B0;
key=4'B0011;
end
//按键2,移位
if(key==4'B0010)
begin
#30
movX<=movX+4'B0001;
if(movX==4'B0100)
begin
if(numSAT[0]==1)
if(numSAT[1]==2)
if(numSAT[2]==3)
if(numSAT[3]==4)
YN<=1'B0;
else
YN<=1'B1;
else
YN<=1'B1;
else
YN<=1'B1;
else
YN<=1'B1;
end
if(movX==4'B0101)
movX<=4'B0;
key=4'B0011;
end
//按键3,未定义
if(key==4'B0011)
begin
enterX<=1'B0;
end
end
end
//根据数字,输出到数码管
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
data_out=8'B0011_1111;
end
else
begin
countA<=countA+8'B1;
if(countA==8'B0000_0010)
begin
LED=4'B1110;
//高电平有效
case(numSAT[0])
4'B0000:
data_out=8'B0011_1111;//0
4'B0001:
data_out=8'B0000_0110;//1
4'B0010:
data_out=8'B0101_1011;//2
4'B0011:
data_out=8'B0100_1111;//3
4'B0100:
data_out=8'B0110_0110;//4
4'B0101:
data_out=8'B0110_1101;//5
4'B0110:
data_out=8'B0111_1101;//6
4'B0111:
data_out=8'B0000_0111;//7
4'B1000:
data_out=8'B0111_1111;//8
4'B1001:
data_out=8'B0110_1111;//9
default:
data_out=8'B0011_1111;//0
endcase
end
elseif(countA==8'B0000_0100)
begin
LED=4'B1101;
case(numSAT[1])
4'B0000:
data_out=8'B0011_1111;//0
4'B0001:
data_out=8'B0000_0110;//1
4'B0010:
data_out=8'B0101_1011;//2
4'B0011:
data_out=8'B0100_1111;//3
4'B0100:
data_out=8'B0110_0110;//4
4'B0101:
data_out=8'B0110_1101;//5
4'B0110:
data_out=8'B0111_1101;//6
4'B0111:
data_out=8'B0000_0111;//7
4'B1000:
data_out=8'B0111_1111;//8
4'B1001:
data_out=8'B0110_1111;//9
default:
data_out=8'B0011_1111;//0
endcase
end
elseif(countA==8'B0000_0110)
begin
LED=4'B1011;
case(numSAT[2])
4'B0000:
data_out=8'B0011_1111;//0
4'B0001:
data_out=8'B0000_0110;//1
4'B0010:
data_out=8'B0101_1011;//2
4'B0011:
data_out=8'B0100_1111;//3
4'B0100:
data_out=8'B0110_0110;//4
4'B0101:
data_out=8'B0110_1101;//5
4'B0110:
data_out=8'B0111_1101;//6
4'B0111:
data_out=8'B0000_0111;//7
4'B1000:
data_out=8'B0111_1111;//8
4'B1001:
data_out=8'B0110_1111;//9
default:
data_out=8'B0011_1111;//0
endcase
end
elseif(countA==8'B0000_1000)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 青岛农业大学 电子设计自动化及专用集成电路 课程设计报告 青岛 农业大学 电子设计 自动化 专用 集成电路 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)