文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
青 岛 农 业 大 学 理学与信息科学学院
电子设计自动化及专用集成电路
课程设计报告
设 计 题 目 一、设计一个二人抢答器 二、密码锁 学生专业班级 学生姓名(学号) 指 导 教 师 完 成 时 间 实 习(设计)地点 信息楼121
年 11 月 1 日
一、课程设计目的和任务
课程设计目的:本次课程设计是在学生学习完数字电路、模拟电路、电子设计自动化的相关课程之后进行的。通过对数字集成电路或模拟集成电路的模拟与仿真等,熟练使用相关软件设计具有较强功能的电路,提高实际动手,为将来设计大规模集成电路打下基础。
课程设计任务:
一、设计一个二人抢答器。要求:
(1) 两人抢答,先抢有效,用发光二极管显示是否抢到答题权。 (2) 每人两位计分显示,打错不加分,答对可加10、20、30分。 (3) 每题结束后,裁判按复位,重新抢答。 (4) 累积加分,裁判可随时清除。
二、密码锁
设计四位十进制密码锁,输入密码正确,绿灯亮,开锁;不正确,红灯亮,不能开锁。密码可由用户自行设置。
二、分析与设计
1、设计任务分析
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
(1)二人抢答器用Verilog硬件描述语言设计抢答器,实现:
1、二人通过按键抢答,最先按下按键的人抢答成功,此后其他人抢答无效。 2、每次只有一人可获得抢答资格,一次抢答完后主持人通过复位按键复位,选手再从新抢答。
3、有从新开始游戏按键,游戏从新开始时每位选手初始分为零分,答对可选择加10分、20分,30分,最高九十分。
4、选手抢答成功时其对应的分数显示。 (2)密码锁
1、第一个数字控制键用来进行密码的输入
2、第二个按键控制数字位数的移动及调用密码判断程序。当确认后如果显示数据与预置密码相同,则LED 亮;如不相等,则无反应。按下复位键,计数等均复位
2、设计方案论证详细设计
(1)抢答器的主要利用D触发器的反馈,当检测到第一个上升沿时将按键(未按下时接低电平)接入的与门锁住,以保证与门只有一个上升沿输出,从而实现“最先按下按键的人抢答成功,此后其他人抢答无效”。在与门输出上升沿的同时检测按键,以确定是哪位选手抢答,用寄存器存下抢答选手的信息,最后确定哪个led灯亮以及那位选手对应的分数闪烁。
将各模块代码写好并测试后,在主模块中调用并分配引脚,引脚分配好后,从新编译、下载就可实验了。分别验证上述的各种功能,看是否达到预期的效果。
(2)根据密码输入信号控制I/0 口的输出,第一个按键控制数字的递加,第二个按键控
制数字位数的移动及调用密码判断程序。当确认后如果显示数据与预置密码相同,则LED 亮;如不相等,则无反应。按下复位键,计数等均复位。系统流程如下:
3、详细设计
(1)二人抢答器。顶层模块部分在在quartusII下的仿真原理图如下所示:
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
抢答部分的仿真图:
加分模块部分(对应snatch模块)在quartusII下的仿真原理图如下所示: 数码管显示模块部分(对应snatch模块)在quartusII下的仿真原理图如下所示:
(2)密码锁
密码锁模块部分(对应snatch模块)在quartusII下的仿真原理图如下所示: 4、源代码分析
(1)二人抢答器代码 module
top(reset,key,score,clr,led,opin);//顶层模块部分
input reset;//开始抢答按钮 input[1:0] key;//双人抢答按键 input[2:0] score;//加分按钮 input clr;//清零按钮 output[1:0] led;//显示灯
output[31:0] opin;//数码管引脚控制 wire[1:0] m;
wire[7:0] q;
snatch snatch(reset,key,led,m);//调用抢答模块
store store(score,clr,m,q);//调用加分模块
deled deled(q,opin);//调用显示模块 endmodule
module snatch(reset,key,led,m);//抢答模块部分
input reset; input[1:0] key; output[1:0] led;
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
output[1:0] m; reg q; reg[1:0] s;
wire out=key[0]|key[1]; wire clk=(!q)&out; assign m=s;
always@(posedge clk or posedge reset)//判断是否清零 if(reset) begin q<=1'b0;
end
else q<=1'b1;
always@(posedge clk)//当开始抢答
时,判断是否有人抢答,并将抢答的选手记录下
来
case(key) 2'b01:s<=2'b01; 2'b10:s<=2'b10; default:s<=2'b??; endcase
assign led=s;//对应选手的灯亮 endmodule
module store(score,clr,s,q);//加分模
块
input clr; input[2:0] score; input[1:0] s; output[7:0] q; reg[7:0] q;
wire clk=score[0]|score[1]|score[2];//判断是否进行加分
always@(posedge clr or posedge clk)//判断是清零还是加分
begin
if(clr) q<=8'h00; else 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
begin
case(s)//判断那位选手加分 2'b01:begin if(q[3:0]<4'h9)
begin
if(score==3'b001)q[3:0]<=q[3:0]+4'
b0001;//选手一加10分
else
if(score==3'b010)q[3:0]<=q[3:0]+4'b0010; //选手一加20分
else
q[3:0]<=q[3:0]+4'b0011; //选手一加30分
end
end
2'b10:begin if(q[7:4]<4'h9)
begin
if(score==2'b001)q[7:4]<=q[7:4]+4'
b0001; //选手二加10分
else
if(score==2'b010)q[7:4]<=q[7:4]+4'b0010; //选手二加20分
else
q[7:4]<=q[7:4]+4'b0011; //选手二加30分
end
end
endcase end end endmodule
module deled(pin,opin);//数码管显示模块
input[7:0] pin; output[31:0] opin;
reg[31:0] opin;
always@(pin[0] or pin[1] or pin[2] or pin[3] or pin[4] or pin[5] or pin[6] or pin[7])//判断是否有加分显示部分
begin
case(pin[3:0])//判断一号选手的分
数
4'b0000:opin[15:0]<=16'h3f3f;//显示零分
4'b0001:opin[15:0]<=16'h063f; //显
示十分