使用Verilog语言实现时间计数器

数字逻辑课程设计报告

课题名称 电子时钟设计
姓 名 周策
学 号 2018207129
专业班级 18级物联网一班
指导教师 巨春民

2019年 10月 25日

一、设计任务及要求:
设计任务:用Verilog HDL对CPLD芯片EPM240T100C5进行编程,并增加适当的电子元件,设计一个数字电子时钟电路

要求:
1.具有“时”“分”的数字显示功能,并可以进行时间校准
2.用发光二极管设计一个“表盘”,通过对应发光二极管的依次点亮来模拟表盘显示时间。

二、指导教师评语:

指导教师签名:
2019 年 月 日

三、成绩

2019 年 月 日

1 设计目的
1.进一步掌握数字电子技术的理论知识,培养工程设计能力和综合分析问题、解决问题的能力;
2.基本掌握常用电子电路的一般设计方法,提高电子电路的设计分析和实验能力;
3.掌握复杂可编程逻辑器件CPLD的原理及使用方法;
4.掌握Verilog HDL硬件描述语言的一般语法规则,学会设计方针CPLD器件,了解CPLD的烧写过程;
5.熟悉并学会选用电子元器件,为以后从事科研和生产工作打下一定的基础。
2 设计思路
2.1电路总体设计方案

2.2震荡电路

2.3控制电路
1.复位信号:系统初始化,并给时钟一个初始值,
零时零分零秒
2.时校准控制信号:校准小时计数
3.分校准控制信号:校准分钟计数
4.12/24小时计数切换控制信号
2.4时分秒计数器
1.秒计数器对秒脉冲计数,当计数至60时清零并产生分钟计数脉冲
2.分钟计数器对分钟计数脉冲计数,当计数至60时清零并产生小时计数脉冲。在分钟校准信号有效时对秒脉冲计数以实现分钟校时
3.小时计数器对小时计数脉冲计数,同时计数至12或24时清零。在小时校准信号有效时对秒脉冲进行计数以实现小时校时
2.5时分动态显示电路

2.6秒圆盘显示电路

3 设计过程
3.1时分动态显示位码产生程序:
assign w=4’b0001<<({q[9],q[8]});
3.秒圆盘显示译码程序:
assign
sh=8’b00000001<<(s[5:3]),
sl=~(8’b00000001<<(s[2:0]));
仿真截图及解释:
59秒的二进制是111011,sh是行矩阵,利用高三位,即111,再利用3-8译码器,为10000000,显示正确,sl是列矩阵,利用秒二进制的低三位,即011,再利用3-8译码器,为00001000,取反后为11110111,显示正确

3.3正常时分秒计时器程序
if(s6’d59)
begin
s<=6’d0;
if(m
6’d59)
begin
m<=6’d0;
if(hc5’d0)//24
begin
if(h
5’d23)
h<=5’d0;
else
h<=h+5’d1;
end
else
begin
if(h==5’d11)
h<=5’d0;
else
h<=h+5’d1;
end
end
else
m<=m+6’d1;
end
else
s<=s+6’d1;
endcase
仿真截图

小时变化
3.4带12/24小时切换功能的计时器程序
if(hc5’d0)//24
begin
if(h
5’d23)
h<=5’d0;
else
h<=h+5’d1;
end
else
begin
if(h==5’d11)
h<=5’d0;
else
h<=h+5’d1;
end

