多功能数字钟设计实验报告XilinxEDABasys2华中科技大学HUST.doc

举报
资源描述
^` 多功能数字钟设计实验报告 院系:电子与通信工程学院 姓名:郭世康 班级:1301 学号:U201313639 指导教师:唐祖平 一、 实验目标 — 掌握可编程逻辑器件的应用开发技术 ——设计输入、编译、仿真和器件编程 — 熟悉EDA软件使用 — 掌握Verilog HDL设计方法 — 分模块、分层次数字系统设计 二、 实验内容要求 — 基本功能 — 能显示小时、分钟、秒钟(时、分用显示器,秒用LED) — 能调整小时、分钟的时间 — 提高要求 — 任意闹钟;(1分) — 小时为12/24进制可切换(1分) — 报正点数(几点钟LED闪烁几下)(1分) 三、 实验条件 Xilinx工程环境,win7操作系统,BASYS2实验板。 四、 实验设计 1.设计分析 数字钟大体上由2个60进制计数器,1个24进制计数器构成,中间有数据选择器进行连接。为实现提高功能,还需12进制计数和整点判断模块。下图为数字钟层次结构图。 2. 实验原理 振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,再经分频器输出标准秒脉冲。秒计数器计满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按24或12进制规律计数。计数器的输送译码显示电路,即可显示出数码(即时间)。计时出现误差时可以用校时电路进行校时和校分。小时显示(12\24)切换电路、仿电台报时、定时闹钟为扩展电路,只有在计时主体电路正常运行的情况下才能进行功能扩展。本实验采用Verilog HDL进行描述,然后用FPGA/CPLD实现,使用内部50MHz晶振作为时钟电路。 3. 逻辑设计 实现上述功能的Verilog HDL 程序如下。实现基本功能的程序分为两层次四个模块,底层有3个模块构成,即6进制计数器模块,10进制计数器模块和24进制计数器模块,顶层有一个模块,他调用底层的3个模块完成数字中的计时功能。 module timeclock(Hour,Minute,Second,CP,nCR,EN,Adj_Min,Adj_Hour,number,Light,clk,temp,change,AMTM,dingdong); output [7:0] Hour,Minute,Second; output [3:0] Light,temp; output [6:0] number; output clk,AMTM,dingdong;//clk为分频之后的时钟信号,频率为1Hz,AMTM为24进制转换12进制时表明上下午的变量,dingdong为整点报时时的闪烁信号。 input CP;//输入的时钟信号,需分频后才能正常使用。 input nCR;//清零 input EN,change;//EN为使能信号,change为12/24进制转换开关。 input Adj_Min;//校分控制 input Adj_Hour; //校时控制 wire [7:0] Hour,Minute,Second; reg clk; reg [29:0] count,count1;//分频需要的计数器 reg [1:0] scan;//扫描时需要的计数器 reg [3:0] Light,temp;//4Bit 变量Light代表四个数码管,temp表示数码管需要显示的数字 reg [6:0] number;//number代表7个发光二极管 reg clk1;//为分频后的扫描频率 supply1 Vdd; wire MinL_EN,MinH_EN,Hour_EN;//中间变量 // Hour,Minute,Second counter// //60进制秒计数器 counter10 U1(Second[3:0],nCR,EN,clk);//个位 counter6 U2(Second[7:4],nCR,(Second[3:0]==4h9),clk);//十位 //产生分钟计数器使能信号。Adj_Min=1,校正分钟;Adj_Min=0,分钟正常计时 assign MinL_EN=Adj_Min?Vdd:(Second==8h59); assign MinH_EN=(Adj_Min&&(Minute[3:0]==4h9))||((Minute[3:0]==4h9)&&(Second==8h59)); //60进制分钟计数器 counter10 U3(Minute[3:0],nCR,MinL_EN,clk); counter6 U4(Minute[7:4],nCR,MinH_EN,clk); //产生小时计数器使能信号。Adj_Hour=1,校正小时;Adj_Hour=0,小时正常计时 assign Hour_EN=Adj_Hour?Vdd:((Minute==8h59)&&(Second==8h59)); //24进制和12进制可切换的小时计数器 counter24 U5(Hour[7:4],Hour[3:0],nCR,Hour_EN,clk,change,AMTM); //整点报时模块 dingdong U6(clk,nCR,Minute[7:4],Minute[3:0],Hour[7:4],Hour[3:0],dingdong); //分频 always @(posedge CP) begin if(~nCR) count<=30d00; else if(count==30d25000000) begin count<=30d00; clk=~clk; end else count<=count+1b1; end //产生1Hz的频率 always @(posedge CP) begin if(~nCR) count1<=30d00; else if(count1==30d100000) begin count1<=30d00; clk1=~clk1; end else count1<=count1+1b1; end //产生扫描用的频率 //扫描计数器 always @(posedge clk1) begin if(~nCR) scan<=2b00; else if(scan==2b11) scan<=2b00; else scan<=scan+1b1; end //扫描 always @ (scan[1:0]) begin case(scan[1:0]) 2b00: Light<=4b0111; 2b01: Light<=4b1011; 2b10: Light<=4b1101; 2b11: Light<=4b1110; endcase end //显示数字 always @ (scan[1:0]) begin case(scan[1:0]) 2b00: temp<=Hour[7:4]; 2b01: temp<=Hour[3:0]; 2b10: temp<=Minute[7:4]; 2b11: temp<=Minute[3:0]; endcase end always @(temp) begin case(temp) 4d0:number<=7b0000001; //0 4d1:number<=7b1001111; //1 4d2:number<=7b0010010; //2 4d3:number<=7b0000110; //3 4d4:number<=7b1001100; //4 4d5:number<=7b0100100; //5 4d6:number<=7b0100000; //6 4d7:number<=7b0001111; //7 4d8:number<=7b0000000; //8 4d9:number<=7b0000100; //9 default:number<=7b0000001; endcase end endmodule module dingdong(clk,ncr,minuteh,minutel,hourh,hourl,dingdong); input ncr; input clk; input [3:0] minuteh,minutel; input [3:0] hourh,hourl; output reg dingdong; integer i=0; reg en; always@(posedge clk or negedge ncr) begin if(~ncr) begin dingdong<=0; end else if((minuteh==4d5)&&(minutel==4d9)) begin i=0; en<=1; end else if((i<(hourh*20+hourl*2))&&(en)) begin dingdong<=~dingdong; i=i+1; end else if(i==(hourh*20+hourl*2)) en<=0; else dingdong<=0; end endmodule module counter10(Q,nCR,EN,CP); output [3:0] Q; input CP; input nCR; input EN; reg [3:0] Q; always @(posedge CP or negedge nCR) begin if(~nCR) Q<=4b0000;//nCR=0,计数器被异步清零 else if(~EN) Q<=Q;//EN=0,暂停计数 else if(Q==4b1001) Q<=4b0000; else Q<=Q+1b1;//计数器增加1 end endmodule module counter6(Q,nCR,EN,CP); output [3:0] Q; input CP; input nCR; input EN; reg [3:0] Q; always @(posedge CP or negedge nCR) begin if(~nCR) Q<=4b0000; else if(~EN) Q<=Q; else if(Q==4b0101) Q<=4b0000; else Q<=Q+1b1; end endmodule module counter24(CntH,CntL,nCR,EN,CP,change,AMTM); output [3:0] CntH; output [3:0] CntL; output AMTM; input nCR; input EN; input CP,change; reg [3:0] CntH,CntL; reg AMTM; always @(posedge CP or negedge nCR) begin if(~nCR) {CntH,CntL}<=8h00;//清零 else if(change==0)//判断12或者24小时进制。change=0时为24进制,change=1时为12进制 begin AMTM<=0;//上下午显示关闭 if(~EN) {CntH,CntL}<={CntH,CntL};//暂停计数 else begin if((CntH>4b0010)||(CntL>4b1001)||((CntH==4b0010)&&(CntL>=4b0011))) {CntH,CntL}<=8h00; else if((CntH==4b0010)&&(CntL<4b0011)) begin CntH<=CntH; CntL<=CntL+1b1; end else if(CntL==4b1001) begin CntH<=CntH+1b1; CntL<=4b0000; end else begin CntH<=CntH; CntL<=CntL+1b1; end end end//24进制小时计数模块完成 else if(change==1)//进入12小时计数模块 begin if(CntH>=4b0001&&CntL>4b0010) begin CntH<=CntH-1b1; CntL<=CntL-2b10; AMTM<=1; end//AMTM=1.,表示为下午 else if(~EN) {CntH,CntL}<={CntH,CntL}; else begin if((CntH>4b0001)||(CntL>4b1001)||((CntH==4b0001)&&(CntL>=4b0010))) begin {CntH,CntL}<=8h01; AMTM<=~AMTM; end//完成一次12小时计数,AMTM翻转一次,表示上下午的转换 else if((CntH==4b0001)&&(CntL<4b0001)) begin CntH<=CntH; CntL<=CntL+1b1; end else if(CntL==4b1001) begin CntH<=CntH+1b1; CntL<=4b0000; end else begin CntH<=CntH; CntL<=CntL+1b1; end end end//12进制小时计数完成 end endmodule 4.仿真波形 Counter10: Counter6: Counter24: 24进制时: 12进制时: 总体波形: 注:number,temp等没有显示,change=0,即仿真波形为24进制。 五、 调试过程 1. 调试步骤 首先设置引脚接口,其代码如下: 引脚代码: NET "Light[0]" LOC = F12; NET "Light[1]" LOC = J12; NET "Light[2]" LOC = M13; NET "Light[3]" LOC = K14; NET "number[6]" LOC = L14; NET "number[5]" LOC = H12; NET "number[4]" LOC = N14; NET "number[3]" LOC = N11; NET "number[2]" LOC = P12; NET "number[1]" LOC = L13; NET "number[0]" LOC = M12; NET "Second[0]" LOC = M5; NET "CP" LOC = B8; NET "nCR" LOC = L3; NET "EN" LOC = P11; NET "Adj_Hour" LOC = B4; NET "Adj_Min" LOC = K3; NET "change" LOC = G3; NET "AMTM" LOC = M11; NET "dingdong" LOC = P7; 接着连接BASYS2实验板,将程序下载到板子上,观看结果。 2. 调试过程中遇到的问题及解决办法 在调试过程中,观察到四个数码管都显示为8,通过检查确定原因为扫描频率过高,将扫描频率降低,结果正常显示。 3. 实验结果 在BASYS2实验板上观察到时钟运行正常,清零功能以及暂停功能可以正确实现,可以正常校正时间以及切换12/24小时进制,整点报时功能也能正确实现。 六、 实验总结 本次实验需要使用Xilinx进行软件编译,通过这次实验,加深了对verilog语句的了解,了解了数字钟的工作原理以及对拓展功能如整点报时的原理。实验中几乎完全为软件编译代码,需要有一个非常准确的布局观念以及一个正确的流程认知,这就运用到了分层次设计的方法,这种方法对我们以后的硬件设计有着非常大的帮助。变异过程非常容易出错,所以要有耐心、细心以及毅力才能完成整个实验,正确进行仿真,然后下载软件到板子上进行结果观察。总而言之,通过这次试验我收获颇丰。
展开阅读全文
相关搜索
温馨提示:
taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

当前位置:首页 > 教育专区 > 教案示例


本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