12小时数字钟电路设计电子教案Word文档下载推荐.docx
《12小时数字钟电路设计电子教案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《12小时数字钟电路设计电子教案Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
COP2000集成开发环境是为………….
(2)EDA环境
•Xilinxfoundationf3.1设计软件
Xilinxfoundationf3.1是Xilinx公司的可编程期间………….
第2章详细设计方案
2.1算法与程序的设计与实现
(1)秒钟计时器
由于秒计数器为60进制计数器,所以以秒计数器作为示例说明其编程思想。
其中秒计数器模块在程序中为always@(posedgeclk)的程序段,由上面分析得秒计数器由一个十进制计数器与一个六进制计数器组成,程序中有second0表示秒计数器低位即10进制计数器,second1表示秒计数器的高位为一个六进制计数器。
clk为时钟信号,时钟周期1/60(S),当低位second0满10时,自动进一位,即second1自动进位。
Second0,second1位宽均为4位reg型变量。
(2)分钟钟计时器
分钟计时器由于秒计数器为12进制计数器,示例说明其编程思想。
其中秒计数器模块在程序中为always@(posedgemod)的程序段,由分析得小时计数器由一个二进制计数器与一个三进制计数器组成,程序中有hour0表示秒计数器低位即二进制计数器,hour1表示秒计数器的高位为一个三进制计数器。
Mod为时钟信号,来自分钟计时模块的mod,时钟周期360(S),当低位hour0满3时,自动进一位,即hour1自动进位。
hour1,hour1位宽均为4位reg型变量。
(3)小时计时器
小时计时器同秒钟计时器其中小时计数器模块在程序中为always@(posedgetun)的程序段,分钟计时器的低位、高位分别由minute0、minute1表示,但分钟计时器模块的敏感信号为“posedgetun”时钟信号,“tun”的产生自秒钟计时器,可知其产生的时钟信号为1(S),每触发一次则分钟计数器计数加1一次,同时产生mod的时钟信号,同时由于做的是12小时数字钟电路,所有zox表示的是显示上下午,当小时计数器满12时zox变化一次,其中zox=0表示的是上午,zox=1表示的是下午。
(4)时间设置
时间设置模块实现的功能为通过按键调节可以对当前时间进行手动控制。
其主要是在时间设置使能端有效地情况下通过SW1和i_SW2两个按键对数字钟的小时和分钟数进行调节。
Disp_drive为设置中的显示控制,即通过SW1对位的调整,Disp_drive随之变化。
i_SW2为对每一位上的数字在其范围内进行加1调节。
Disp_drive取值000、001、010和011分别对应hour1、hour0、minute1和minute0的设置,其中的加1设置在各个计时器模块,这样做的原因是防止两个“always”进程对同一个变量赋值发生错误。
(5)控制显示模块
控制显示模块在整个数字钟的设计中起着非常重要的作用。
它的作用是将时间等数据用数码管显示的控制和数据传输模块,包括数据的传输以及BCD码译码等。
通过几个控制使能端将其不同功能时的时间在数码管上显示出来。
本模块中端口定义比较多,下面是其所对应的功能。
clk:
时间自动模式工作使能信号;
Timeset_EN:
时间设置使能信号;
Time_disp_select:
时间显示位选信号;
Disp_select:
显示位选信号输出;
程序设计中,各使能端信号为1表示执行该功能,以时间自动工作模式使能信号有效为例说明,当Time_EN为1时,首先将时间显示位选信号isp_select的值赋给显示位选信号disp_select输出,定义time_disp_select的状态一共有6个,分别为100000、010000、001000、000100、000010和000001,其在各状态下分别依次表示将、hour0、hour1、minute0、minute1、second0和second1的值赋给data,用case语句来实现,其实现语句如下:
always@(clk,TimeSet_EN,time_disp_select,disp_select,hour1,hour0,
minute1,minute0,second1,second0)
begin//时钟,秒表显示
if((clk||TimeSet_EN)==1'
b1)
begin
disp_select<
=time_disp_select;
case(time_disp_select)
6'
b100000:
Data<
=hour1;
b010000:
=hour0;
b001000:
=minute1;
b000100:
=minute0;
b000010:
=second1;
b000001:
=second0;
default:
=4'
b0;
endcase
end
显示译码数据段主要程序如下:
case(Data)
4'
b0000:
disp_data<
=7'
b1111110;
b0001:
b0110000;
b0010:
b1101101;
b0011:
b1111001;
b0100:
b0110011;
b0101:
b1011011;
b0110:
b1011111;
b0111:
b1110000;
b1000:
b1111111;
b1001:
b1111011;
default:
显示译码程序说明了0到9十个数在7段数码管中所对应的值,在case语句里面最重要的是一定不能忘了default,否则仿真会发生所不希望看到的
结果。
下图13为闹钟设置使能有效时仿真结果。
2.2流程图的设计与实现
1.数字钟
2.12小时数字时钟整体
第3章程序调试与结果测试
3.1程序调试
1、Error(10170):
VerilogHDLsyntaxerrorata.v(65)neartext"
always"
;
expecting"
end"
忘记在begin之后加end结束语
2、Error(10161):
VerilogHDLerrorata.v(165):
object"
Dat"
isnotdeclared
在程序开始Dat忘记标记和定义
3、Error(10170):
VerilogHDLsyntaxerroratTime.v(49)neartext"
else"
endmodule"
程序后面没加"
4、Error(10170):
VerilogHDLsyntaxerroratTime.v(56)neartext"
<
="
."
oranidentifier
把“<
=”改为“=”
3.2程序测试及结果分析
1.
从图中可以看出当second0满1010即10时被置为0000,而second1加1,满足秒的低位满十进一位的设置。
2.
从图中可以看出,在第一个时钟周期内,时间显示位选信号time_disp_select的值为000000,此时应执行case语句的default,Data的值为0;
在第二个时钟周期内,time_disp_select的值为000001,此时对应其最后一种状态,将second0的值赋给Data,即Data的值为0110,从图中看,仿真结果正确,disp_data表示的是将当前数据译码显示之后七段数码管的显示,所以在第一个周期内值为1111110,表示值为0,与Data所表示的数对应。
依次类推,可将Data的值全部表示出来。
3.
从图中可以看出,当只有Timeset_EN:
时间设置使能信号有效时,其七段数码管显示结果,与数字钟自动工作使能端的区别为闹钟设置使能端有效时只需对hour0、hour1、minute0和minute1进行设置,由于其同样需要将值赋给disp_select,为了统一期间,其值也设为6位,其4个状态分别为100000、010000、001000和000100。
其他与自动工作模式相同。
参考文献
[1]张明.Verilog
HDL实用教程.成都:
电子科技大学出版社,1999
[2]齐洪喜,陆颖.VHDL电路设计[M].北京:
清华大学出版社,2004
[3]江国强,李哲英.EDA技术与应用[M].北京:
电子工业出版社,2004
[4]雷伏容.VHDL电路设计[M].北京:
清华大学出版社,2006
[5]曾繁泰,陈美金.VHDL程序设计[M].北京:
清华大学出版社,2000
[6]潘松,王国栋.VHDL实用教程.成都:
电子科技大学出版社,2000
[7]赵雅兴.FPGA原理、设计与应用.天津:
天津大学出版社,1998
[8]陈俊硕,刘景林,张金萍.基于FPGA的直流电机PWM控制器设计[J].微电机2009(10)
[9]卢杰,赖毅.VHDL与数字电路设计.北京:
科学出版社,2001
[10]张昌凡,龙永红,彭涛.可编程逻辑器件及VHDL设计技术.广州:
华南工学院出版社,2001
附录(源代码)
源代码:
///////////////////////////
`timescale1ns/1ns
Moduleaa(clk,TimeSet_EN,SW1,i_SW2,zox,disp_select,hour1,hour0,minute1,minute0,second1,second0);
inputclk;
inputTimeSet_EN;
//时间设置使能信号
inputSW1;
inputi_SW2;
outputzox;
//上下午指示模
output[5:
0]disp_select;
output[3:
0]hour1,hour0,minute1,minute0,second1,second0;
reg[7:
0]second,minute,hour;
regtun,mod,zox;
wirer_SW2;
reg[2:
0]disp_drive;
reg[6:
0]time_disp_select;
reg[3:
0]Data,hour1,hour0,minute1,minute0,second1,second0;
0]disp_data;
regmt,nt;
initial
tun=0;
mod=0;
zox=0;
hour=0;
minute=0;
second=0;
disp_drive=3'
b000;
assignr_SW2=i_SW2;
//////////////////////////////////////////////////////////////
//秒钟计时器
always@(posedgeclk)//上升沿触发
if(r_SW2==1'
if(disp_drive==3'
b110)
second<
=0;
tun<
elseif(second==8'
h59)
second<
tun<
=1;
elsebegin
if(second[3:
0]==9)
second[3:
0]<
second[7:
4]<
=second[7:
4]+1;
else
=second[3:
0]+1;
second1<
4];
second0<
0];
//分钟计时器
always@(posedgetun)//上升沿触发
case(disp_drive)
3'
b010:
begin//分的高位
if(minute[7:
5)
minute[7:
=minute[7:
4]+1;
else
end
3'
b011:
begin
if(minute[3:
9)
minute[3:
=minute[3:
else
end
default:
mod<
if(minute==8'
h59)
minute<
if(minute[3:
minute[3:
minute[7:
minute1<
minute0<
////////////////////////////////////////////////////////////////////////////////////////
//时钟计时器
always@(posedgemod)//上升沿触发
begin
b000:
if(hour[7:
4]==0)
hour[7:
=hour[7:
hour[7:
=0;
if(zox==0)
zox<
b001:
begin//小时的低位
if(hour[3:
1)
hour[3:
=hour[3:
0]+1;
if(hour==8'
h11)
hour<
if(zox==0)
elsezox<
hour[3:
=hour[3:
hour1<
=hour[7:
hour0<
//时间设置
always@(posedgeSW1)//手动设置使能
if(TimeSet_EN==1'
if(disp_drive<
3'
b101)
disp_drive<
=disp_drive+3'
b1;
else
=3'
end
//////////////////
//时钟显示
always@(clk,TimeSet_EN,time_disp_select,
disp_select,hour1,hour0,minute1,minute0,second1,second0)
if(clk||TimeSet_EN==1'
6'
case(Data)//显示数据译码
disp_data<
=7'
endmodule
课程设计总结:
通过这次设计,使我对Verilog数字系统设计这门课程有了更深入的理解。
Verilog数字系统是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强实践。
要想把设计做的更好,就要学会参考一定的资料,吸取别人的经验,让自己和别人的思想有机的结合起来,得出属于你自己的灵感。
程序的编写需要有耐心,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决。
再总体解决大的问题。
这样做起来不仅有条理也使问题得到了轻松的解决。
通过这次的设计我对于专业课的学习有了更加深刻的认识,以为现在学的知识用不上就加以怠慢,等到想用的时候却发现自己的学习原来是那么的不扎实。
以后努力学好每门专业课,让自己拥有更多的知识,才能解决更多的问题!
我在更加牢固、灵活地掌握了所学的专业知识的同时,大量学习了VHDL编程的相关知识,为日后深入研究数字系统设计技术打下了基础。
指导教师评语:
指导教师(签字):
年月日
课程设计成绩