数字时钟电路设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA课程设计报告
系别:电子通信工程系
专业:电子信息工程
姓名:孙进宝
学号: 070608119
指导教师:马鹏阁
张松炜
王春彦
目录
1 任务书 (1)
2 设计方案 (1)
2.1 时钟电路 (2)
2.2 按键电路 (3)
2.3 显示电路 (3)
2.4 芯片EPM7064简介 (4)
2.5 JTAG接口电路 (4)
2.6 软件设计流程图 (5)
2.7 引脚配置 (6)
2.8 工程创建流程图 (7)
3 实验仪器 (8)
4 测试步骤 (8)
5 测设结果 (8)
6 遇到的问题和解决方法 (8)
7 总结 (9)
参考文献: (9)
附件一:电路图 (10)
附录二:源程序 (11)
基于EPM7064的数字时钟电路设计
1 任务书
1、设计一个数字时钟,4位数码管显示“分(2位)”,“秒(2位)”,带复位功能和暂停功能。
2、用中小规模集成电路组成电子钟;电源5V,系统时钟12MHz,带JTAG下载电路;
3.核心芯片Altera,EPM7064,PLCC44封装。
2 设计方案
本设计由石英晶体振荡器、分频器、计数器、译码器显示器和校时电路组成。
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。
秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位。
设计原理框图如下:
图1. 电路设计框图
此次设计的多功能数字钟主要有五部分组成:
(1)有源晶振部分:主要产生时钟频率为12MHZ的输入信号脉冲
(2)开关控制部分:主要实现数字钟的暂停、复位。
(3)EPM7064芯片部分:是整个数字钟的核心部分。
主要是程序写入以及对输入脉冲的接收与转换输出工作。
芯片采用ATERA EPM7064,PLCC44封装
(4)下载电路部分:使用JTAG下载电路
(5)数码管显示部分:4位数码管显示分(2位)、秒(2位)
2.1 时钟电路
晶体振荡器电路给数字钟提供一个品种稳定准确的方波信号,可保证数字钟的走私准确及稳定。
与晶振并联的电阻的作用——与晶振并联的电阻R17是反馈电阻,是为了保证反相器输入端的工作点电压在VDD/2,这样在振荡信号反馈在输入端时,能保证反相器工作在适当的工作区。
虽然去掉该电阻时,振荡电路仍工作了。
但是如果从示波器看振荡波形就会不一致了,而且可能会造成振荡电路因工作点不合适而停振。
所以千万不要省略此电阻。
这个电阻是为了使本来为逻辑反相器的器件工作在线性区,以获得增益,在饱和区是没有增益的,没有增益是无法振荡的。
如果用芯片中的反相器来作振荡,必须外接这个电阻,对于CMOS而言可以是1M以上,对于TTL则比较复杂,视不同类型(S,LS…)而定。
如果是芯片指定的晶振引脚,如在某些微处理器中,常常可以不加,因为芯片内部已经制作了,这两个电容(C7,C8)叫晶振的负载电容,分别接在晶振的两个脚上和对地的电容,一般在几十皮法。
它会影响到晶振的谐振频率和输出幅度,一般订购晶振时候供货方会问你负载电容是多少。
晶振的负载电容=[(Cd*Cg)/(Cd+Cg)]+Cic+△C式中Cd,Cg为分别接在晶振的两个脚上和对地的电容,Cic(集成电路内部电容)+△C(PCB上电容)经验值为3至5pf。
这两个电容串联的值是并联在谐振回路上的,会影响振荡频率。
当两个电容量相等时,反馈系数是0.5,一般是可以满足振荡条件的,但如果不易起振或振荡不稳定可以减小输入端对地电容量,而增加输出端的值以提高反馈量。
图2. 晶振电路
2.2 按键电路
按键电路为了实现该设计的基本功能,通过按键电路实现计数时钟的的开启和暂停功能。
图3.按键电路
2.3 显示电路
在应用数码管显示时,首先需要考虑的问题就是驱动电流,与发光二极管相同,数码管的发光段也需要串联限流电阻,共阳极数码管为例,串联的限流阻值越大,电流越小,亮度越低;电阻值越小,电流越大,亮度越高。
在使用限流电阻时需要在每一段线上都串联限流电阻,而不要在公共端上串联电阻,如果只是在公共端上串联一个限流电阻,则显示不同数字是,将会造成数码管亮度的不同。
在动态显示时,每个数码管的断连线是对应连接在一起的,同时由于数码管不存在同时点亮状态,所以只需在段连线的引出端上串联限流电阻即可。
图7. 数码管驱动电路
图8.数码管驱动电路
2.4 芯片EPM7064简介
CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件,是从PAL和GAL器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路范围。
是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。
其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统.本文采用ALTERA公司的MAX7000s,它是基于第二代MAX结构的高精度、高性能、在系统中可编程的CPLD芯片,采用CMOS技术加工而成,内含电可擦除只读存储器,可提供600~5000个可用选通引脚、ISP、速度仅有5ns的延迟以及频率可达175.4MHZ的高速计数器。
2.5 JTAG接口电路
JTAG接口是一个业界标准,主要用于芯片测试和配置等功能,使用IEEE Std 1149.1联合边界扫描接口引脚。
JTAG最初用于芯片功能的测试,其工作原理是在器件内部定义一个测试访问端口(Test Access Port,TAP),通过专用的JTAG测试工具对内部节点进行测试和调试。
TAP是一个通用的端口,外部控制器通过TAP可以访问芯片提供的所有数据寄存器和指令寄存器。
现在JTAG接口还常用于芯片的在线配置,对PLD、Flash等器件进行配置。
为了完成系统的调试,任何原型系统都支持JTAG配置方式,因而JTAG配置也就成为最广泛支持的配置方式。
不同厂商和不同型号的绝大部分FPGA芯片都支持JTAG配置方式。
在Altera公司的FPGA芯片中,JTAG配置方式比其他任何一种配置方式的优先级都高。
JTAG 允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,实现对各个器件分别测试和配置。
JTAG接口由4个必需的信号TDI、TD0、TMS和TCK,以及1个可选信号TRST构成。
图9.JTAG接口电路
2.6 软件设计流程图
2.7 引脚配置
锁定后的管脚结果如下:
图10.软件设计流程图
2.8 工程创建流程图
图11.工程创建步骤设计流程图
3 实验仪器
本实验用到的实验仪器是3.3V稳压供电电源、PC机、JTAG下载线,以及基于FPGA的Altera公司的实验开发试验箱。
焊电路板时还需要电烙铁、焊锡、镊子等。
4 测试步骤
将元件按照电路板上的位置一个个进行安放与焊接,这个工作尤其要认真不能有丝毫的马虎,特别是需要区分正负极的元件。
我们的焊接工作比较顺利,焊好之后能够顺利的进行程序的下载,但焊出的板子还是有点小小的瑕疵,需要在以后多加注意。
本次课程设计的程序在Quartus II软件中的调试工作不像预期中的那么顺利,但是经过老师的指导及各位同学的不断探讨还是成功了。
通过程序的调试工作是我们对Verilog 语言有更进一步的认识,对Quartus II软件的使用也更加熟悉。
电路板的调试工作也是比较顺利的,经过万用表测试没有问题后,我们便把程序下载进电路板,电路板正常的显示了分与秒,按下按键正常实现了暂停与复位功能。
5 测设结果
给焊好的电路板供3.3V的电压,然后通过JTAG接口用PC机给EPM7064的电路主芯片下载程序,看电路板芯片是否正常工作,时钟是否能正确显示,暂停、复位等功能是否能用。
经测试,本电路不能正常通过JTAG接口下载程序,但是在其他电路板上下载好程序的芯片,在本电路板上能正常工作,且能实现暂停、复位功能。
6 遇到的问题和解决方法
焊接时,由于三极管的管脚距离太近,焊接时很容易管脚发生连焊,于是我们通过把电烙铁侧拿、只用一个角与三极管和焊锡接触,以此来避免出现管脚相连的现象发生。
焊好后,JTAG接口无法正常下载程序(经检查,是当时焊接时,烙铁温度过高,导致一个管脚的焊盘脱落,不导电所致),于是通过先把芯片放在别人的能下载的电路板上下载程序,然后再
放到我们的电路板上,结果表明:下载好程序的芯片放在本电路上,能够正常工作。
7 总结
经过几天努力,终于完成了我们的课程设计,虽然没有那么完美,但从心底里说,还是高兴的,毕竟这次设计终于得以完成,但是高兴之余不得不深思呀!
我们由衷感谢老师提供给我们这样一个锻炼自己的机会,让我们第一次感受到学来的知识不只是用来完成试卷的。
在完成课程设计的过程中体会到团队合作的乐趣。
一向惯于“独立思考”的我们学会了积极的同团队成员交流,取长补短,共同进步。
“独学而无友则孤陋而寡闻”,只有和同学多交流多学习才能不断的提高自身水平。
最重要的一点,我们学会了一种快速有效的学习方法。
以往的学习都是老师讲学生记,不懂得地方就靠解答大量习题帮助记忆,学习的主要目的是通过最后的考试。
课程设计使我们发现考试真的并不是最重要,最重要的是能运用所学的知识。
在整个课程的学习过程中,我们突破了传统学习模式,把被动接受转变为主动学习。
不再是用学到的知识解题,而是在实际运用时遇到什么学什么,重在把知识应用于实际。
从这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,实践是检验真理的唯一标准。
我们电子专业的学习更是如此,不仅要有丰富的理论知识,还要有很强的动手能力,只有理论与实践并重,我们的专业水平才能提高,这就是我在这次课程设计中的最大收获。
另外感谢老师给我们辅导课程设计,我想有了这次课程设计,我们以后做毕业设计会变的得心应手,不会无从下手。
参考文献
【1】潘松,黄继业·EDA技术实用教程·科学出版社·2006年9月第三版
【2】杨乐平,李海涛,肖相生,等·程序设计与应用第2版[M].北京:电子工业出版社.2005.【3】马淑华,高原·《电子设计自动化》·北京邮电大学出版社·2006
附件一:电路图
附录二:源程序
module clock(clk,key,dig,seg); //模块名clock
input clk; //输入时钟
input[1:0] key; //输入按键
output[3:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚
reg[7:0] seg_r; //定义数码管输出寄存器
reg[3:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器
reg[22:0]count; //定义计数寄存器
reg[15:0]hour; //定义现在时刻寄存器
reg sec,keyen; //定义标志位
reg[1:0]dout1,dout2,dout3; //寄存器
wire[1:0]key_done; //按键消抖输出
assign dig = dig_r; //输出数码管选择
assign seg = seg_r; //输出数码管译码结果
//秒信号产生部分
always @(posedge clk) //定义clock上升沿触发begin
count = count + 1'b1;
if(count == 23'd6000000) //0.5S到了吗?
begin
count = 23'd0; //计数器清零
sec = ~sec; //置位秒标志end
end
//按键消抖处理部分
assign key_done = (dout1 | dout2 | dout3); //按键消抖输出
always @(posedge count[17])
begin
dout1 <= key;
dout2 <= dout1;
dout3 <= dout2;
end
always @(negedge key_done[0])
begin
keyen = ~keyen; //将琴键开关转换为乒乓开关
end
//数码管动态扫描显示部分
always @(posedge clk) //count[17:15]大约1ms改变一次
begin
case(count[17:15]) //选择扫描显示数据
3'd0:disp_dat = hour[3:0]; //秒个位
3'd1:disp_dat = hour[7:4]; //秒十位
// 3'd2:disp_dat = 4'ha; //显示"-"
3'd2:disp_dat = hour[11:8]; //分个位
3'd3:disp_dat = hour[15:12]; //分十位
// 3'd5:disp_dat = 4'ha; 显示"-"
// 3'd6:disp_dat = hour[19:16]; 时个位
// 3'd7:disp_dat = hour[23:20]; 时十位endcase
case(count[17:15]) //选择数码管显示位
3'd0:dig_r = 4'b1110; //选择第一个数码管显示
3'd1:dig_r = 4'b1101; //选择第二个数码管显示
3'd2:dig_r = 4'b1011; //选择第三个数码管显示
3'd3:dig_r = 4'b0111; //选择第四个数码管显示
// 3'd4:dig_r = 4'b1111; //选择第五个数码管显示
// 3'd5:dig_r = 8'b11011111; //选择第六个数码管显示
// 3'd6:dig_r = 8'b10111111; //选择第七个数码管显示
// 3'd7:dig_r = 8'b01111111; //选择第八个数码管显示endcase
end
always @(posedge clk)
begin
case(disp_dat)
4'h0:seg_r = 8'hc0; //显示0
4'h1:seg_r = 8'hf9; //显示1
4'h2:seg_r = 8'ha4; //显示2
4'h3:seg_r = 8'hb0; //显示3
4'h4:seg_r = 8'h99; //显示4
4'h5:seg_r = 8'h92; //显示5
4'h6:seg_r = 8'h82; //显示6
4'h7:seg_r = 8'hf8; //显示7
4'h8:seg_r = 8'h80; //显示8
4'h9:seg_r = 8'h90; //显示9
//4'ha:seg_r = 8'hbf; //显示-
default:seg_r = 8'hff; //不显示
endcase
// if((count[17:15]== 3'd2)&sec)
// seg_r = 8'hff;
end
//计时处理部分
always @(negedge sec or negedge key_done[1])//计时处理
begin
if(!key_done[1]) //是清零键吗?
begin
hour = 23'h0; //是,则清零end
else if(!keyen)
begin
hour[3:0] = hour[3:0] + 1'b1; //秒加1
if(hour[3:0] == 4'ha)
begin
hour[3:0] = 4'h0;
hour[7:4] = hour[7:4] + 1'b1; //秒的十位加一
if(hour[7:4] == 4'h6)
begin
hour[7:4] = 4'h0;
hour[11:8] = hour[11:8] + 1'b1;//分个位加一
if(hour[11:8] == 4'ha)
begin
hour[11:8] = 4'h0;
hour[15:12] = hour[15:12] + 1'b1;//分十位加一
end
end
end
end
end
endmodule。