EDA课程设计信号发生器与数字钟设计.docx
《EDA课程设计信号发生器与数字钟设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计信号发生器与数字钟设计.docx(30页珍藏版)》请在冰豆网上搜索。
EDA课程设计信号发生器与数字钟设计
EDA综合设计报告
题目:
信号发生器及数字钟设计
学院:
电气信息学院
专业:
通信工程
姓名:
学号:
指导老师:
汪敏
第一部分:
信号发生器
一、设计任务
要求设计一个多功能信号发生器,根据输入信号的选择可以输出递增锯齿波,递减锯齿波,三角波,阶梯波,方波和正弦波六种信号,并能实现频率选择和幅度调节,信号发生器的控制模块可以用数据选择器实现,六种信号的选择可以用6选1数据选择器实现。
二、方案设计
(一)设计思路
1.利用VHDL语言,设计分频器,实现2分频,4分频,8分频及16分频,实现频率选择功能,生成模块。
及利用数据选择器原理设计的频率选择器模块相连,实现频率选择输出。
2.利用VHDL语言,分别实现六种信号(递增/递减锯齿波,三角波,阶梯波,方波和正弦波)的输出,生成模块。
3.将设计的各功能模块按要求连接,分配引脚接口,连接实验箱,进行硬件测试,验证实现功能。
(二)程序流程
Clk输入六种波形输出
时钟频率波形波形幅度选择
输入选择模块选择调节波形
(三)设计软件
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具及Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
QuartusII提供了完全集成且及电路结构无关的开发包环境,具有数字逻辑设计的全部特性。
三、硬件设计
(一)分频器
分频器的功能是:
利用对时钟上升沿计数,从而实现可以输出二分频,四分频,八分频及十六分频模块,分频器模块是为了实现信号发生器的频率选择功能。
在VHDL编程中,设置一个4位标准逻辑矢量,并循环计数,分别输出它的每一位,即实现了分频功能。
生成的模块如图3-1示。
图3-1
利用波形仿真工具,生成改分频器的波形图,如下图3-2示,该编程实现了分频功能。
图3-2
(二)频率选择器
频率选择器利用四选一数据选择器原理,及分频器结合实现各种分频的频率选择输出,接入各个信号的CLK输入接口。
四选一数据选择器有四种实现方式:
if语句,case语句,条件信号赋值语句及选择信号赋值语句。
本次设计采用条件信号赋值语句。
s1,s2为输出选择端,q输出选择的频率,生成的模块如图3-3示。
图3-3
利用波形仿真工具,生成的频率选择器波形如图3-4示。
图3-4
(三)输出选择模块
输出选择模块及频率选择模块原理一样,本次设计实现六选一波形发生器,故输出选择模块为六选一数据选择器,利用CASE语句实现波形选择输出,设置sel位三位标准逻辑矢量,超出范围case选择指向null。
且case选择语句必须有others。
生成模块如图3-5示。
图3-5
(四)调幅模块
MegaWizardPlug-InManager工具提供了丰富的库函数,这些库函数专门针对Altera公司的器件进行优化,电路结构简单,并大大减少了设计者的工作量。
通过MegaWizardPlug-InManager工具的向导,设计者可以利用QuartusII提供的库函数自定义功能宏块,并设置模块参数和可选端口数值。
调幅模块利用该库函数中的lpm_divide(除法器模块),通过利用除法器模块将输出选择模块中的输出值除以denom中设置的输入值,从而实现调幅功能。
生成模块如图3-6示。
图3-6
(五)各信号模块
1.递增锯齿波
设置clk及reset两个标准逻辑位输入端,一个8位标准逻辑矢量q输出,具有异步复位功能,故进程中敏感信号包括clk及reset,当reset值为‘0’时,输出清零复位。
检测是否达到最大值“11111111”,未到则加一,实现递增锯齿波,到后清零重复循环。
生成模块如下图3-7示。
图3-7
2.递减锯齿波
及递增锯齿波类似,具有相同的输入输出端,及异步复位功能。
区别在于检测是否达到最小值“00000000”,未到则减一,实现递减锯齿波,到后重置为“11111111”,循环重复实现锯齿波输出。
生成模块如下图3-8示。
图3-8
3.三角波
设置clk,reset两个标准逻辑位输入、一个8位标准逻辑矢量数据输出、异步复位。
reset为‘0’时,输出清零复位。
设置局部变量a,当a为0时,temp执行连加计算,当temp加至“11111111”时,a置为1;当a为1时,temp执行连减计算,当temp减至“00000000”后,a置为0。
依次循环,实现三角波信号输出。
生成模块如下图3-9示。
图3-9
4.阶梯波
设置clk,reset两个标准逻辑位输入、一个8位标准逻辑矢量数据输出、异步复位。
同样reset为‘0’时有效,输出清零复位。
检测变量temp为“11111111”后置0,否则按16为步长增加temp的值,输出阶梯波信号,生成模块如下图3-10示。
图3-10
5.方波
设置clk,reset两个标准逻辑位输入、一个8位标准逻辑矢量数据输出、异步复位。
检测clk上升沿执行temp加1计算,当temp小于“10000000”时,a置1,否则a置0,当a为1时,输出q为“11111111”,a为0时,q为“00000000”。
从而实现占空比为1:
1的方波输出。
生成模块如下图3-11示。
图3-11
6.正弦波
设置clk,reset两个标准逻辑位输入,一个0到255的整形实数输出,异步复位。
设置中间变量整形temp为0到63,检测clk上升沿执行temp加1计算,利用case语句,将temp对应为正弦信号的x轴,分别将y轴的值赋给64个temp值相对应,从而输出q,实现近似于正弦信号的输出,生成模块如图3-12示。
图3-12
四、波形仿真结果及分析
(一)系统电路图
将上述模块按功能逻辑连接,如下图4-1示。
具有一个clk时钟输入,一个reset复位信号输入,一个(s1,s2)的频率选择端输入,一个三位sel输出信号选择端输入。
一个8位的输出信号输出。
图4-1
(二)管脚分配
在前面选择好一个合适的目标器件(本次设计选择为EP2C35F672C8)完成设计的分析综合过程,得到工程的数据文件以后,需要对设计中的输入、输出指定到具体的器件管脚号码,指定管脚号码称为管脚分配或管脚锁定。
在菜单assignments中选择pins项,点击在下图4-2中下面的表格右侧的filter的下箭头,选择pins:
all,将显示本工程中所有的输入输出端口。
选择要分配的端口,在location对应的行中双击鼠标左键,将显示芯片所有的引脚,选择要使用的引脚即可。
引脚锁定后,必须再进行一次编译,将引脚信息编译进下载文件中。
图4-2
(三)仿真波形
创建波形仿真文件,选择QUARTUSII软件,进行新建,选择VectorWaveformFile,点击OK,则打开了一个空的波形编辑器。
在波形编辑器窗口左边的的端口名列表区点击鼠标右键,在弹出的对话框中选择InsertNodeorBus命令,在弹出的对话框中,选择需要的信号进行仿真。
这里,我们将分别对可选的6个信号波形进行波形仿真。
1.正弦波
设置时钟信号clk周期为10ns,reset为1。
仿真波形如下图4-3示。
图4-3
2.递减锯齿波
设置同上,仿真波形如图4-4示。
图4-5
3.递增锯齿波
设置同上,仿真波形如图4-6示。
图4-6
4.阶梯波
设置同上,仿真波形如图4-7示。
图4-7
5.三角波
设置同上,仿真波形如图4-8示。
图4-8
6.方波
设置同上,仿真波形如图4-9示。
图4-9
7.整体仿真
1)频率选择为2分频(s1,s2=0),调幅系数为1(denom=1),输出选择方波(sel=110),仿真波形如图4-10示。
图4-10
2)频率选择为2分频(s1,s2=0),调幅系数为2(denom=2,输出幅值为原来二分之一),输出选择方波(sel=110),仿真波形如图4-11示。
图4-11
3)频率选择为16分频(s1,s2=1),调幅系数为2,输出方波,仿真波形如图4-12示。
图4-12
五、硬件调试及结果
(一)程序加载
完成对期间的加载有两种形式,一种是对目标器件进行加载文件,一种是对目标器件的配置芯片进行加载。
1.使用下载电缆将PC机及实验系统连接起来
2.选择QUARTUSII软件的Tool>Programmer命令,进行编译器窗口,如下图5-1示,如果没有设置编程硬件,则编程硬件类型为NoHardware,需要对编程硬件进行设置。
点击HardwareSetup…编程硬件设置按钮,将currentlyselectedhardware设置为:
USB-Blaster[USB-0]。
3.点击start进行文件加载,直到加载进度变为100%,文件成功加载完成。
图5-1
(二)signaltap2
SignaltapII嵌入逻辑分析仪集成到QuartusII设计软件中,能够捕获和显示可编程芯片(sopc)设计中实时信号的状态,这样开发者就可以在整个设计过程中以系统级的速度观察硬件和软件的交互作用。
它支持多达1024个通道,采样深度高达128Kb,每个分析仪均有10级触发输入/输出,从而增加了采样的精度。
新建SignalTapIILogicAnalyzerFile文件,在instance中添加观测节点(nodes),将要观察的输出信号q加入,设置clock为输入的clk信号,采样深度设为1k,重新编译添加了signaltap的工程文件,编译完后,在stp中点击右上角的SOFManager后面的[...],选择好刚刚生成的SOF文件,然后点击programdevice。
再点击runanalyzer运行该stp文件,观察生成波形。
1.输出正弦波
设置sel=001,频率(s1,s2)设为00,幅度调节(denom)设为001,波形如图5-2示。
图5-2
2.输出递减锯齿波
设置sel=010,频率(s1,s2)设为00,幅度调节(denom)设为001,波形如图5-3示。
图5-3
3.输出递增锯齿波
设置sel=011,频率(s1,s2)设为00,幅度调节(denom)设为001,波形如图5-4示。
图5-4
4.输出阶梯波
设置sel=100,频率(s1,s2)设为00,幅度调节(denom)设为001,波形如图5-5示。
图5-5
5.输出三角波
设置sel=101,频率(s1,s2)设为00,幅度调节(denom)设为001,波形如图5-6示。
图5-6
6.输出方波
1)设置sel=110,频率(s1,s2)设为00,幅度调节(denom)设为001,波形如图5-7示。
图5-7
2)设置sel=110,频率(s1,s2)设为11,幅度调节(denom)设为001,波形如图5-8示。
图5-8
3)设置sel=110,频率(s1,s2)设为00,幅度调节(denom)设为010,波形如图5-9示。
图5-9
第二部分:
数字钟设计
一、设计任务
设计一个多功能数字钟,要求显示格式为:
小时-分钟-秒钟,整点报时,报时时间为5秒,即从整点前5秒开始进行报时提示,LED开始闪烁,过整点后,停止闪烁。
系统时钟选择模块的10Khz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。
调整时间的按键模块S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。
另外用S3键作为系统时钟复位,复位后全部显示00-00-00。
二、方案设计
(一)设计思路
1.要实现显示时-分-秒、整点报时、小时和分钟可调等功能,首先整个时钟的工作应该是在1Hz的信号作用下进行,这样每来一个时钟的上升沿,秒加一,当秒达到59,跳转00,分钟加一,当分钟增加到59,跳转00,小时加一,当小时增加到23,跳转00,以此循环。
2.在设计中,为了显示方便,由于分钟和秒钟显示范围都是0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码显示个位。
3.设计中由于七段码管是扫描的方式显示,所以虽然时钟信号需要的是1Hz,但扫描需要一个高频信号,因此1Hz信号只能通过分频的方式获得。
4.对于整点报时功能,主要是检测分钟及秒钟是否达到59分55秒,到后LED灯开始闪烁。
(二)程序流程
到59
到59
Clk
时钟
输入
分频实现1Hz
秒钟计数加一
分钟计数加一
小时计数加一
5秒倒计时报警模块
数码管动态扫描输出
三、软件设计
(一)分频程序
要实现1s的计时,需要对10k的系统时钟实现10,000分频,2的13次方为8192,接近10000,故令一14位的标准逻辑矢量,当小于10000时自加1,到后重赋初值。
输出第13位值,此值就为约等于1hz的时钟信号。
(二)计数程序
设置6个整形信号,分别表示时分秒的个位及十位。
Reset为异步复位信号,当rst为0时,6个信号都清零复位。
检测1hz信号的上升沿,S1为调整小时按钮,S2为调整分钟按钮,上升沿来后,若检测到S1或S2按下(值为0),可以调整数字钟起始值,又当秒的个位自加到9后,十位加1,个位清零,当秒十位到5,个位到9后,分的个位加1,秒的个位及十位同时清零,当分的个位到9,后十位加一,个位清零,当分十位到5,个位到9,小时的个位加一,当小时的十位为2,个位为3,同时分钟为59,秒钟为59后,小时清零。
依次循环,实现整个设置计数初值及计数的过程。
通过多个if语句嵌套,来实现该计数功能。
(三)报警程序
判断当分钟到59,秒钟到54后,输出四位标准逻辑矢量led_display,led_display外接四个LED,当55秒时利用case语句依次输出:
’1111’,’0111’,’0011’,’0001’,’1111’
LED灯将出现相应的闪烁效果,实现倒计时功能。
四、波形仿真及分析
新建波形文件,设置clk为10ns,rst为1,s1,s2部分为1,下图4-1为输出的波形图,因display为循环扫描,输出值不能明显看出是数字钟,此时我们需要进行硬件测试,以便更好的观察实验现象。
图4-1
五、硬件调试及结果
首先将管脚分配,具体分配如图5-1示。
图5-1
完成管脚分配后再进行全编译后,打开programmer如图5-2示,将目标文件加载到目标板上,具体步骤如下:
1.使用下载电缆将PC机及实验系统连接起来
2.选择QUARTUSII软件的Tool>Programmer命令,进行编译器窗口,如下图5-1示,如果没有设置编程硬件,则编程硬件类型为NoHardware,需要对编程硬件进行设置。
点击HardwareSetup…编程硬件设置按钮,将currentlyselectedhardware设置为:
USB-Blaster[USB-0]。
3.点击start进行文件加载,直到加载进度变为100%,文件成功加载完成。
图5-2
将数字信号源模块的时钟选择为10Khz,观察实验箱如图5-3示。
图5-3
按下s2键,调节分钟,如图5-4示。
图5-4
按下S1键,调节小时,如图5-5示。
图5-5
按下s3键开始,时分秒复位,如图5-6示。
图5-6
当59分55秒后LED开始倒计时,如图5-7示。
图5-7示
第三部分总结
一、结论
本次课程设计完成了多波形信号发生器及数字钟的设计,在设计信号发生器中,利用分频器实现了信号的频率调节,利用除法器实现了信号的幅度调节,再利用了数据选择起实现了信号波形的选择输出,最终通过quartusii软件中的signaltapii观察到了输出波形,验证了实验结果。
在数字钟的设计中,同样利用分频原理获得了近似1hz的时钟信号,设置S1,S2端进行了时钟的初值设定,设置了LED的整点报时功能,利用多层if嵌套实现时钟的计时,进位功能,最终将程序导入目标板,通过实验箱中的8位LED数码管观察到实验结果。
二、心得体会
通过前期的EDA理论课学习,对VHDL语言、对quartusii软件有了初步的认识及基础,所以在本次的课程设计中,将前期的学习内容进行了综合,学习了quartusii软件中的signaltapii的使用方法,成功实现了波形的输出,对整个EDA程序的设计流程有了更深的认识,清楚了设计的总体步骤。
参考文献资料:
[1]朱正伟等《EDA技术及应用》清华大学出版社2014.7
[2]汪敏等,《课程实验及综合设计指导书》西南石油大学,2013.6
[3]潘松等《EDA技术实用教程[M]》科学出版社,2005年第2版1-25
[4]章彬宏《EDA应用技术》北京理工大学出版社,2007.7
[5]陈拓《使用SignalTapII逻辑分析仪调试FPGA》,2008.7
附录一:
信号发生器程序
1.分频器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityfrequencydivideris
port(clk:
instd_logic;
clk_div2,clk_div4,clk_div8,clk_div16:
outstd_logic);
endfrequencydivider;
architecturebehaveoffrequencydivideris
signalcount:
std_logic_vector(3downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifcount="1111"then
count<="0000";
else
count<=count+1;
endif;
endif;
endprocess;
clk_div2<=count(0);
clk_div4<=count
(1);
clk_div8<=count
(2);
clk_div16<=count(3);
endbehave;
2.频率选择
libraryieee;
useieee.std_logic_1164.all;
entityswitchfrequencyis
port(
s1,s2:
instd_logic;
clk_div2,clk_div4,clk_div8,clk_div16:
instd_logic;
q:
outstd_logic
);
endswitchfrequency;
architecturebehaveofswitchfrequencyis
signalsel:
std_logic_vector(1downto0);
begin
sel<=s1&s2;
q<=clk_div2whensel="00"else
clk_div4whensel="01"else
clk_div8whensel="10"else
clk_div16;
endbehave;
3.正弦波
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysineis
port(clk,reset:
instd_logic;
q:
outintegerrange0to255);
endsine;
architecturebehaveofsineis
begin
process(clk,reset)
variabletmp:
integerrange0to63;
begin
ifreset='0'then
q<=0;
elsifclk'eventandclk='1'then
iftmp=63then
tmp:
=0;
else
tmp:
=tmp+1;
endif;
casetmpis
when00=>q<=255;when01=>q<=254;when02=>q<=252;
when03=>q<=249;when04=>q<=245;when05=>q<=239;
when06=>q<=233;when07=>q<=225;when08=>q<=217;
when09=>q<=207;when10=>q<=197;when11=>q<=186;
when12=>q<=174;when13=>q<=162;when14=>q<=150;
when15=>q<=137;when16=>q<=124;when17=>q<=112;
when18=>q<=99;when19=>q<=87;when20=>q<=75;
when21=>q<=64;when22=>q<=53;when23=>q<=43;
when24=>q<=34;when25=>q<=26;when26=>q<=19;
when27=>q<=13;when28=>q<=8;when29=>q<=4;
when30=>q<=1;when31=>q<=0;when32=>q<=0;
when33=>q<=1;when34=>q<=4;when35=>q<=8;
when36=>q<=13;when37=>q<=19;when38=>q<=26;
when39=>q<=34;when40=>q<=43;when41=>q<=53;
when42=>q<=64;when43=>q<=75;when44=>q<=87;
when45=>q<=99;when46=>q<=112;when47=>q<=124;
when48=>q<=137;when49=>q<=150;when50=>q<=162;
when51=>q<=174;when52=>q<=186;when53=>q<=197;
when5