您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 实验23按键消抖冯冠玺
实验报告2016年12月成绩:姓名冯冠玺学号15051415班级15052313专业计算机科学与技术课程名称《数字电路课程设计》任课老师冯建文指导老师冯建文机位号实验序号23实验名称按键消抖与单脉冲产生实验实验时间实验地点实验设备号一、实验程序设计分工如下:每个人单独完成一个大实验。第23个实验:冯冠玺第18,19个实验:郑凯各模块示意图:一.分频器模块clk_100mclk_100m分频器clk_10msclkout_100resetreset二.按键消抖模块resetreset按键消抖模块clk_100clkkey_pulsekeykey三.计数器模块计数器resetresetledclkclk总模块:resetresetresetreset计数器clk_100clk按键消抖clk_100m模块ledkeykeykey_pulseclk实验程序源代码:moduleMy23(key,reset,clk_100m,led);//顶层模块inputreset,clk_100m,key;outputreg[7:0]led;wireclkout_100,key_pulse;initialbeginled=0;endFenpinfp(clk_100m,clkout_100,reset);//分频模块,有100MHz的作为输入,输出是100Hz时钟Xiaodouxd(reset,clkout_100,key,key_pulse);//消抖模块,接收100Hz时钟,输出是key_pulsealways@(posedgekey_pulseorposedgereset)beginif(reset==1)led=0;reset分频器clkout_100clk_100melseled=led+1;//用8位led灯来表示计数器是否只加1;endendmodulemoduleXiaodou(reset,clk_100,key,key_pulse);/*消抖模块,输入为分频模块输出的100Hz的时钟,输出为key_pulse*/inputkey,clk_100,reset;outputregkey_pulse;reg[2:0]ST;//因为是6个状态,所以要用到3位;parameterS0=3'b000,S1=3'b001,S2=3'b010,S3=3'b011,S4=3'b100,S5=3'b101;/*用parameter定义常量增强程序的可读性*/initialbeginST=S0;key_pulse=0;endalways@(posedgeresetorposedgeclk_100)/*根据书中要求的,在reset有效的情况下,若key为0则ST为S0,若为1,则ST为S3*/beginif(reset==1)beginif(key==0)ST=S0;elseST=S3;endelse/*根据书上的状态转移图写出描述语句*/begincase(ST)S0:key_pulse=key?0:0;S1:key_pulse=key?1:0;S2:key_pulse=key?0:0;S3:key_pulse=key?1:1;S4:key_pulse=key?1:0;S5:key_pulse=key?1:0;endcasecase(ST)S0:ST=key?S1:S0;S1:ST=key?S3:S2;S2:ST=key?S1:S0;S3:ST=key?S3:S4;S4:ST=key?S5:S0;S5:ST=key?S3:S4;endcaseendendendmodulemoduleFenpin(clk_100M,clkout_100,reset);/*分频模块,输入为100MHz的时钟,输出为100Hz的时钟信号*/inputclk_100M,reset;outputregclkout_100;reg[18:0]counter;//1兆约等于2的20次方,但因为是方波,所以counter为19位;always@(posedgeresetorposedgeclk_100M)beginif(reset)begincounter=19'd0;clkout_100=1'b0;endelseif(counter==19'd500000)/*在counter为1M的一半时,反转状态,也就是每半个周期方波信号从0变为1,或从1变为0*/beginclkout_100=~clkout_100;counter=19'd0;//达到1M的时候,counter要从0开始重新计数endelsecounter=counter+1'b1;endendmodule二、仿真波形每10ms读入一个key,所以我将时间范围从1微秒改为1秒,并且我的reset重置信号是为0时意为无效。第二个十毫秒时,key_pulse才有一个上跳沿,进行led加一从00000000变为00000001,接着,再进行一次循环从S3到S4到S0到S1到S3,这个时候key_pulse又从0变为1产生了上跳沿,led又加1,从00000001变为00000010三、电路图四、引脚配置(约束文件)NETresetLOC=T9;NETkeyLOC=T5;NETclk_100mLOC=V10;NETled[0]LOC=T11;NETled[1]LOC=R11;NETled[2]LOC=N11;NETled[3]LOC=M11;NETled[4]LOC=V15;NETled[5]LOC=U15;NETled[6]LOC=V16;NETled[7]LOC=U16;五、思考与探索1.请说明你是如何将图7.4所示的状态转移图变成电路的,写出设计过程。首先图中一共有六个状态,所以给每个状态编码时一定要用到3位二进制。这里我给这六个状态编码的语句是:parameterS0=3'b000,S1=3'b001,S2=3'b010,S3=3'b011,S4=3'b100,S5=3'b101;接着,再利用case()语句和三目运算符?:,来实现各个状态的转移。2.谈谈你再实验中遇到了哪些问题,又是如何解决的。在编程中遇到的问题1.最初不知道分频时counter数值应该是多少为一次。解决办法是找到了第16个综合实验,里面有对分频倍数的解析,从而解决了问题。2.起初不知道分为多个模块写,也不知道各个模块怎么传值,是看了网上的代码,才明白哦,每个模块就相当于C语言中的函数,传值也相当于C语言的函数传值。在仿真时遇到的问题:1.一开始不知道怎么表现出这个100M的时钟信号。解决办法是后来发现用forever语句可以,forever#5clk_100m=~clk_100m;2.最初是用while(1)语句,让key=1一直循环,结果led只能加一次。解决方法是:仔细研究才想明白原来,一直让key=1的话,key_pulse最初从0变为1,产生了上跳沿,但是后面的key_pulse一直是1,也就是说不会再产生上跳沿了。所以,达到状态S3之后,应该让key=0,让S3变为S4,再变为S0,再变为S1,再变为S3,这个时候key_pulse从0变为1又产生了上跳沿,于是led再加1,从00000001变为00000010。
本文标题:实验23按键消抖冯冠玺
链接地址:https://www.777doc.com/doc-7301248 .html