青岛农业大学理学与信息科学学院电子设计自动化及专用集成电路课程设计报告设计题目一、设计一个二人抢答器二、密码锁学生专业班级学生姓名(学号)指导教师完成时间实习(设计)地点信息楼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 );//顶层模块部分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;snatchsnatch(reset,key,led,m);//调用抢答模块store store(score,clr,m,q);//调用加分模块deled deled(q,opin);//调用显示模块endmodulemodulesnatch(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)beginq<=1'b0;endelse 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;wireclk=score[0]|score[1]|score[2];/ /判断是否进行加分always@(posedge clr or posedge clk)//判断是清零还是加分beginif(clr) q<=8'h00;elsebegincase(s)//判断那位选手加分2'b01:begin if(q[3:0]<4'h9)beginif(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分endend2'b10:begin if(q[7:4]<4'h9)beginif(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分endendendcaseendendendmodulemodule 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)密码锁moduleKeyPress(sysclk,reset,keyin,data_out,LED,YN);input sysclk; //系统时钟reg clk; //分频1reg 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计数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;reg enterX;//未定义(本来用作可以自定密码的)//分频1always@(posedge sysclk ornegedge reset)if (!reset)begincount <= 26'B0; endelse if (count==120000)begincount<= 26'B0;clk <= ~clk;endelse begincount<=count+26'B1;end//分频2always@(posedge sysclk ornegedge reset)if (!reset)begincount2 <= 26'B0;count3 <= 4'B0000;endelse if (count2==1200000)begincount2 <= 26'B0;count3 <= count3+ 4'B0001;if(count3==4'B0011)beginclk2<= ~clk2;count3 <= 4'B0000;endendelsebegincount2<=count2+26'B1;end//输入always@(posedge clk or negedge reset)if (!reset)beginkeyAA[0] <=3'B111;keyAA[1] <=3'B111;keyAA[2] <=3'B111;endelsebeginkeyAA[0] <= keyin;keyAA[1] <= keyAA[0];end//判断按键并且比较,赋值,主程序always@(posedge clk2 or negedge reset)beginif (!reset)beginmovX<= 4'B0000;enterX<= 1'B0;numSAT[0] = 4'B0;numSAT[0] = 4'B0; numSAT[0] = 4'B0; numSAT[0] = 4'B0;YN <= 1'B1;endelse if (keyin==keyAA[1]) beginif(keyin==3'B110)key=4'B0001;else if (keyin==3'B101) key=4'B0010;else if (keyin==3'B011) key=4'B0011;//按键1,数值递增,赋值if (key==4'B0001)begin#20;num <= num+4'B1;if(movX==4'B0000)numSAT[0] = num;else if (movX==4'B0001) numSAT[1] = num;else if (movX==4'B0010) numSAT[2] = num;else if (movX==4'B0011) numSAT[3] = num;if (num==4'B1010)num <= 4'B0;key =4'B0011;end//按键2,移位if (key==4'B0010)begin#30movX <=movX+4'B0001;if(movX==4'B0100)beginif(numSAT[0]==1)if(numSAT[1]==2)if(numSAT[2]==3) if(numSAT[3]==4) YN <=1'B0;elseYN <=1'B1;elseYN <=1'B1;elseYN <=1'B1;elseYN <=1'B1;endif (movX==4'B0101) movX <= 4'B0;key=4'B0011;end//按键3,未定义if(key==4'B0011)beginenterX <=1'B0;endendend//根据数字,输出到数码管always@(posedge clk or negedge reset)beginif (!reset)begindata_out = 8'B0011_1111;endelsebegincountA<= countA+8'B1;if(countA==8'B0000_0010)beginLED =4'B1110;//高电平有效case(numSAT[0])4'B0000:data_out=8'B0011_1111;//04'B0001:data_out=8'B0000_0110;//14'B0010:data_out=8'B0101_1011;//24'B0011:data_out=8'B0100_1111;//34'B0100:data_out=8'B0110_0110;//44'B0101:data_out=8'B0110_1101;//54'B0110:data_out=8'B0111_1101;//64'B0111:data_out=8'B0000_0111;//74'B1000:data_out=8'B0111_1111;//84'B1001:data_out=8'B0110_1111;//9default:data_out=8'B0011_1111;//0endcaseendelse if (countA==8'B0000_0100)beginLED =4'B1101;case(numSAT[1])4'B0000:data_out=8'B0011_1111;//04'B0001:data_out=8'B0000_0110;//14'B0010:data_out=8'B0101_1011;//24'B0011:data_out=8'B0100_1111;//34'B0100:data_out=8'B0110_0110;//44'B0101:data_out=8'B0110_1101;//54'B0110:data_out=8'B0111_1101;//64'B0111:data_out=8'B0000_0111;//74'B1000:data_out=8'B0111_1111;//84'B1001:data_out=8'B0110_1111;//9default:data_out=8'B0011_1111;//0endcaseendelse if (countA==8'B0000_0110)beginLED =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;//0endcaseendelse if (countA==8'B0000_1000)beginLED =4'B0111;case(numSAT[3])4'B0000:data_out=8'B0011_1111;//04'B0001:data_out=8'B0000_0110;//14'B0010:data_out=8'B0101_1011;//24'B0011:data_out=8'B0100_1111;//34'B0100:data_out=8'B0110_0110;//44'B0101:data_out=8'B0110_1101;//54'B0110:data_out=8'B0111_1101;//64'B0111:data_out=8'B0000_0111;//74'B1000:data_out=8'B0111_1111;//8 4'B1001:data_out=8'B0110_1111;//9 default:data_out=8'B0011_1111;//0 endcase countA <=8'B0; endendendendmodule三、系统实施仿真图如下:当裁判按下允许抢答按钮,之后选手一按下抢答按钮,之后选手一的灯亮,之后将内存器的q置1,选手二再按下按钮时已经失效,根据答题部分裁判加10分,如果裁判按下清零键之后选手分手显示零分,重新开始。