verilog基于 DE2 的可调时钟设计

  • 格式:doc
  • 大小:17.41 MB
  • 文档页数:8

深圳大学实验报告课程名称:硬件描述语言与逻辑综合实验名称:基于DE2 的可调时钟设计学院:电子科学与技术班级:指导老师:报告人:学号:实验报告提交时间:2015. 11 .27一、实验目的熟悉Quartus II 软件的使用,熟悉DE2 学习板,掌握Verilog HDL 语言的基本编程。

二、实验内容编写verilog程序,实现普通时钟功能,并在Quartus II 上仿真,并下载到DE2 学习板上进行测试,从而达到在数码管上显示的实时可调时钟。

三、实验方法及思路(1)电子时钟的设计主要分三大部分1、BCD码转换为七段数码管显示2、27Mhz晶振转为1hz 时钟设计3、计数功能实现(2)电子时钟设计的整体思路先拆分为多个模块后整合,把整个时钟的功能分成三大模块进行设计,逐个完成相关功能,最后整合成为一个功能较完备的时钟,从而达实现一个完整时钟的设计。

四、实验步骤设计流程:Step1:设计分频器,将27Mhz的时钟分频为1hz的时钟module divider(one_second,reset,clk);//分频output one_second;input reset,clk;reg one_second;reg[23:0] cnt;always @(posedge clk)beginif (reset)begincnt<=0;one_second<=0;//alert_1k<=0;endelse if (cnt==13499999)begincnt<=0;one_second<=~one_second;endelsecnt<=cnt+1;endendmodule仿真时设置cnt==2时one_second才翻转,结果如下Step2:设计秒、分计时和小时计时module count60(qout,cout,data,load,cin,reset,clk);//分,秒计算output[7:0] qout;output cout;input[7:0] data;input load,cin,clk,reset;reg[7:0] qout;always @(posedge clk)beginif (reset) qout<=0;else if(!load) qout<=data;else if(data[7:4]>=5) qout[7:4]<=5;//输入数值超出时钟规则时,默认最大值else if(data[3:0]>=9) qout[3:0]<=9;else if(cin)beginif(qout[3:0]==9)beginqout[3:0]<=0;if (qout[7:4]==5) qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1;endelseqout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0;endmodule设置时钟输入仿真后结果module count24(qout,cout,data,load,cin,reset,clk);//小时计算output[7:0] qout;output cout;input[7:0] data;input load,cin,clk,reset;reg[7:0] qout;always @(posedge clk)beginif (reset) qout<=0;else if(!load) qout<=data;else if(data[7:4]>=2) qout[7:4]<=2; //输入数值超出时钟规则时,默认最大值else if(data[3:0]>=9) qout[3:0]<=9;else if(cin)beginif(qout[3:0]==3)beginif (qout[7:4]==2)beginqout[3:0]<=0;qout[7:4]<=0;endelseqout[3:0]<=qout[3:0]+1;endif(qout[3:0]==9)beginqout[3:0]<=0;qout[7:4]<=qout[7:4]+1;endelseqout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h23)&cin)?1:0;endmodule设置时钟输入仿真后结果Step3:在基本时钟功能上增加LED整点报时功能module alert(alertout1,clk,qout_min, qout_sec); //整点报时功能:产生整点报时信号input clk;input[7:0] qout_min, qout_sec;output alertout1;reg alertout1;always @(posedge clk)begin if((qout_min==8'h59)&&(qout_sec>=8'h57))alertout1<=1; //差三秒整点时LED报时else alertout1<=0;endendmodule在整点差3秒的时间内会输出高电平,否则输出低电平Step4:将BCD码转换输出为7段数码管显示module decode4_7(decodeout,indec);// 将BCD码转换输出为7段数码管显示output[6:0] decodeout;input[3:0] indec;reg[6:0] decodeout;always @(indec)begincase(indec)4'd0:decodeout=7'b0000001;4'd1:decodeout=7'b1001111;4'd2:decodeout=7'b0010010;4'd3:decodeout=7'b0000110;4'd4:decodeout=7'b1001100;4'd5:decodeout=7'b0100100;4'd6:decodeout=7'b0100000;4'd7:decodeout=7'b0001111;4'd8:decodeout=7'b0000000;4'd9:decodeout=7'b0000100;default: decodeout=7'bz;endcaseendendmoduleStep5:整合调用模块,实现电子时钟功能module clock(clk27M,clk,load_hour,load_min,load_sec,dechourH,dechourL,decminH,decminL,decsecH,decsecL,alertout,data,pause,reset,);//load置数,dec:(decodeout)译码输出,H为高,L为低input clk27M,load_hour,load_min,load_sec,reset,pause;input [7:0] data;//置数的高位和低位output [6:0] dechourH,dechourL,decminH,decminL,decsecH,decsecL;output clk,alertout;//整点报时输出wire [7:0] qout_hour,qout_min,qout_sec;wire clk, alertout ,min_to_hour,sec_to_min;divider divider_27M(clk,0,clk27M);count24 count_hour(qout_hour,,data,load_hour,min_to_hour,reset,clk);//计时count60 count_min(qout_min,min_to_hour,data,load_min,sec_to_min,reset,clk);//计分count60 count_sec(qout_sec,sec_to_min,data,load_sec,pause,reset,clk);//计秒decode4_7 hour2(dechourH,qout_hour[7:4]);//译码输出,将BCD码转换为7段数码管显示decode4_7 hour4(dechourL,qout_hour[3:0]);decode4_7 min6(decminH,qout_min[7:4]);decode4_7 min0(decminL,qout_min[3:0]);decode4_7 sec6(decsecH,qout_sec[7:4]);decode4_7 sec0(decsecL,qout_sec[3:0]);alert alertonehour(alertout,clk,qout_min,qout_sec);//整点报时endmodule五、实物展示烧写程序后初始状态:置数:设置小时为12:设置分钟为16分:设置秒为39秒:整点前3秒左下角LED报时:六、总结在该实验中,一开始找不到方向不知如何下手,后来通过查阅资料,参考《Verilog HDL 程序设计教程》,了解程序模块化的设计和整合基本方法,对“BCD 码转换为七段数码管显示”,“分频器的编写”和“计数器”三段程序的编写,了解程序模块化的设计和整合基本方法。

不断摸索和整合终于完成了整个电子时钟的实验,不仅使我对quartus II有了更深的了解,对硬件描述语言编程也更加熟练。