数字系统课程设计报告书基于FPGA的数字钟设计.doc_第1页
数字系统课程设计报告书基于FPGA的数字钟设计.doc_第2页
数字系统课程设计报告书基于FPGA的数字钟设计.doc_第3页
数字系统课程设计报告书基于FPGA的数字钟设计.doc_第4页
数字系统课程设计报告书基于FPGA的数字钟设计.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lmj数字系统课程设计报告书课题名称 基于FPGA的数字钟设计院 系姓名学号 专业班级指导教师设计时间目 录摘要11设计目的 22设计内容及要求23系统整体方案及设计原理 34各模块电路设计与实现 44.1 分频模块设计与实现4 4.1.1分频模块图 4.1.2分频模块程序4.2 计数器模块设计与实现5 4.2.1计数模块图 4.2.2秒计数器程序 4.2.3分计数器程序 4.2.4时计数器程序4.3 1602显示驱动模块设计与实现 10 4.3.1 1602显示驱动模块图 4.3.2 1602显示驱动模块程序5系统仿真及硬件下载 175.1系统仿真(步骤,总原理图,仿真图)17 5.1.1系统仿真步骤 5.1.2总原理图 5.1.3仿真图5.2硬件下载(引脚分配,下载步骤) 18 5.2.1引脚分配 5.2.2下载步骤6设计总结 21参考文献 21摘要随着微电子技术、计算机技术、半导体技术的发展,很多传统的数字门电路设计已经被可编程逻辑器件代替。而相对于传统的模拟控制技术,也被数字控制系统所代替。作为可编程逻辑器件的硬件描述语言Verilog HDL,由于它具有类似于通用C语言的风格,被不少FPGA开发者所推崇。在数字控制这个领域,FPGA的应用也越来越广泛,因此,作为硬件描述语言Verilog HDL就显示出了它的重要性。它是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级这三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述,覆盖面广,抽象能力强,因此在实际应用中越来越广泛。本设计为一个数字钟,一个具有“时”、“分”、“秒”显示的计时器,(23时59分59秒)。它采用EDA技术,以硬件描述语言Verilog 为系统逻辑描述手段设计文件,在QUARTUSII工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。关键词: 数字钟 硬件描述语言Verilog HDL FPGA1. 设计目的1.掌握利用EDA开发工具QUARTUSII进行可编程逻辑器件设计的方法; 2.掌握用FPGA进行计数器设计的方法;3.熟练掌握可编程逻辑器件的原理图输入层次化设计方法;4掌握利用QUARTUSII进行软件仿真及对可编程逻辑器件进行硬件下载的方法;5.进一步巩固所学的理论知识,提高运用所学知识分析和解决实际问题的能力。2.设计内容及要求1.设计一个具有“时”、“分”、“秒”显示的计时器,(23时59分59秒);2.“秒电路”、“分电路”均为0059的六十进制计数、译码、显示电路; 3.“时电路”为0023的二十四进制计数、译码、显示电路;4.该实验是基于FPGA的设计,采用Verilog HDL进行系统功能描述,采用自顶向下的设计方法,用QUARTUS软件进行仿真测试。3.系统整体方案及设计原理如下图(3.1)所示,该系统框图由6个模块组成,分别为:秒、分、时计数器模块,分频器模块(fp20m),计数器显示模块,1602显示驱动模块( lcd_1602_drive)。工作原理是:基准脉冲输入信号同时加到秒、分、时的脉冲输入端,采用并行计数的方式,秒的进位接到分的使能端上,分的进位接到时的使能端上,完成秒、分、时的循环计数。要求输入信号有1kHz1Hz时钟信号、低电平有效的调秒信号set_state、低电平有效的调分信号min_state、低电平有效的调时信号hour_state。图3.14.各模块电路设计与实现4.1 分频模块设计与实现4.1.1分频模块图 图(4.1)分频模块图4.1.2分频模块程序/输入频率:20MHz/输出频率:1Hz,1000Hzmodule fp20m(clk,clk1,clk4,clk1000,clk6m);input clk;output clk1,clk4,clk1000,clk6m;reg clk1,clk4,clk1000,clk6m;reg 25:0 cnt,cnt1,cnt2,cnt3;always(posedge clk) /1Hz分频beginif(cnt= 9999999 ) /从0到9999999总共10000000次begin cnt=0;clk1=clk1;/每10000000次翻转,周期为20000000次,也就是1Sendelse cnt=cnt+1;endalways(posedge clk) /1000Hz分频beginif(cnt1=9999) begin cnt1=0;clk1000=clk1000;endelse cnt1=cnt1+1;endalways(posedge clk) /1Hz分频beginif(cnt2= 1 ) /从0到9999999总共10000000次begin cnt2=0; clk6m=clk6m;/每10000000次翻转,周期为20000000次,也就是1Sendelse cnt2=cnt2+1;endalways(posedge clk) /1Hz分频beginif(cnt3 = 2499999 ) /从0到9999999总共10000000次begin cnt3=0;clk4=clk4;/每10000000次翻转,周期为20000000次,也就是1Sendelse cnt3=cnt3+1;endendmodule4.2 计数器模块设计与实现4.2.1计数模块图图(4.2)计数器模块图4.2.2秒计数器程序module sec_count (clk,sec_ten_c,/ 分钟的十位的进位信号sec_one_set,/小时的个位设置数sec_ten_set,/小时的十位设置数set_state,/设置状态,0的时候计数,1的时候置数sec_one,/小时的个位sec_ten);/小时的十位input clk;input set_state;input 3:0sec_one_set;input 3:0sec_ten_set;output 3:0sec_one;output 3:0sec_ten;output 3:0sec_ten_c;reg 3:0sec_one;reg 3:0sec_ten;reg 3:0sec_ten_c;reg temp;reg temp2;reg sec_one_c;initialbeginsec_one = 0 ;sec_ten = 0 ;endalways ( posedge clk)begintemp2 =set_state;if(temp2 != set_state & set_state = 0 )beginsec_one = (sec_ten_set*10+sec_one_set)%60)%10;/sec_ten = 8h59)beginsec_one = 0;sec_ten = 0;sec_ten_c = 8h58)beginsec_ten_c =1;endelsebeginsec_ten_c = 9)beginsec_one = 0;sec_ten = sec_ten + 1;endelse sec_one = sec_one + 1 ;endendendEndmodule4.2.3分计数器程序module min_count (clk, sec_ten_c, min_ten_c, / 分钟的十位的进位信号 min_one_set, /小时的个位设置数 min_ten_set, /小时的十位设置数 set_state, /设置状态,0的时候计数,1的时候置数 min_one, /小时的个位 min_ten); /小时的十位input clk;input set_state;input 3:0min_one_set;input 3:0min_ten_set;input 3:0sec_ten_c;output 3:0min_one;output 3:0min_ten;output 3:0min_ten_c;reg 3:0min_one;reg 3:0min_ten;reg 3:0min_ten_c;reg temp;reg temp2;reg min_one_c;initialbeginmin_one = 0 ;min_ten = 0 ;endalways ( posedge clk)begin temp2 =set_state; if(temp2 != set_state & set_state = 0 ) begin min_one = (min_ten_set*10+min_one_set)%60)%10; / min_ten = 8h59)beginmin_one = 0;min_ten = 0;min_ten_c = 8h58)beginmin_ten_c =1;endelsebegin min_ten_c = 9)beginmin_one = 0;min_ten = min_ten + 1;endelse min_one = min_one + 1 ;end endtemp = sec_ten_c;endEndmodule4.2.4时计数器程序module hour_count (clk, min_ten_c, / 分钟的十位的进位信号 hour_one_set, /小时的个位设置数 hour_ten_set, /小时的十位设置数 set_state, /设置状态,0的时候计数,1的时候置数 hour_one, /小时的个位 hour_ten); /小时的十位input clk;input set_state;input 3:0hour_one_set;input 3:0hour_ten_set;input 3:0min_ten_c;output 3:0hour_one;output 3:0hour_ten;reg 3:0hour_one;reg 3:0hour_ten;reg temp;reg temp2;reg hour_one_c;initialbeginhour_one = 0 ;hour_ten = 0 ;endalways ( posedge clk)begin temp2 =set_state; if(temp2 != set_state & set_state = 0 ) begin hour_one = (hour_ten_set*10+hour_one_set)%60)%10; / hour_ten = 8h23)beginhour_one = 0;hour_ten = 9)beginhour_one = 0;hour_ten = hour_ten + 1;endelse hour_one = hour_one + 1 ;end endtemp = min_ten_c;endendmodule4.3 1602显示驱动模块设计与实现4.3.1 1602显示驱动模块图 图(4.3)4.3.2 1602显示驱动模块程序module lcd_1602_drive(clk, /500Hz时钟set_state,second_one_set,second_ten_set,minute_one_set,minute_ten_set,hour_one_set,hour_ten_set,second_one,second_ten,minute_one,minute_ten,hour_one,hour_ten,rs,rw,en,data);input clk;input set_state;input 3:0 second_one_set,second_ten_set;input 3:0 minute_one_set,minute_ten_set;input 3:0 hour_one_set,hour_ten_set;input 3:0 second_one,second_ten;input 3:0 minute_one,minute_ten;input 3:0 hour_one,hour_ten;output rs,rw,en;reg rs,rw,en;output 7:0 data;reg 7:0 data; reg 7:0 seg1,seg2,next;reg 31:0 data_clock;reg 39:0 data_chars;reg 27:0 counter,counter1,counter2;reg 0:7 m10:0; wire31:0 data_clock1;wire31:0 set_clock;parameter chars=CLOCK;parameter state0= 8d0,camd0= 8d1,state1= 8d2,camd1= 8d3,state2= 8d4,camd2= 8d5,state3= 8d6,camd3= 8d7,state4= 8d8,camd4= 8d9,state5= 8d10,data0= 8d11,state6= 8d12,camd5= 8d13,state7= 8d14,data1= 8d15,state8= 8d16;initialbeginm0 =8b0011_0000;/字符“0”代码m1 =8b0011_0001;/字符“1”代码m2 =8b0011_0010;/字符“2”代码m3 =8b0011_0011;/字符“3”代码m4 =8b0011_0100;/字符“4”代码m5 =8b0011_0101;/字符“5”代码m6 =8b0011_0110;/字符“6”代码m7 =8b0011_0111;/字符“7”代码m8 =8b0011_1000;/字符“8”代码m9 =8b0011_1001;/字符“9”代码m10=8b0011_1010;/字符“:”代码 end Assigndata_clock1=hour_ten,hour_one,4d10,minute_ten,minute_one,4d10,second_ten,second_one; /8assign set_clock=hour_ten_set,hour_one_set,4d10,minute_ten_set,minute_one_set,4d10,second_ten_set,second_one_set; /8always(posedge clk)beginif(set_state=0)begincase(next)/ 初始化/*state0: begin rs=0; rw=0; data=8h38; en=1; next=camd0; /8位总线,显示2行 5*7 seg1=8b1000_0101; /第一行首地址 seg2=8b1100_0011; /第二行首地址 endcamd0: begin en=0; rw=1; next=state1; endstate1: begin rs=0; rw=0; data=8h0c; en=1; next=camd1; end /显示器打开,无光标,光标不闪烁camd1: begin en=0; rw=1; next=state2; endstate2: begin rs=0; rw=0; data=8h06; en=1; next=camd2; end /写入新数据光标右移,写入新数据后显示屏不移动camd2: begin en=0; rw=1; next=state3; endstate3: begin rs=0; rw=0; data=8h01; en=1; next=camd3; end /清屏camd3: begin en=0; rw=1; next=state4; end/*/ 第一行,显示CLOCK/*state4:beginrs=0;rw=0;data=seg1;en=1;next=camd4;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此处,设置让CLOCLK动态显示/else seg1=seg1-1b1;endcamd4:beginen=0;rw=1;next=state5;data_chars=chars;endstate5:beginrs=1;rw=0;data=data_chars39:32;en=1;next=data0;enddata0:beginif(counter1=5) begin next=state6;counter1=0;endelse begin en=0;rw=1;counter1=counter1+1; data_chars=(data_chars8);next=state5;endend/*/ 第二行显示,时间/*state6:beginrs=0;rw=0;data=seg2;en=1;next=camd5;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此处,设置让CLOCLK动态显示/else seg1=seg1-1b1;endcamd5:beginen=0;rw=1;next=state7;data_clock=data_clock1;endstate7:beginrs=1;rw=0;data=mdata_clock31:28;en=1;next=data1;enddata1:beginif(counter2=8) begin next=state8;counter2=0;endelse begin en=0;rw=1;counter2=counter2+1; data_clock=(data_clock4);next=state7;endend/*/ 延迟处理/*state8:beginif(counter=100) begin counter=0; next=state3;endelse counter=counter+1;end/*endcaseendif(set_state = 1)begincase(next)/ 初始化/*state0: begin rs=0; rw=0; data=8h38; en=1; next=camd0; /8位总线,显示2行 5*7 seg1=8b1000_0101; /第一行首地址 seg2=8b1100_0011; /第二行首地址 endcamd0: begin en=0; rw=1; next=state1; endstate1: begin rs=0; rw=0; data=8h0c; en=1; next=camd1; end /显示器打开,无光标,光标不闪烁camd1: begin en=0; rw=1; next=state2; endstate2: begin rs=0; rw=0; data=8h06; en=1; next=camd2; end /写入新数据光标右移,写入新数据后显示屏不移动camd2: begin en=0; rw=1; next=state3; endstate3: begin rs=0; rw=0; data=8h01; en=1; next=camd3; end /清屏camd3: begin en=0; rw=1; next=state4; end/*/ 第一行,显示CLOCK/*state4:beginrs=0;rw=0;data=seg1;en=1;next=camd4;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此处,设置让CLOCLK动态显示/else seg1=seg1-1b1;endcamd4:beginen=0;rw=1;next=state5;data_chars=chars;endstate5:beginrs=1;rw=0;data=data_chars39:32;en=1;next=data0;enddata0:beginif(counter1=5) begin next=state6;counter1=0;endelse begin en=0;rw=1;counter1=counter1+1; data_chars=(data_chars8);next=state5;endend/*/ 第二行显示,时间/*state6:beginrs=0;rw=0;data=seg2;en=1;next=camd5;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此处,设置让CLOCLK动态显示/else seg1=seg1-1b1;endcamd5:beginen=0;rw=1;next=state7;data_clock=set_clock;endstate7:beginrs=1;rw=0;data=mdata_clock31:28;en=1;next=data1;enddata1:beginif(counter2=8) begin next=state8;counter2=0;endelse begin en=0;rw=1;counter2=counter2+1; data_clock=(data_clock4);next=state7;endend/*/ 延迟处理/*state8:beginif(counter=100) begin counter=0; next=state3;endelse counter=counter+1;end/*endcaseendendEndmodule5. 系统仿真及硬件下载5.1系统仿真5.1.1系统仿真步骤(1)建立project项目,在软件主窗口单击File菜单后,单击New选项,选择Verilog HDL File选项。(2)单击OK进入空白的文本编辑区,进行文本编辑。(3)V文件名必须与模块名相同,将dff1.v文件设置为顶层文件,ProjectSet as Top-level Entity。(4)单击编译器快捷方式按钮,完成编译后,弹 出菜单报告错误和警告数目,并生成编译报告。(5)利用v文件生成原理图模块。在v文件编辑界面中,FileCreat/UpdateCreat Symbol Files for Curent File.(6)打开project 项目,新建波形仿真文件;在建立的波形文件左侧一栏中,点击鼠标右键,在弹出菜单中选择 Insert Node or Bus。(7)在出现的图中,选择Node Finder,将打开Node Finder 对话框,本试验对输入输出的管脚信号进行仿真,所以在Filter 中选择 Pins:all,点击List 按钮。(8)在图左栏中选择需要进行仿真的端口通过中间的按钮加入到右栏中,点击OK,端口加入到波形文件中。(8)选择一段波形,通过左边的设置工具条,给出需要的值,设置完成激励波形,保存。(9)设置为功能仿真:AssignmentTiming Analysis Settings-Simulator SettingsSimulation mode 选择Functional, 生成网络表ProcessingGenerate Functional Simulation Netlist;点击快捷按钮,开始仿真,完成后得到波形。5.1.2总原理图图(5.1)5.1.3仿真图图(5.2)5.2硬件下载5.2.1引脚分配(1)根据硬件接口设计,对芯片管脚进行绑定。选择Assignments菜单下Pins选项;(2)双击对应管脚后Location空白框,出现下拉菜单中选择要绑定的管脚, 图(5.3)5.2.2下载步骤(1)对目标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论