3.5带校时功能的计时器程序
case ({ch,cm})
2’b00://
begin
if(s6’d59)
begin
s<=6’d0;
if(m
6’d59)
m<=6’d0;
else
m<=m+6’d1;
end
else
s<=s+6’d1;
if(hc5’d0)//24
begin
if(h
5’d23)
h<=5’d0;
else
h<=h+5’d1;
end
else
begin//11
if(h==5’d11)
h<=5’d0;
else
h<=h+5’d1;
end

		end
		2'b01://hour
		begin
	    if(hc==5'd0)//24
		    begin
		       if(h==5'd23)
		       h<=5'd0;
		       else
		       h<=h+5'd1;
		    end
		 else
		   begin
		       if(h==5'd11)
				  h<=5'd0;
			   else
				 h<=h+5'd1;
		   end
		end
		2'b10://分钟校时
		begin
		if(m==6'd59)
		     m<=6'd0;
		   else
		   m<=m+6'd1;
		end  

3.6 将分和小时的计数输出分为十进制的十位和个位
assign
hh=h/5’d10,
hl=h%5’d10,
mh=m/6’d10,
ml=m%6’d10;
仿真截图:
显示正确

3.7将小时和分钟输出进行显示译码后与位码同步按照按照轮流显示的规则生成段码
case(w)
4’b0001:dd<={mld,1’b0};
4’b0010:dd<={mhd,1’b0};
4’b0100:dd<={hld,q[14]};
4’b1000:dd<={hhd,1’b0};
default dd<=8’b00000000;
endcase
3.8带复位功能并且对32768Hz震荡信号进行计数的时分秒计数程序
always @(posedge cp or negedge RST)
begin
if(RST0)
begin
q<=15’d0;
s<=6’d0;
m<=6’d0;
h<=5’d0;
end
else if(q<15’d32767) q<=q+15’d1;
else
begin
q<=15’d0;
case ({ch,cm})
2’b11:
//begin
if(s
6’d59)
begin
s<=6’d0;
if(m6’d59)
begin
m<=6’d0;
if(hc
5’d0)//24
begin
if(h5’d23)
h<=5’d0;
else
h<=h+5’d1;
end
else
begin
if(h
5’d11)
h<=5’d0;
else
h<=h+5’d1;
end
end
else
m<=m+6’d1;
end
else
s<=s+6’d1;
endcase
end

3.9最后综合验证程序(复位有效时,设初值为23:59:50)
if(RST==0)
begin
q<=15’d0;
s<=6’d55;
m<=6’d59;
h<=5’d23;
end
仿真截图

3.10最终烧写程序
module clock_Michael(RST,cp,ch,cm,hc,w,dd,sh,sl,pin_50,pin_51);//复位信号,32768,小时校时,分钟校时,进制转化,
input RST,cp,ch,cm,hc,pin_50,pin_51;
output wire [3:0]w;
output reg [7:0]dd;
output wire [7:0]sh,sl;
//output wire sp;
reg [5:0]s,m;
reg [4:0]h;
reg [14:0]q;
reg [6:0]hhd,hld,mhd,mld;
wire [1:0]hh;
wire [3:0]hl,ml;
wire [2:0]mh;//分钟高位
always @(posedge cp or negedge RST)
begin
if(RST0)
begin
q<=15’d0;
s<=6’d0;
m<=6’d0;
h<=5’d0;
end
else if(q<15’d32767) q<=q+15’d1;
else
begin
q<=15’d0;
case ({ch,cm})
2’b00://
begin
if(s
6’d59)
begin
s<=6’d0;
if(m6’d59)
m<=6’d0;
else
m<=m+6’d1;
end
else
s<=s+6’d1;
if(hc
5’d0)//24
begin
if(h5’d23)
h<=5’d0;
else
h<=h+5’d1;
end
else
begin//11
if(h
5’d11)
h<=5’d0;
else
h<=h+5’d1;
end

		end
		2'b01://hour
		begin
	    if(hc==5'd0)//24
		    begin
		       if(h==5'd23)
		       h<=5'd0;
		       else
		       h<=h+5'd1;
		    end
		 else
		   begin
		       if(h==5'd11)
				  h<=5'd0;
			   else
				 h<=h+5'd1;
		   end
		end
		2'b10://分钟校时
		begin
		if(m==6'd59)
		     m<=6'd0;
		   else
		   m<=m+6'd1;
		end  
		2'b11:
		//begin
		   if(s==6'd59)
		   begin
		     s<=6'd0;
		      if(m==6'd59)
		        begin
		        m<=6'd0;
		        if(hc==5'd0)//24
		        begin
		             if(h==5'd23)
					 h<=5'd0;
					else
					h<=h+5'd1;
				end
				else
				begin
				    if(h==5'd11)
				     h<=5'd0;
				    else
					h<=h+5'd1;
				end
			end
			else
			 m<=m+6'd1;	
		end		 
		else
		s<=s+6'd1;
		endcase
   end
       case(hh)
		4'b0000:
		hhd<=7'b0000000;
		4'b0001:
		hhd<=7'b0110000;
		4'b0010:
		hhd<=7'b1101101;
		default hhd<=7'b0000000;
		endcase
		case(hl)
		4'b0000:hld<=7'b1111110;
		4'b0001:hld<=7'b0110000;
		4'b0010:hld<=7'b1101101;
		4'b0011:hld<=7'b1111001;
		4'b0100:hld<=7'b0110011;
		4'b0101:hld<=7'b1011011;
		4'b0110:hld<=7'b1011111;
		4'b0111:hld<=7'b1110000;
		4'b1000:hld<=7'b1111111;
		4'b1001:hld<=7'b1110011;
		default hld<=7'b0000000;
		endcase
		case(ml)
		4'b0000:mld<=7'b1111110;
		4'b0001:mld<=7'b0110000;
		4'b0010:mld<=7'b1101101;
		4'b0011:mld<=7'b1111001;
		4'b0100:mld<=7'b0110011;
		4'b0101:mld<=7'b1011011;
		4'b0110:mld<=7'b1011111;
		4'b0111:mld<=7'b1110000;
		4'b1000:mld<=7'b1111111;
		4'b1001:mld<=7'b1110011;
		default mld<=7'b0000000;
		endcase
		case(mh)
		4'b0000:mhd<=7'b1111110;
		4'b0001:mhd<=7'b0110000;
		4'b0010:mhd<=7'b1101101;
		4'b0011:mhd<=7'b1111001;
		4'b0100:mhd<=7'b0110011;
		4'b0101:mhd<=7'b1011011;
		4'b0110:mhd<=7'b1011111;
		4'b0111:mhd<=7'b1110000;
		4'b1000:mhd<=7'b1111111;
		4'b1001:mhd<=7'b1110011;
		default mhd<=7'b0000000;
		endcase
		case(w)
		4'b0001:dd<={mld,1'b0};
		4'b0010:dd<={mhd,1'b0};
		4'b0100:dd<={hld,q[14]};
		4'b1000:dd<={hhd,1'b0};
		default dd<=8'b00000000;
		endcase

end
assign
hh=h/5’d10,
hl=h%5’d10,
mh=m/6’d10,
ml=m%6’d10;
assign w=4’b0001<<({q[9],q[8]});
assign
sh=8’b00000001<<(s[5:3]),
sl=~(8’b00000001<<(s[2:0]));
endmodule
3.11配置引脚

3.12程序烧写后运行结果

4 设计总结
4.1 实验中遇到的问题及解决方法
1。仿真不正确,仿真的波形图未保存就运行,导致仿真的图还是以前错误的,设置时间的间隔太大,看不到想要的结果。
2。verilog语言语法与c的语法有些不同,尤其是没有{},使用begin,end
有时候不匹配。
3。在设计秒矩阵时不太明白含义,后来在老师的指导下,明白了3-8译码器和秒矩阵的原理。
4。在真正显示时小时分钟的十位个位不是同时显示的,如何让它在人眼前看不出是一位在显示,需要一个位码来控制断码的显示解决了这个问题。在一秒钟内变换多次。
5。小时校时分钟校时的逻辑如何实现当时觉得难以理解
6。最后要烧录时原理图与真正的电路板之间的引脚匹配要对应正确。
4.2 设计体会
通过八周的课程,也是对verilog语言的一个入门,对Quartus的软件使用也有了一些了解。
这是第一次接触硬件,也是第一次把自己写的代码烧写到实物中让其运行实现各种功能。通过设计这么一个小小的计数器,对从代码实现,引脚匹配,到烧录整个流程都有了一个清晰的认识。老师循序渐进,对这个工程进行分解,一个功能一个功能的去实现,一个逻辑一个逻辑的进行讲解,最后再进行组合,使得对整个代码理解的比较透彻。这种方法非常好。
要注意有问题多思考,多与老师同学交流沟通,明白整个逻辑以后再用代码实现。

附 录

参考文献
阎石,《数字电子技术基础》,高等教育出版社,2016年
马义忠,《数字逻辑与数字系统》,高等教育出版社,2005年
康华光,《电子技术基础》(数字部分),高等教育出版社,2015年
白中英,《数字逻辑与数字系统》,科学出版社,2002年
D on ald E . T hom as, Ph ilip R .M oorby
《硬件描述语言Verilog》,清华大学出版社,2002年
《Verilog数字系统设计教程》第四版,北京航空航天大学出版社,夏宇闻,2017年

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值