EDA技术课程设计报告Word格式文档下载.docx
《EDA技术课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EDA技术课程设计报告Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
![EDA技术课程设计报告Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/ec52aff5-f361-499c-9adb-41bee6e6e4fd/ec52aff5-f361-499c-9adb-41bee6e6e4fd1.gif)
本次课程设计要求利用EDA技术,设计一个数码管显示数字钟的样品,数字钟要求具备以下功能:
第2章电路原理
数码管显示数字钟设计,运用到8位数码管,要求其中6位数码管动态显示,分别显示时、分、秒的计数,同时对时间进行设置,数字钟的总体功能按照要求可以分为基本的数字时钟显示(具有时、分、秒,计数显示功能,以24小时循环计时)、手动校准(具有清零,调节小时、分钟功能)、整点报时、LED灯花样显示四大部分。
其总体功能设计框图如图2.1所示:
第3章程序设计
其中,“时钟分频模块”用于对芯片晶振提供的时钟信号进行分频,然后给其他模块分配需要的时钟频率。
按键输入的信号经过按键去抖后传送给“时钟计数模块”。
正常计数时,“时钟计数模块”将处理好的时、分、秒数据实时传送给“数码管显示模块”,当有来自“按键驱动模块”的信号时,改变相应的时、分、秒计数器中的值,实现调整时间的作用。
“数码管显示模块”实时将“时钟计数模块”的数据转换成数码管动态显示信号进行显示。
最后,加上一个“整点报时”模块和“LED灯花样显示模块”经过时钟分频信号,传递给“数码管显示模块”,实现所需功能。
数字钟设计原理如图3.1所示:
3.1顶层模块设计
顶层模块设计如附录图3所示,其RTL电路图如附录图4所示。
顶层模块包含四个输入:
系统时钟输入“clk”,秒设置信号“sset”,分钟设置信号“mmset”,小时设置信号“hset”。
一个8位的段选数码管显示值输出“seg”,一个8位的片选数码管显示哪一个数码管输出“dig”,将输出给数码管进行动态显示。
“时钟分频模块”电路符号名为“int_div”,“按键驱动模块”电路符号名慰“an_jian”,“时钟计数模块”内部采用三格计数器级联的方式分别驱动时、分、秒计数,秒计数器和分计数器均为60进制计数器,小时计数器为24进制计数器,电路符号名分别为两个“ji_shu_60”和一个“ji_shu_24”。
3.2时钟分频模块设计
“时钟分频模块”直接使用老师上课所给的分频程序,加入两个分频模块,及“时钟计数模块”和“按键驱动模块”进行连接。
3.3按键驱动模块设计
按键驱动模块使用原理图方法设计,采用在按键信号传输过程中串联触发器实现按键去抖,保证触发器两次触发的间隔远大于按键抖动的时间,而远小于人动作反应的时间。
另外因为实例用独立按键按下后是低电平,所以在触发器后面串联一个非门,使其变为高电平有效。
附录图1所示为按键驱动模块原理图,图3.2所示为按键驱动模块封装而成的电路元件。
该模块包括四个输入,时钟信号clk,秒设置输入s_in,分钟设置输入m_in,小时设置输入h_in;
三个输出,秒设置输出s_out,分钟设置输出m_out,小时设置输出h_out。
从该模块的原理图可以看出,时、分、秒三个按键的去抖原理完全一样,这里提取小时输入和输出进行仿真验证,得到的结果如图4.1所示,每一个时钟上升沿h_out的值都保持和h_in的值相反,该设计能够达到预期设计要求。
3.4时钟计数模块设计
如附录图2所示。
“时钟计数模块”内部采用三个计数器级联的方式分别驱动时、分、秒计数,秒计数器和分钟计数器均为60进制计数器,小时计数器为24进制计数器,为方便驱动数码管,三个计数器的输出均为两位的十进制数据。
秒调整信号通过一个或门和秒进位信号一起驱动分钟计数器;
小时调整和分钟调整同理。
60进制计数器主要VerilogHDL代码如下:
begin
if(!
rst)//0
begin
q1<
=0;
q2<
end
else
beginq1[3:
0]=q1[3:
0]+1;
co<
if(q1[3:
0]>
9)beginq1[3:
0]=0;
q2[3:
0]=q2[3:
if(q2[3:
5)beginq2[3:
=1;
end
end
elseq1=q1;
24进制计数器主要VerilogHDL代码如下:
co=0;
q1[3:
if(q1==4)if(q2==2)beginq1=0;
q2=0;
如图4.2所示该模块中60进制模块及24进制模块的仿真波形,60进制模块设置qs0、qs1分别为个位、十位,个位计数到9之后清零,十位计数到5之后清零,24进制模块设置qh0、qh1分别为个位、十位,个位计数到9之后清零,十位计数到2之后清零。
3.5整点报时模块
整点报时模块的设计思路是当数字钟计数到一个整点时间时,蜂鸣器开始响鸣。
蜂鸣器的封装设计如图3.3所示,程序设计为一段乐谱,主要VerilogHDL代码如下:
always@(posedgeclk_4Hz)
begin
case(j)
'
d1:
origin='
d4916;
//low
d2:
d6168;
d3:
d7281;
d4:
d7791;
d5:
d8730;
d6:
d9565;
d7:
d10310;
d8:
d010647;
//middle
d9:
d011272;
d10:
d011831;
d11:
d012087;
d12:
d012556;
d13:
d012974;
d14:
d013346;
d15:
d13516;
//high
d16:
d13829;
d17:
d14108;
d18:
d11535;
d19:
d14470;
d20:
d14678;
d21:
d14864;
default:
d011111;
endcase
always@(posedgeclk_4Hz)//乐谱
begin
if(len==63)
len=0;
len=len+1;
case(len)
0:
j=3;
1:
2:
3:
4:
j=5;
5:
6:
7:
j=6;
8:
j=8;
9:
10:
11:
12:
13:
14:
15:
j=12;
16:
17:
18:
j=15;
19:
20:
21:
22:
23:
j=9;
24:
25:
26:
j=927:
28:
29:
30:
31:
32:
33:
34:
j=10;
35:
j=7;
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
endcase
3.6LED灯花样显示模块
LED灯花样显示模块是及整点报时模块同时工作,当蜂鸣器响鸣时LED灯闪烁。
该模块设计思路较为简单,只需在时分秒的时钟输出端接入一个以低电平驱动的LED邓即可实现。
3.7数码管显示模块设计
数码管动态显示的原理是利用人眼的视觉停留,依次点亮每个数码管的位选信号,当第一个数码管被点亮时,将段选信号变为第一个数码管要显示的信息,当第二个数码管被点亮时,将段选信号变为第二个数码管要显示的信息,以此类推,循环扫描。
当循环扫描一次所有数码管所用的时间在人眼能反应出图像变化的时间(约为0.02秒)之内时,人自然就会在视觉上看到完整的图像,而不会感到闪烁。
“数码管显示模块”的作用就是将6位10进制的时间数据BCD码转化成供数码管动态显示的位选和段选数据。
该模块在VerilogHDL语言描述下的主要段落如下:
always@(posedgeclk_1k)
case(count)//选择扫描显示数据
3'
d0:
disp_dat=d0;
//第一个数码管
disp_dat=d1;
//第二个数码管
disp_dat=4'
hf;
//第三个数码管
disp_dat=d2;
//第四个数码管
disp_dat=d3;
//第五个数码管
//第六个数码管
disp_dat=d4;
//d[7:
4];
//第七个数码管
disp_dat=d5;
//d[3:
0];
//第八个数码管
endcase
case(count)//选择数码管显示位
dig_r=8'
b01111111;
//选择第一个数码管显示
b10111111;
//选择第二个数码管显示
b11011111;
//选择第三个数码管显示
b11101111;
//选择第四个数码管显示
b11110111;
//选择第五个数码管显示
b11111011;
//选择第六个数码管显示
b11111101;
//选择第七个数码管显示
b11111110;
//选择第八个数码管显示
如图3.4所示是“数码管显示模块”的封装图,输入包括时钟信号“clk”,复位信号“clr”;
数码管显示数据BCD码输入,由低位到高位依次为“d0”、“d1”、“d2”、“d3”、“d4”、“d5”。
输出包括:
一个8位的段选数码管显示值输出“seg”,一个8位的片选数码管显示哪一个数码管输出“dig”。
第4章调试、测试分析及结果
4.1调试
调试使用的是睿智FPGA开发板,开发板采用核心板及接口板分离的方式,核心板上除FPGA,各类存储器以及用户扩展PACK外,还有按键、LED及电源插座等。
因为有用户扩展PACK,核心板完全可以脱离接口板而单独使用,通过PACK,用于自己的设计或电子设计大赛,扩展性很好。
接口板上集成了最常用和最经典外围接口,所有的外设经过精心分配及设计,不需要进行任何跳线设置,实验时非常方便!
总之,睿智开发板是完全站在用户的角度精心设计开发,简约不简单!
同时,睿智FPGA开发板的配套光盘提供相当丰富的实验代码及各种参考文献。
4.2测试分析
按键驱动模块波形仿真分析:
时、分、秒三个按键的去抖原理完全一样,这里提取小时输入和输出进行波形仿真验证,每一个时钟上升沿h_out的值都保持和h_in的值相反,该设计能够达到预期设计要求。
按键所绑的开关在开发板上是S1、S2、S3,分别控制小时进位、分钟进位、秒清零。
60进制和24进制模块(时、分、秒模块)波形仿真分析:
这里提取60进制模块及24进制模块的仿真波形,60进制模块设置qs0、qs1分别为个位、十位,个位计数到9之后清零,十位计数到5之后清零,24进制模块设置qh0、qh1分别为个位、十位,个位计数到9之后清零,十位计数到2之后清零。
该设计能够达到预期设计效果。
4.3
结果
图4.6整点报时,蜂鸣器响1minute
图4.5按下S1,小时进位,LED3亮
第5章小结
在此次课程设计中,遇到的问题主要有以下几个方面:
(1)由于VerilogHDL这门语言对自己来说属于一个从未接触过的东西,所以学习起来比较困难。
此次课程设计选择的课题是数码管显示数字钟,开始是资料的搜集及设计思路的理清,再有了一定的基础之后,开始对整个大的模块进行分模块分析设计。
(2)在实验的过程中,遇到了许多的问题,首先发现自己对软件的运用上存在的一些问题,如刚开始的时候没有生成功能网表,导致最后运行出错;
还有没有选功能仿真的时候,波形出现了一些毛刺和延时。
(3)设计60进制计数器和24进制计数器也发生了一些问题,原本的设计思路是将个位数字及十位数字分别拆开,用进位信号控制输出,但发现在连接蜂鸣器模块时,进位信号延时太短,导致秒计数器计数计到59以后分钟计数器进位但蜂鸣器和LED灯没有反应,手动按键却可以控制蜂鸣器报警和LED灯闪烁。
实验过程中,遇到的小问题不计其数,在多方努力之下,问题基本解决,这里就不一一列举。
总结出的宝贵经验就是要多看书,学会自己解决问题,一般的问题在看书找资料之后基本都能解决;
还有就是一定要细心,这样可以避免很多不必要的麻烦。
对于这一个课程,我依然属于半懂不懂的状态,在今后的学习中,对老师的建议就是可以在刚开始上课的时候就可以给同学布置一些小的作业,然后可以让同学慢慢接触一下软件,学一点浅显的编程,这样在最后写大作业的时候就不会感觉无从下手,以便起到一个循序渐进的作用。
参考文献
1、周润景等,基于QuartusII的FPGA/CPLD数字系统设计实例,电子工业出版社,2010
2、夏宇闻,Verilog数字系统设计教程(第二版),北京航空航天大学出版社,2014
附录电路图及程序
1.时钟分频模块
moduleint_div(clock,clk_out);
inputclock;
//输入时钟
outputclk_out;
//输出时钟
//内部寄存器
regclk_p;
//上升沿输出时钟
regclk_n;
//下降沿输出时钟
reg[F_WIDTH-1:
0]count_p;
//上升沿脉冲计数器
0]count_n;
//下降沿脉冲计数器
//参数--分频系数
parameterF_DIV=48000000;
//分频系数<
<
-----修改这里
parameterF_WIDTH=32;
//分频计数器宽度
wirefull_p;
//上升沿计数满标志
wirehalf_p;
//上升沿计数半满标志
wirefull_n;
//下降沿计数满标志
wirehalf_n;
//下降沿计数半满标志
//判断计数标志位置位及否
assignfull_p=(count_p<
F_DIV-1);
assignhalf_p=(count_p<
(F_DIV>
>
1)-1);
assignfull_n=(count_n<
assignhalf_n=(count_n<
//时钟输出
assignclk_out=(F_DIV==1)?
clock:
(F_DIV[0]?
(clk_p&
clk_n):
clk_p);
//上升沿脉冲计数
always@(posedgeclock)
if(full_p)
count_p<
=count_p+1'
b1;
if(half_p)
clk_p<
=1'
b0;
else
=0;
clk_p<
//下降沿脉冲计数
always@(negedgeclock)
if(full_n)
count_n<
=count_n+1'
if(half_n)
clk_n<
clk_n<
clk_n<
endmodule
2.按键驱动模块
附录图1按键驱动模块原理图
3.时钟计数模块
3.160进制计数器模块(控制分钟、秒)
moduleji_shu_60(clk,q1,q2,co,rst);
output[3:
0]q1,q2;
outputco;
inputclk,rst;
reg[3:
0]q1=0,q2=0;
regco;
always@(posedgeclkornegedgerst)
//assignco=(({q2,q1}==8'
b01011001)?
1:
0);
endmodule
3.224进制计数器模块(控制小时)
moduleji_shu_24(clk,q1,q2);
inputclk;
regco;
always@(posedgeclk)
q1[3:
9)
beginq1[3:
q2[3:
if(q1==4)if(q2==2)
beginq1=0;
4.整点报时模块
modulebuffer_music(audio,sys_CLK,button);
outputaudio;
inputsys_CLK;
inputbutton;
reg[23:
0]counter4Hz,counter1MHz,counter6MHz;
reg[13:
0]count,origin;
regaudiof;
regclk_6MHz,clk_4Hz;
regclk_1MHz;
reg[4:
0]j;
reg[7:
0]len;
//assignaudio=audiof;
//控制开关
assignaudio=button?
audiof:
1'
b1;
//控制开关
always@(posedgesys_CLK)//6MHz分频开发板晶振为50MHz
if(counter6MHz==4)
counter6MHz=0;
clk_6MHz=~clk_6MHz;
counter6MHz=counter6MHz+1;
//end
//
always@(posedgesys_CLK)//4Hz分频
//if(counter4Hz==2500000)
if(counter4Hz==6250000)//50M/4/2
counter4Hz=0;
clk_4Hz=~clk_4Hz;
counter4Hz=counter4Hz+1;
always@(posedgeclk_6MHz)