
青岛农业大学电子设计自动化及专用集成电路课程设计报告.doc
19页青 岛 农 业 大 学理学与信息科学学院电子设计自动化及专用集成电路课程设计报告 设 计 题 目 一、设计一个二人抢答器 二、密码锁 学生专业班级 学生姓名(学号) 指 导 教 师 完 成 时 间 实 习(设计)地点 信息楼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)二人抢答器代码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);//调用显示模块endmodulemodule snatch(reset,key,led,m);//抢答模块部分input reset;input[1:0] key;output[1:0] led;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??; endcaseassign led=s;//对应选手的灯亮endmodulemodule 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 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 endmodulemodule 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])//判断是否有加分显示部分begincase(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; //显示九十分endcasecase(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;endcaseendendmodule(2)密码锁module KeyPress(sysclk,reset,keyin,data_out,LED,YN);input sysclk; //系统时钟reg clk; //分频1 reg clk2; //分频2input reset; //复位input [2:0] keyin; //三位输入output [7:0] data_out; //八位数码管输入reg [7:0] data_out;output YN; //判断密码正确与否的Led灯reg YN;reg [2:0] keyAA [2:0] ; //输入缓冲,防抖reg [25:0] count; //分频1计数?reg [25:0] count2; //分频2计数reg [3:0] count3; //分频2计数2reg [7:0] countA; //数码管显示延迟计数reg [3:0] key; //输入计数器reg [3:0] num; //数字计算reg [3:。












