为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

数字时钟电路设计

2013-11-26 16页 doc 266KB 85阅读

用户头像

is_921959

暂无简介

举报
数字时钟电路设计 EDA课程设计报告 系别: 电子通信工程系 专业: 电子信息工程 姓名: 孙 进 宝 学号: 070608119 指导教师: 马 鹏 阁 张 松 炜 王 春 彦 目 录 1 任务书 1 2 设计方案 1 2.1 时钟电路 2 2.2 按键电路 3 2.3 显示电路 3 2.4 芯片EPM7064简介 4 2...
数字时钟电路设计
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 引脚配置 锁定后的管脚结果如下: Node Name Direction Location a13 Output PIN_2 b12 Output PIN_3 c9 Output Pin_4 clk Input PIN_28 clkdsp Input PIN_6 d10 Output PIN_7 e11 Output PIN_8 f8 Output PIN_11 g Output PIN_12 lamp[2] Output PIN_37 lamp[1] Output PIN_39 lamp[0] Output PIN_38 reset Input PIN_16 sel[2] Output PIN_19 sel[1] Output PIN_18 sel[0] Output PIN_17 setmsec Input PIN_20 setsec Input PIN_21 2.8 工程创建流程图 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 图10.软件设计流程图 结束 时间调整子模块 计时处理子模块 数码管动态扫描子模块 ERM706 芯片部分 数码管 显示部分 开关 控制部分 有源晶振 部分 秒信号产生子模块 按键消抖子模块 配置寄存器变量 定义输入输出 创建顶层模块 开始 用JTAG下载到硬件 图11.工程创建步骤设计流程图 结 束 执行程序指令 设置顶层实体 生成模块符号文件 编译程序 新建Verilog HDL源程序 开 始 创建工程 下载 电路部分
/
本文档为【数字时钟电路设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索