版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中国石油大学(华东)本科毕业设计(论文)通信电子实习报告题 目: 多功能数字时钟学生姓名: * * *学 号:12073322 12073323 12073324专业班级:通信工程1203指导教师:张锡岭2014年7月11日课题简介一:任务定义多功能数字时钟基本功能:1、日历功能,显示年月日2、计时功能,包括时、分、秒。3、定时与闹钟功能,能在设定的时间提示4、能够对小时、分、秒进行手动调整以校正时间5、正点报时,逢正点给予一定的指示。6、跑表功能,百分秒技术。记录多个值。扩展功能:7、同步时间功能,从网上获得时间并下载到DE2上。8、便签功能,在某时某刻显示之前所要提醒的事务。采用veril
2、og设计,在de2上实现,实现LCD、七段管显示,整点报时等提示或告警信息用LED跑马灯实现。二:团队成员简要介绍团队成员及负责工作*:跑表功能显示功能计时功能*:日历功能闹铃设置功能调整时间功能*:整点报时功能 七段管显示功能第1章 系统分析和设计 本部分,详细描述设计思路.,系统整体功能,模块的划分,注明每部分的作者设计思路: 拟定数字钟的组成框图,划分模块,采用分模块、分层次的方法设计电路,。通过模式的切换来选择显示不同的内容,在计时器、闹铃。跑表之间实现切换,通过使能信号来控制调节。系统框图如下:跑表电路分段显示多个时间在LCD屏上显示便签提示(待解决)闹铃响起与整点报时模式选择 闹铃
3、调节日历调节日历电路闹铃电路计时器调节计时器电路分段计时、LCD记录是的系统输入:SW17:14 KEY3:0 ;KEY3 计时器复位信号KEY2 自增调节信号(跑表复位信号)KEY1 选择信号(跑表暂停读数信号)KEY0 模式切换信号(通过观察LEDR16:12可看出)SW17 日历模式信号SW16 日历调节选择信号SW15 自增信号SW14 跑表读数信号系统输出:LCD液晶显示屏输出 七段管显示输出 LEDR,LEDG提示信号输出。系统功能具体如下:1. 计时:正常工作状态下,每日24h计时制显示并会进位到日期。2. 设置闹铃时间:在计时模式下,按KEY0键,将会切换状态,第一次将会切换到
4、调节闹钟状态,此时若是按KEY1键将会选择调节闹钟时间的时或是分,选择后按KEY2将会实现自增。3. 调整计时器时间:若在计时器状态下连续按两次KEY0键,将会切换到调节计时器时间状态,此时若是按KEY1键将会选择调节计时器时间的时、分、秒,选择后按KEY2件会实现自增。4. 整点报时闹铃提醒:逢整点时间,跑马灯将会闪烁。当到达闹铃设置的时间时跑马灯也将会闪烁,并且优先级高于整点报时。5. 跑表分段计时:系统以100Hz频率计时,并且在七段管上显示。并且在触发条件KEY1下将时间显示到LCD显示屏上,当再次触发SW14时,将会把记录的四个数值以1hz的频率一一显示在LCD显示屏上。6. 日历:
5、SW17 控制显示日历时间,高电平为调节模式,低电平为普通运行模式。调节模式下,在触发SW16时 将会选择调节年、月、日,触发SW15时,将会自增。 在调节状态或是在满24小时进位时将会闪烁刷新。7. 分频:将内置50Mhz时钟信号分到各种所需的频率时钟信号。8. 解码以及显示:将数字信号解码到七段管显示以及LCD液晶显示屏上,并且令其显示。9. 防抖动:顾名思义,主要是为了防止触发信号的抖动。计时器模块(*)由于计时器模块包含手动调节时间功能,每当KEY出现一个下降沿,产生一个自增信号,所以每个七段管时钟应等于自身的自增信号或进位信号,代码如下:assign carryclk0=clk_1h
6、z_md | incplus0;(carryclk5:0为时钟信号,carry4:0为进位信号,incplus5:0为自增信号)当处于手动计时模块时,KEY1为选位信号模块代码如下:module bitsel(alarmmode,checkmode,sel,selcode,reset);/对时分秒的选择,并分成实在时钟或是闹铃模式下input alarmmode; /当前所处的调节模式(闹铃或计时)input checkmode; /当前状态(计时或手动调节)input sel; /手动调节选位信号(KEY1)input reset;output reg2:0 selcode; /输出调节选位
7、信号reg 2:0 check_code; /计时选位变量reg 1:0 alarm_code; /闹铃选位变量always (negedge sel or negedge reset)begin if(!reset) check_code<=3'b000; /复位信号else begincase (check_code) 3'b000: check_code<=3'b001; /计时状态 3'b001: check_code<=3'b010; /调节秒位 3'b010: check_code<=3'b100; /
8、调节分位 3'b100: check_code<=3'b001; /调节时位 default: check_code<=3'b000; endcase end end闹钟选位同上always begin if(alarmmodecheckmode) /两个之中只有一个是1 begin if(checkmode) selcode=check_code; else selcode=alarm_code,1'b0 ; end else selcode=3'b000;endendmodule以上模块得到时分秒自增信号,再由下面代码得到incplus5
9、:0(时分秒各位的自增信号),inc为输入自增信号(KEY2)always begin case(check) 3'b001: begin clk_1hz_md=0; incplus=5'b00000,inc;end 3'b010: begin clk_1hz_md=0; incplus=3'b000,inc,2'b00;end 3'b100: begin clk_1hz_md=0; incplus=1'b0,inc,4'b0000;end default:begin incplus =6'b000000; clk_1hz
10、_md=clk_1hz;end endcaseend 最后再有下面代码得到进位信号module hexcounter(clk,set,max,setdata,dataout,carryout); /调增时间input clk; /输入的时钟信号input set; /复位信号input 3:0 max,setdata; /max:每一位七段管的最大显示值; setdata:每一位七段管的最小显示值output carryout; /每一位七段管的进位信号output 3:0 dataout; /每一位七段管的输出reg 3:0 counter;reg carrybit;assign carry
11、out=carrybit;assign dataout=counter;always (posedge clk or negedge set) begin if(!set) begin counter<=setdata; carrybit<=0; end else begin if(counter=max)|(counter>max) begin counter<=0;carrybit<=1; end else begin counter<=counter+1'b1; carrybit<=0;end end end endmodule 最后由下
12、面代码使每一位七段管显示时间:module led(datain,dotin,ledout); /七段管显示input 3:0 datain; /每一位时间的值input dotin; /小数点(本次实习的板子好像不带这功能)output7:0 ledout;reg 6:0 dataout;wire dotout;assign ledout6:0=dataout;assign ledout7=dotout;assign dotout=dotin; always*begin case(datain) 0: dataout<=7'b1000000; default: dataout&
13、lt;=7'b1000000; endcase endendmodule LCD显示模块(*)module view(c,a,b,CLOCK_50,shuru,LCD_EN,LCD_RW,LCD_RS,LCD_DATA,LCD_ON,LCD_BLON);input CLOCK_50;input 32*8:1 shuru; / 传入显示信息数据input a,b,c; /清屏信号(关闭电源刷新屏幕)output LCD_EN; /刷屏信号(此信号控制LCD显示刷新频率,大于一定值的时候才能稳定显示信息)output LCD_RW; /寄存器选择,指令寄存器output LCD_RS; /
14、低电平为写操作;同为低电平可以写入指令或显示地址output LCD_ON; /电源信号output LCD_BLON; /output reg7:0 LCD_DATA; /每一个LCD小格子显示的信息reg LCD_RW,LCD_RS,clk4hz,LCD_ON;reg10:0 state;reg6:0 count;reg5:0 disp_count;reg 23:0 cnt;reg255:0 data_in_buf;parameter CLEAR=8'b00000001;/清屏parameter SETCGRAM=8'b00000010;/设置 CGRAMparameter
15、 SETFUNCTION=8'b00000100;parameter SWITCHMODE=8'b00001000;parameter SETMODE=8'b00010000;parameter RETURNCURSOR=8'b00100000;/归home位parameter SHIFT=8'b01000000;parameter WRITERAM=8'b10000000;/write RAMparameter CUR_INC=1;parameter CUR_NOSHIFT=0;parameter OPEN_DISPLAY=1;paramete
16、r OPEN_CUR=0;parameter BLANK_CUR=0;parameter DATAWIDTH8=1;parameter DATAWIDTH4=0;parameter TWOLINE=1;parameter ONELINE=0;parameter FONT5X10=1;parameter FONT5X7=0;wire 255:0DATA_IN;assign DATA_IN=shuru;/传入数值assign LCD_BLON=1;always (posedge CLOCK_50) /分频 begin if (cnt = 24'd62500) /6250000 24'
17、;h5F5E10 begin cnt <= 0; clk4hz <= clk4hz; end else cnt <= cnt+1; end assign LCD_EN = clk4hz;always (posedge clk4hz) if(a|b|!c) begin state <= CLEAR; /清屏 LCD_ON <= 0; /电源端 disp_count <= 6'b0; end else begin LCD_ON <=1; /电源端case (state)CLEAR :begin LCD_RS<=0; /寄存器选择,指令寄存器L
18、CD_RW <= 0; /低电平为写操作;同为低电平可以写入指令或显示地址 LCD_DATA <= 8'b0000_0001;/输入指令集,data_in_buf <=DATA_IN;state<=SETCGRAM;endSETCGRAM: begin /读写数据 LCD_RS<=0; LCD_RW <= 0; /同为低电平可以写入指令或显示地址 LCD_DATA <= 8'b1000_0000; state <= SETFUNCTION;endSETFUNCTION: begin /工作方式设置 LCD_RS<=0; LC
19、D_RW<=0; LCD_DATA7:5<=3'b001; LCD_DATA4<=DATAWIDTH8;/1 LCD_DATA3<=TWOLINE;/1 LCD_DATA2<=FONT5X10;/1 LCD_DATA1:0<=2'b00; state<=SWITCHMODE; end SWITCHMODE: begin /显示状态设置 LCD_RS<=0; LCD_RW<=0; LCD_DATA7:3<=5'b00001; LCD_DATA2<=OPEN_DISPLAY;/1 LCD_DATA1<=
20、OPEN_CUR;/0 LCD_DATA0<=BLANK_CUR;/0 state<=SETMODE;endSETMODE: begin /输入方式设置 LCD_RS<=0; LCD_RW<=0; LCD_DATA7:2<=6'b000001; LCD_DATA1<=CUR_INC; /1 LCD_DATA0<=CUR_NOSHIFT;/0 state<=WRITERAM; endRETURNCURSOR: begin /光标归位 LCD_RS<=0; LCD_RW<=0; LCD_DATA<=8'b0000_0
21、010; state<=WRITERAM; endSHIFT: begin /移位 LCD_RS<=1; /高电平为数据寄存器 LCD_RW<=0; /RS1,RW0,写入数据 LCD_DATA<=data_in_buf255:248; data_in_buf<=(data_in_buf<<8); disp_count<=disp_count+1'b1; state<=WRITERAM; endWRITERAM: begin /写RAM状态 LCD_RS<=1; LCD_RW<=0; /写入数据 if(disp_coun
22、t=32) begin LCD_RW<=1; disp_count<=4'b0; /xiugaizaizhe state<=CLEAR; end else if(disp_count=16) begin LCD_RS<=0; LCD_RW<=0;/写入指令或显示地址 LCD_DATA<=8'b1100_0000; state<=SHIFT; end else begin LCD_DATA<=data_in_buf255:248; data_in_buf<=(data_in_buf<<8); disp_count&
23、lt;=disp_count+1'b1; state<=WRITERAM; end end endcase endendmodule从网上了解到LCD输入信号只需在原输入信号的字符上加上双引号即可,转码模块如下:module change(in,out);input3:0 in;output reg 7:0out;always*begin case(in) 4'd0:out="0" default :out="?" endcaseendendmodule跑表模块(*)由于跑表不需要手动调节时间,所以每一位时间的时钟信号都是前一位的进
24、位信号,跑表模块如下:module paobiao(enable,CLOCK_50,KEY,fs0,fs1,s0,s1,minu0,minu1);input CLOCK_50;input KEY;input enable; /暂停使能信号output reg3:0 fs0; /百分秒个位reg fscarry0; /百分秒个位进位. wire zero; /暂停标志switch switchzero(CLOCK_50,KEY,zero);reg18:0 counter_100hz; /从50Mhz分频到100hz的计数器wire clk100;clk50mto100(CLOCK_50,clk1
25、00,state); /分频得到100hz的时钟parameter i0=1'b0,i1=1'b1;reg state,next_state;always (negedge clk100 or negedge zero ) /异步复位,s0为起始状态begin if(!zero) state<=i0; else state<=next_state;endalways(posedge clk100 or negedge zero) /百分秒个位进位 begin if(!zero) begin fs0<=0;fscarry0<=0; end else if(
26、clk100=1) begin if(fs0=9) begin fs0<=0;fscarry0<=1; end else begin fs0<=fs0+1'b1;fscarry0<=0; end end end秒分进位同上led ledfs0(fs0,1,HEX0);.最后调用led模块使跑表数值显示在七段管上;当按下KEY1后,取值显示在LCD显示屏上,SW0为1时将取出的值依次显示在LCD显示屏上,我们设计能存4个值(仅仅只是测试用,其实可以存更多的值),用寄存器save实现,代码如下:always (posedge clk_1hz) begin if(pa
27、obiao) begin if(!KEY1) begin /在LCD屏上显示跑表暂停时的时间 shuru<="Now Time:"," ",show5,show4,":",show3,show2,":",show1,show0; save<=save767:0,"Save Time:"," ",show5,show4,"-",show3,show2,"-",show1,show0; /寄存器移位存储 d<=1'
28、b0; end else if(SW0)/ 重复读取之前的数据(显示4个) begin shuru<=save1023:768; /读取寄存器最后一位(即最早存入的数据) e<=1'B1; save<=save767:0,save1023:768; /寄存器的值移位 d<=1'b0; end else begin d<=1'b1; e<=1'B0; end end else shuru<=LCD_show; end 闹铃模块(*)module alarm(ledr,clk50m,alarmon,alarmout,rese
29、t);input 1:0 alarmon;input clk50m;input reset;output reg alarmout;output reg ledr;reg 15:0 counter_1k;wire clk_1k; assign clk_1k= counter_1k15;always (posedge clk50m) begin if(counter_1k=50000) counter_1k<=0; else counter_1k<=counter_1k+1'b1; endendmodule 七段管显示模块(*)module led(datain,dotin,
30、ledout);/七段管显示always*begin case(datain) 0: dataout<=7'b1000000; 1: dataout<=7'b1111001; 2: dataout<=7'b0100100; 3: dataout<=7'b0110000; default: dataout<=7'b1000000; endcase end解码模块(*)module change(in,out);input3:0 in; output reg 7:0out;always*begin case(in) 4'
31、d0:out="0" 4'd1:out="1" 4'd2:out="2" . default :out="?" endcaseendendmodule防抖动模块(*)module switch(clk,keyin,keyout);/防抖动模块wire clk_use;input clk,keyin;output reg keyout;reg 7:0 counter;assign clk_use=counter7;always (posedge clk)counter<=counter+1
32、9;b1;always (posedge clk_use)keyout<=keyin;endmodule闹铃提醒及整点报时模块(*)module sound(clk50m,clkt5,clkt4,clkt3,clkt2,alarm3,alarm2,alarm1,alarm0,voice);/闹铃显示及整点报时模块always(posedge clk50m)begin if(clkt5=alarm3&&clkt4=alarm2&&clkt3=alarm1&&clkt2=alarm0) begin voice3<=c1; voice2&l
33、t;=c1; /跑马灯闪烁 end else if(clkt3=0&&clkt2=0) begin voice1<=c1; voice0<=c1; end/跑马灯闪烁 else voice<=2'b00; end endmodule 其中闹铃的优先级要高于整点报时功能闹铃设置时间模块(*)module bitsel(alarmmode,checkmode,sel,selcode,reset);/对时分秒的选择,并分成实在时钟或是闹铃模式下其中selcode是对时分秒的解码,决定自增信号的所在。always (posedge inc or negedge
34、 reset) if(sel=2'b10) begin if(hour1,hour0=8'h23) hour1,hour0<=8'h00; else if(hour0=9) begin hour0<=0;hour1=hour1+1'b1;end else hour0=hour0+1'b1; end else if(sel=2'b01) begin if(min1,min0=8'h59) min1,min0<=8'b00; else if(min0=4'h9) begin min0=4'h0;min
35、1=min1+4'h1; end else min0= min0+1'b1; end else hour1,hour0,min1,min0<=16'b0;.上述模块功能为调整闹钟的时间。日历模块(*)module date(SW,LEDG,inc,CLOCK_50,LCD_show,yy,mm,dd);/日期模块always (state or SW16)begin case (state) /对于年月日的选择 s0: begin if(SW16) next_state<=s1; /调整日 else next_state=s0; end s1:begin i
36、f(SW16) next_state<=s2; /调整月份 else next_state<=s1; end s2: begin if(SW16)next_state<=s0; / 调整年份 else next_state<=s2; end s3: begin if(SW16)next_state<=s0; /日期自增模块(依赖于小时时间进位) else next_state<=s3; end default: begin next_state<=s3;end endcaseend通过对SW16的触发切换状态 。其中在调整模式下调整不会有进位现象,而在
37、正常运行状态下日期级应该存在进位,所以必须存在两个不同的累加模式,即S0和S3 的区别。其中进位的产生如下:always (posedge clock_2)/小时到日期进位的产生beginif(clkt5=4'd2&&clkt4=4'd3&&clkt3=4'd5&&clkt2=4'd9&&clkt1=4'd5&&clkt0=4'd9) inc<=1;else inc<=0; end不使用1hz的信号是因为和在测试过程出现问题,产生的进位信号不能使得日期自增
38、,所以采用了较大频率的信号,这样能够使得进位信号触发日期内自增功能。分频模块(*)module clk50mto1(clock_in,clock_out);/分频信号always (posedge clock_in)begin if(i=24999999) begin clock_out<=clock_out; i<=0;end else i<=i+1;end因为在做之前的实习的过程中,发现如果是将i=25000000作为判断条件,会慢50MHz一个周期,然后累加下来会使得误差特别大,所以做了这个尝试,结果正好。通过做1hz和1/3600Hz的比较,发现如果将i=25000000作为判断条件误差很大,而后者误差很小。第3章系统功能测试模块测试:日历:当处于非调节模式时,日期能够正常进位,并且满足当月月份天数的条件。当处于调节模式时,能够正常调节,且无进位现象,能够循环调节。跑表:跑表能够在七段管上正常显示运行,暂停之后会把当时的数值传到LCD显示屏上显示。复位后能够归零。计时器:能够正常在七段管上显示,当切换状态时,提
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中国电信湖北潜江分公司招聘4人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电信吉林白山分公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度二人店铺合作监管合同:共同遵守法律法规确保合规经营2篇
- 2024“才聚齐鲁成就未来”山东省机场管理集团限公司夏季招聘32人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度智能家居定制合同定制内容与交付时间
- 《传统工业区和新兴》课件
- 《导航效果平台》课件
- 2024年度合作开发合同的订立与权益分配2篇
- 《mis数据仓库》课件
- 2024年度茶叶行业培训合同
- GB/T 43988-2024滑板课程学生运动能力测评规范
- 危险化学品安全技术说明书(MSDS)(包含常见34种)
- 智能云服务交付工程师认证考试题库(网大版)(浓缩500题)
- 四种形态课件
- DL-T5054-2016火力发电厂汽水管道设计规范
- 交响音乐赏析智慧树知到期末考试答案章节答案2024年西安交通大学
- 兽医产科学 知到智慧树网课答案
- 物理化学实验D智慧树知到期末考试答案章节答案2024年北京科技大学
- 计算机网络技术大学生职业生涯规划
- 走近湖湘红色人物智慧树知到期末考试答案2024年
- 兽医检验习题(附答案)
评论
0/150
提交评论