资源描述
精心整理 FPGA课程设计报告 专业:通信工程 班级:班 姓名: 学号: 指导教师:祝宏 制作日期:11.1011.20设计课题1:设计一个可控的100进制可逆计数器,要求用DE2-115开发板下载。1计数器的时钟输入信号周期为200ns。2以十进制形式显示。3有一个复位端clr和两个限制端plus和minus,在这些限制信号的作用下,计数器具有复位、增或减计数、暂停功能。clrplusminus功能0复位为0110递增计数101递减计数111暂停计数设计步骤第一步:参考书中的60进制计数器设计出100进制的加法计数器,用时30分钟;其次步:仿照100进制的加法可以设计出100进制的减法计数器,用时45分钟;第三步:将两段程序拼凑起来,利用两个限制端限制加减和暂停功能,用时15分钟。关键词可逆;暂停;循环计数。内容摘要计数器具有复位、增减计数和暂停功能,可循环计数,可用作平常的计数器用。总体方案顶层逻辑电路图上图为100进制可逆计数器的封装图,sw0限制计数脉冲的频率大小,sw1限制清零端,sw2和sw3为两个限制端plus和minus,hex1和hex0分别显示100进制的十位和个位。底层功能模块设计100进制可逆加减的程序代码:modulecount100(qout,/输出的数字 cout,/进位 data,/置位数字load,/置位端clr,/清零端clk,/时钟脉冲plus,/限制端minus/限制端;inputload,clk,clr,plus,minus;input7:0data;/输入output7:0qout;reg7:0qout;outputcout;/输出always(posedgeclk)/脉冲beginif(!clr)qout=0;/假如清零端为0,将输出清零 else if(load) qout=data;/假如置数端为1,将置数端数字给输出elseif(plus&!minus&qout3:0=9&qout7:4=9) qout=0;/当plus为1且minus为0时假如计数到99时回到00elseif(plus&!minus) /plus为1,minus为0,递增计数beginif(qout3:0=9)beginqout3:0=0;if(qout7:4=9)qout7:4=0;elseqout7:4=qout7:4+1;endelseqout3:0=qout3:0+1;endelseif(!plus&minus) /plus为0,minus为1,递减计数beginif(qout3:0=0)beginqout3:0=9;if(qout7:4=0)qout7:4=9;elseqout7:4=qout7:4-1;endelseqout3:0=qout3:0-1;endelseif(plus&minus)/qout=qout;/plus为1,minus为1,暂停计数elseqout=0;/为其他时清零endassigncout=(qout=8d99)?1:0; /为99时进位端进endmodule注释:利用plus和minus的几种组合可限制加减和暂停计数。利用清零端可将计数清零,以便计数。各模块功能仿真波形显示的结果:当plus为1,minus为0时,递增计数到99时下一刻为00。当clk为0时,计数器清零。当plus为0,minus为1时,递减计数,00时下一秒变为99。当plus为1,minus为1,暂停计数。设计中遇到问题及解决方法在设计时,我用的是让其自己加减的方法,在仿真时可以做出正确的结果,但是在下载板中显示时,个位始终从0加到了F才向十位进位,我感觉到可能是程序出错了,我没有将十位和个位分开,而是写在了一起,导致默认为十六位计数,于是我将程序改为分开计数,最终最终胜利了。心得体会从第一个简洁的试验中我感觉到,看起来简洁的事,可能自己亲自做的时候就会发觉许多问题,这些问题都要自己去解决,后面的两个试验更难,我须要更多的去开动脑筋,多多查阅资料,力争做好。设计课题2:交通灯限制系统,要求用DE2-115开发板下载。1设计一个十字路口交通信号灯的定时限制电路。要求红、绿灯按必须的规律亮和灭,绿灯亮时,表示该车道允许通行;红灯亮时,该车道制止通行。并在亮灯期间进展倒计时,并将运行时间用数码管显示出来。2要求主干道每次通行时间为40秒,支干道每次通行时间为30秒。每次变换运行车道前绿灯闪耀,持续时间为5秒。即车道要由主干道转换为支干道时,主干道在通行时间只剩5秒钟时,绿灯闪耀5秒显示,支干道仍为红灯,以便主干道上已过停车线的车接着通行,未过停车线的车停顿通行。同理,当车道由支干道转换为主干道时,支干道绿灯闪耀显示5秒钟,主干道仍为红灯。3定时器要求采纳递减计时方式进展计时。两个定时时间:绿灯闪耀和绿灯停顿闪耀4个状态:S0:主干道绿灯亮,支干道红灯亮。S1:主干道绿灯闪耀,支干道红灯亮。S2:支干道绿灯亮,主干道红灯亮。S3:支干道绿灯闪耀,主干道红灯亮设计步骤第一步:在程序内部转载一个计数器,从70递减计数到00,如此循环。用时15分钟。其次步:设计主干道的计时器,从40到00,主干道绿灯亮,最终五秒时绿灯闪耀,支干道红灯亮。用时120分钟。第三步:设计支干道的计时器,从30到00,支干道绿灯亮,最终五秒时绿灯闪耀,主干道红灯亮。用时60分钟。关键词交通灯;十字路口;倒计时闪耀。内容摘要该红绿灯可实现十字路口的交通管制,主干道和支干道分别通行40秒和30秒如此循环,可便于交通顺畅,通行与否由红绿灯予以提示。总体方案顶层逻辑电路图上图为红绿灯的封装图,sw0为脉冲频率限制端,sw1为清零端,LEDR0为主干道红灯,LEDG0为主干道绿灯,LEDR1为支干道红灯,LEDG1为支干道绿灯,HEX7为主干道秒钟的十位,HEX6为主干道秒钟的个位,HEX5为支干道秒钟的十位,HEX4为支干道秒钟的个位。底层功能模块设计红绿灯的程序代码:moduleled(clk,/脉冲clr,/清零端m_ledr,/主干道红灯m_ledg,/主干道绿灯s_ledr,/支干道红灯s_ledg,/支干道绿灯count1,/主干道秒钟count2/支干道秒钟 );inputclk,clr;outputm_ledr,m_ledg,s_ledr,s_ledg;output7:0count1,count2;regm_ledr,m_ledg,s_ledr,s_ledg;reg7:0count1,count2;reg1:0state;reg7:0times;parameterstate0=2b00,/定义四种状态state1=2b01,state2=2b10,state3=2b11;always(posedgeclkornegedgeclr)beginif(!clr)/清零begintimes=8h70;/计数清零state=state0;/状态复位endelseif(times=0)/计数为零times=8h70;/计数预置elsebegintimes3:0=times3:0-1;/计数个位减一if(times3:0=4h0)/判定计数个位是否为零begintimes7:4=times7:4-1;/十位减一times3:0=4h9;/个位置数endcase(state)/是哪种状态?state0:if(times=8h36)/状态零阶段,计数器为3670state=state1;/状态转换state1:if(times=8h31)/状态一阶段,计数器为3135state=state2;/状态转换state2:if(times=8h6)/状态二阶段,计数器为630state=state3;/状态转换state3: if(times=8h1)/状态三阶段,计数器为15beginstate=state0;/状态转换times=8h70;/计数清零endendcaseendendalways(posedgeclk)beginif(times!=0)/计数不为零吗?begincase(state)/是哪种状态?状态机输出state0:beginm_ledg=1;/状态零,主干道红灯灭,绿灯亮。支干道红灯亮,绿灯灭。m_ledr=0;s_ledg=0;s_ledr=1;count2=times-8h30;/支干道计数显示count1=times-8h30;/主干道时间显示endstate1:beginm_ledg=m_ledg;/状态一,主干道红灯灭,绿灯闪耀。支干道红灯亮,绿灯灭。m_ledr=0;s_ledg=0;s_ledr=1;count1=times-8h30;/主干道时间显示count2=times-8h30;/支干道计数显示endstate2:beginm_ledg=0;/状态二,主干道红灯亮,绿灯灭。支干道红灯灭,绿灯亮。m_ledr=1;s_ledg=1;s_ledr=0;count1=times;/主干道计数显示count2=times;/支干道时间显示endstate3:beginm_ledg=0;/状态三,主干道红灯亮,绿灯灭。支干道红灯灭,绿灯闪耀。m_ledr=1;s_ledg=s_ledg;s_ledr=0;count2=times;/支干道时间显示count1=times;/主干道计数显示endendcaseendendendmodul注释:四种状态分别对应题设要求的四种状态,之所以设一个70进制的递减计数器是因为主干道的40秒和支干道的30秒是循环显示的,可以放在一起递减。各模块功能仿真波形显示的结果主干道count1从40递减到00,支干道count2从40递减到00,主干道绿灯m_ledg在最终五秒闪耀,支干道红灯s_ledr亮之后转为支干道绿灯s_ledg亮,主干道红灯m_ledr亮。支干道count2从30递减到00,主干道count1从30递减到00,支干道绿灯s_ledg在最终五秒闪耀,主干道红灯m_ledr亮之后转为主干道绿灯m_ledg亮,支干道红灯s_ledr亮。设计中遇到问题及解决方法在设计过程中,之前准备是分开计数,后来发觉太麻烦,问过同学后确定采纳他的方法,在程序中放一个计数器,使得计数变得简洁,后来在四种状态设置时,我参考书上的用状态机的方法,使得四种状态变得清晰明朗,让我出现错误的概率变小了,由于题设木有说明当主干道显示时,支干道显示什么,我觉得也要让支干道的人知道还有多久可以通车,于是将主干道的时间也给了支干道,同样在支干道倒计时时主干道也在倒计时,这样可以让司机估计好时间。闪耀的灯起先时不知道怎么设置,后来问同学了知道改为灯等于灯的非就好了,这是我收获到的。心得体会从这次的设计红绿灯的试验中,我感到了很大的压力,感觉平常看着红绿灯在街上倒计时蛮简洁的,什么事情都是想的很简洁,真刚要自己上手去做的时候才会发觉许多自己不懂的学问,例如限制主干道和支干道的循环,跳变,如何让绿灯在特定的时间闪耀,都是设计者须要去考虑的问题,以及自己的作品在实际生活中应用,会不会有什么问题,如何让其更加简洁明朗,让人们一看就明白,我更加明白了自己的责任,和更多应当留意的问题。设计课题3:多功能数字钟系统层次化设计,要求用DE2-115开发板下载。1根本功能:60秒60分24小时。2扩展功能:报时;每小时59分51,53,55,57秒低频报时,59秒高频报时。校时校分;时段限制;6点18点输出灯不亮,其它时间灯亮。闹钟功能:能自己预设一个时间,到预设时间时,闹钟响起,持续一分钟。设计步骤第一步:设计60进制的加法计数器,带进位,用时15分钟;其次步:设计24进制的加法计数器,用时30分钟;第三步:将两个60和一个24的计数器组合成一个数字钟,实现其根本功能,用时120分钟;第四步:设计时段限制,6-18点输出灯不亮,其他时间亮,用时30分钟;第五步:设计报时功能,由于缺少蜂鸣器,用指示灯代替,每小时59分51,53,55,57秒时红灯亮,59秒时红灯亮,用时60分钟;第六步:另外设置一个计数器,通过使能端限制,作为校时校分的预设数,通过使能端将预设数送入数字钟内,用时两周;第七步:通过使能端将另外的计数器作为闹钟,预设一个时间,由于缺少蜂鸣器,用显示灯代替,当时钟走到预设的时间时,预设的红灯闪耀,持续一分钟,用时120分钟。关键词数字钟;校时校分;整点转换提示;时段限制;闹钟。内容摘要该数字钟可实现平凡时钟的计时功能,为24进制,可实现手动校时校分,便利更改时间,该数字钟可实现时段限制的功能,在深夜时开灯照明,在白天时关闭照明,省电;整点转换时会有相应的提示,便利提示用户,在教师要求的根底下,我给这个数字钟设计了一个闹钟的功能,用户可以手动设定闹钟的时间,便利用户的起床和事项支配。总体方案顶层逻辑电路图注释:上图为数字钟的封装图,图中,sw0限制暂停,sw1限制脉冲频率,sw2限制复位端,sw3限制另一计数器的分钟局部,sw4限制校分,sw5限制另一计数器的小时局部,sw6限制校时,sw7sw8限制最终两个数码管显示另一计数器的小时还是分钟局部,sw9为闹钟限制端,hex7hex6显示数字钟的小时局部,hex5hex4显示数字钟的分钟局部,hex3hex2显示数字钟的秒钟局部,hex1hex0显示另一计数器的小时或者分钟局部,ledr0为限制端的亮灯,ledg0为每小时59分59秒时的绿灯,ledr1为每小时59分51、53、55、57的亮灯,ledr2为闹钟的亮灯。底层功能模块设计程序代码:moduleshizhong(qout,/数字钟秒钟 reset,/复位端 clk,/脉冲 qout1,/数字钟分钟 qout2,/数字钟小时 data,/置数显示 data1,/置数的分钟 data2,/置数的小时 led,/限制端的灯 leg,/每小时59分59秒的绿灯 ler,/每小时59分51、53、55、57秒的红灯 ler1,/闹钟亮灯 h,/校时 m,/校分 a,/限制置数分钟的改变 b,/限制显示置数的分钟 c,/限制置数小时的改变 d,/限制显示置数的小时 e);/闹钟限制端 inputclk,reset,h,m,a,b,c,d,e;outputreg7:0qout,data;outputreg7:0qout1,data1;outputreg7:0qout2,data2;outputregled;outputregleg,ler,ler1;always(posedgeclk)beginbeginif(a=1)/调整置数的分钟局部beginif(data13:0=9) begindata13:0=0;if(data17:4=5)begindata17:4=0; endelsedata17:4=data17:4+1; endelsedata13:0=data13:0+1;endendbeginif(b=1)/限制置数分钟的显示data=data1;endbeginif(c=1)/限制置数小时的改变beginbeginif(data23:0=9)begindata23:0=0;begindata27:4=data27:4+1;endendelsedata23:0=data23:0+1;endif(data27:4=2&data23:0=3)data2=0; endendbeginif(d=1)/限制置数小时的显示data=data2;end beginif(reset)/复位 beginqout=0; qout1=0; qout2=0; endelseif(h)/校时 beginqout2=data; endelseif(m)/校分beginqout1=data;endelse/正常计数局部 begin if(qout3:0=9) beginqout3:0=0;begin if(qout7:4=5) beginqout7:4=0;beginif(qout13:0=9) beginqout13:0=0; if(qout17:4=5) beginqout17:4=0; beginif(qout23:0=9)beginqout23:0=0; beginqout27:4=qout27:4+1;end endelseqout23:0=qout23:0+1; endif(qout27:4=2&qout23:0=3)qout2=0;endelseqout17:4=qout17:4+1;endelseqout13:08h5&qout28h19)led=0;elseled=1; end always(qout)/报时局部 beginleg=0; ler=0;if(qout1=8h59) begin if(qout=8h59)/每小时59分59秒时 leg=1; if(qout=8h51|qout=8h53|qout=8h55|qout=8h57)ler=1;end endendmodule各模块功能仿真波形显示的结果当时钟走到23小时59分59秒时leg灯亮,为51、53、55、57秒时ler灯亮。时段限制,6-18点时led灯不亮,其他时段亮灯。当a为1时,data1自动递增,为0时暂停,当b为1时把data1的数给data显示,当m为1时把置好的data1给qout1,校分功能实现。当c为1时,data2自动递增,为0时暂停,当d为1时把data2的数给data显示,当h为1时把置好的data给qout2,校时功能实现。当时钟走到预设的时间,闹钟开关e翻开时ler1灯起先闪耀,提示闹钟时间到。心得体会在最终一个试验完成的时候我的心情真是无比的快乐啊,从最初的一窍不通到最终始终坚持着试验的做完,感觉自己像是完成了一项宏大的任务,内心无比的激烈与骄傲。同时,在此过程中我也遇到了不少问题,同学们也都热忱的给与了协助,这也让我感觉到了团队的才智终究不是单个人所能比较的。总而言之这次试验,让我收获颇丰。
展开阅读全文