数字频率计设计.docx
《数字频率计设计.docx》由会员分享,可在线阅读,更多相关《数字频率计设计.docx(23页珍藏版)》请在冰豆网上搜索。
数字频率计设计
2.1.2CNT10模块3
2.1.4SELTIME模块4
2.1.5DELED模块4
2.2总电路设计5
3设计调试体会与总结6
3.1设计调试6
3.1.1管脚锁定6
3.1.2各模块仿真波形图7
3.2体会与总结9
3.2.1体会9
3.2.2总结10
3.3改进意见11
4实验箱调试现象11
参考文献..................................................................................................................................................16
SELTIME模块18
DELED模块19
引言
EDA技术即电子设计自动化技术,它是以可编程逻辑器件(PLD)为载体,以硬件描述语言(VHDL)为主要的描述方式,以EDA软件为主要的开发软件的电子设计过程。
它主要采用“自顶向下”的设计方法,设计流程主要包括:
设计输入、综合、仿真、适配、下载。
《EDA课程设计》(注:
EDA即电子设计自动化,ElectronicsDesignAutomation)是电子技术基础的一部分,随着可编程器件技术的发展,EDA技术已广泛用于电子系统设计开发中,EDA技术已经成为电子信息类专业人员必须掌握的一门技术。
《EDA课程设计》是继《模拟电子技术基础》、《数字电子技术基础》、《电子技术基础》课程后电气、电子灯专业综合性实验训练课程,重在培养学生对VHDL语言的理解、EDA软件的使用和简单电子电路设计的思想,提高学生动手能力。
我们这次课程的内容是能够具有超量程报警功能,在超出目前量程档的测量范围时,发出灯光或音响信号的三位数字频率计。
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。
随着可编程ASIC的广泛应用,以EDA工具作为开发手段,基于VHDL语言,将使整个系统大大简化,提高整体的性能和可靠性本文介绍一种基于VHDL的采用自顶而下设计方法实现的数字频率计。
该设计方法与传统的设计方法相比,具有外围电路简单,程序修改灵活和调试容易等特点。
特别是在设计的初期阶段可以通过软件仿真来预知设计方案的可行性,便于及时的调整设方案,避免了传统方法中到项目开发的后期发现方案妥,从而造成人力、物力的浪费。
1设计任务及设计要求
1.1设计任务
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
它是一种用十进制数字,显示被测信号频率的数字测量仪器。
它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。
在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精度高,显示直观,所以经常要用到数字频率计。
数字计数式频率计能直接计数单位时间内被测信号的脉冲数,然后以数字形式显示频率值。
这种方法测量精确度高、快速,适合不同频率、不同精确度测频的需要。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
1.2设计要求
设计一个能测量方波信号频率的频率计,测量结果用十进制显示,测量的频率范围是1~100KHz,分成两个频段,即1~999Hz,1KHz~100KHz,用三位数码管显示测量频率,用LED显示表示单位,如亮绿灯表示Hz,亮红灯表示KHz。
具有自动校验和测量两种功能,即能用标准时钟校验测量精度。
具有超量程报警功能,在超出目前量程档的测量范围时,发出灯光和音响信号。
2设计总体思路
脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式f=N/T,f为被测信的频率,N为计数器所累计的脉冲个数,T为产生N个脉冲所需的时间,所以在1秒时间内计数器所记录的结果,就是被测信号的频率。
此设计问题可分为测量/校验选择模块、计数器模块、送存选择器模块、锁存模块和扫描显示模块几部分。
测量/校验选择模块通过一个测频信号发生器控制计数。
设置1秒定时信号(周期为2秒),在1秒定时时间内的所有被测信号送计数器输入端。
计数器对CP1信号进行计数,在1秒定时结束后,将计数器结果送锁存器锁存,同时将计数器清零,为下一次采样测量做好准备。
设置量程档控制开关K,单位显示信号Y,当K=0时,为1~999Hz量程档,数码管显示的数值为被测信号频率值,Y显示绿色,即单位为Hz,当K=1时,为1KHz~100KHz量程档,被测信号频率值为数码管显示的数值乘以1000,Y显示红色,即单位KHz。
设置超出量程档测量范围示警信号alert。
计数器由四级十进制计数构成(带进位C)。
若被测信号频率小于1KHz(K=0),则计数器只进行三级十进制计数,最大显示值为999.Hz如果被测信号频率超过此范围,示警信号驱动灯光;若被测信号为1KHz~100KHz(K=1),计数器进行四位十进制计数,取高三位显示,最大显示值为99.9KHz,如果被测信过此范围报警。
2.1各单元电路设计
2.1.1TESTCTL模块
图2-1控制信号发生模块
这个模块的主要功能是一个测频信号发生器,此模块中含有clk一个输入端和teten,clr_cnt和load三个输出端,频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
Testctl的计数使能信号tsten能产生一个1秒脉冲宽的周期信号,并对频率计的每一计数器cnt10的使能ena进行同步控制。
当tsten高电平时,允许计数;为低电平时停止计数,并保持其计数结果。
在停止计数期间,首先需要一个锁存器load的上跳沿将计数器前一秒的计数值锁存进锁存器REG32B中。
由clr_cnt来控制计数器的清零端。
2.1.2CNT10模块
图2-2十进制计数模块
这个模块的功能是一个异步的十进制计数器,它记录的数值是从0~9,此模块有三个输入端和两个输出端,它的三个输入端分别为clk,clr和ena,输出端为cq[3..0]和carry_out。
其中clk时钟信号,在它上升沿开始计数,clr为复位清零信号,ena为计数器的使能端,当它为高电平的时候开始计数,低电平的时候停止计数。
cq[3..0]为四位输出端,carry_out为进位输出端,当它为1时,下一位计数器开始计数。
2.1.3REG32B模块
图2-3锁存模块
这个这个模块是一个锁存器模块,此模块包括三个输入端,load,rst和din[23..0]以及一个输出端dout[23..0],其中rst为清零信号,当它为高电平的时候清零,当它为低电平的时候在load的上升沿时,din[23..0]将计数器记录的数据放入到锁存中进行锁存,处理后由dout[23..0]进行输出。
2.1.4SELTIME模块
图2-4数码管选存模块
这个模块是一个数码管选存模块,此模块有三个输入端和三个输出端,clk为时钟信号,在clk为上升沿时候把锁存器的输出信号送入din[23..0]端口,其中输入端k具有控制数码管显示的功能当k为高电平的时候数码管显示高三位,当k为低电平的时候数码管显示低三位,daout[3..0]输出端连接DELED模块,SEL[2..0]连接试验箱上对数码管进行位选。
2.1.5DELED模块
图2-5数码管位选模块
数码管位选模块有一个输入端s[3..0]和八个输出端,其中s[3..0]为译码器的输入为4位二进制代码,由译码器把二进制表示的地址转换为单线选择信号。
八个输出端控制数码管显示相应的数值。
2.2总电路设计
图2-6三位数字频率计
总体框图说明:
频率测量是每秒内待测信号的脉冲个数,Testctl的计数使能信号tsten能产生一个1秒脉冲宽的周期信号,并对频率计的每一计数器cnt10的使能ena进行同步控制。
当tsten高电平时,允许计数;为低电平时停止计数,并保持其计数结果。
在停止计数期间,首先需要一个锁存器load的上跳沿将计数器前一秒的计数值锁存进锁存器REG32B中。
由clr_cnt来控制计数器的清零端在每个时钟的上升沿,锁存器reg32b,将指令din[23..0]逻辑左移相应位后输出。
在停止计数期间,首先需要一个锁存器load的上跳沿将计数器前一秒的计数值锁存进锁存器REG32B中,在rst为高电平时锁存器无效,当rst为低电平时开始进行锁存。
由指令din[23..0]逻辑左移相应位后由dout[23..0]输出到seltime。
当k为低电平时控制数码管使其显示待测信号的低三位,当K为高电平时控制数码管使其显示待测信号高三位。
把已经经过锁存器的输出信号送到s[23..0]端口。
daout[3..0]输出端连接DELED模块,SEL[2..0]连接试验箱上对数码管进行位选。
S[3..0]端输入二进制表示的地址,通过该模块转换为单线选择信号,来控制对应的数码管显示的数字。
如输入的test信号的频率为512Hz,此时若设置量程档控制开关K=0时,选择的是1~999Hz量程档,被测信号频率值为数码管显示512,即单位为Hz。
当K=1,被测信号为000,数码管显示如果输入的test信号的频率为4KHz,此时若设置量程档控制开关K=1时,选择的是1~100KHz量程档,被测信号的频率值为数码管显示的数值×1000,即单位为KHz;此时LED灯亮,此时若设置的量程档控制开关K=0时,数码管显示低三位,其相应的数码管显示为,被测信号的频率值超过其量程,就会显示灯亮表示警告。
3设计调试体会与总结
3.1设计调试
3.1.1管脚锁定
如图3-1所示。
图3-1管脚锁定图
3.1.2各模块仿真波形图
1.TESTCTL模块:
图3-2TESTCTL模块波形仿真
仿真结果分析:
当clk为上升沿的时候,clr_cnt为计数器的清零信号变为下降沿,而计数的使能信号变为上升沿,开始计数。
当clk为下降沿的时候clr_cnt为上升沿,对计数器清零,同时锁存器的控制信号load也为上升沿将前一次所测量的数值进行锁存。
2.CNT10模块:
图3-3CNT10模块波形仿真
仿真结果分析:
clr为计数器的清零信号,当clr为高电平平计数器清零,当clr为低电平的时候计数器允许计数,clk为时钟信号,ena为计数器的使能信号,当clk为上上升沿时候开始加一计数,计数范围为0~9,ena高电平时候,停止计数,为低电平始计数。
3.REG32B模块:
图3-4REG32B模块波形仿真
仿真结果分析:
rst为复位信号,当它为高电平的时候,dout的输出值为0,当rst为低电平的时候,且load为上升沿的时候,数据通din进入锁存器进行锁存,dout相应的进行输出。
4.SELTIME模块:
图3-5SETIME模块波形仿真
仿真结果分析:
当k为低电平时控制数码管使其显示待测信号的低三位,当K为高电平时控制数码管使其显示待测信号高三位。
把已经经过锁存器的输出信号送到s[23..0]端口。
daout[3..0]输出端连接DELED模块,SEL[2..0]连接试验箱上对数码管进行位选。
5.DELED模块:
图3-6DELED模块波形仿真
S为数码管的输入端口,通过s输入一个四位二进制数,其在数码管上得到相应的显示数值,当输入0101,对应在输出值为10110110,在数码管上显示数字5。
3.2体会与总结
3.2.1体会
这次课程设计中,我不仅复习巩固了课堂所学的理论知识,提高了对所学知识的综合应用能力,并从根本上了解了VHDL语言的一些基本用法,应用了原来不会或者不熟练的句型,如if句,case句等,也学会了一些基本功能的实现方法,如分频,状态控制等等,从另外一个角度重新审视了上学期完全从硬件角度出发的电路设计,明白了软硬件之间的交互。
通过这个课题,对系统框图、逻辑流程图、状态转移图的设计有了一定的了解。
也懂得了系统的前期设计对于后续的编程和调试的重要性。
本课题采用了自下而上的设计方法,根据系统对硬件的要求,画出系统控制流程图;然后根据控制流程图,分化模块,利用模块实现功能;最后进行仿真和调试。
每个成功的背后都要面对无数次的失败,这次课设也不例外。
虽然遇到不少问题与困难,但通过老师以及同学的帮助,都一一得到顺利地解决。
我想这必定会为将来的实践积累宝贵的经验和教训。
总之,这次课我们受益匪浅。
整个过程氛围浓厚,我积极向老师和同学求教并在此过程中中收获良多,能能够进一步了解和使用一门与硬件直接打交道的基本语言对我们将来的学习和工作都会十分有益。
3.2.2总结
一周的《数字频率计》的课程设计终于做完了,在这一周的课设中我感觉我学到了蛮多东西。
通过这次设计是我熟练地掌握了QUARTUSII软件的基本使用方法,对VHDL语言的编程方法和编程技巧有了更深层次的理解,对FPGA的了解及应用有了更深层的认识,对频率计有很更深的认识并掌握了频率计的设计过程。
在完成此次设计的过程中,遇到了很多困难,但最终都一一攻克。
通过这次课程设计,自己的EDA设计能力有了很大的提高。
EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、逻辑简化、逻辑分割、逻辑综合、结构综合,以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
硬件描述语言VHDL是EDA技术的重要组成部分,基于VHDL的设计有一个重要的设计思想:
自顶向下设计。
自顶下下设计有许多优点:
1)设计人员不受芯片结构的约束,进行最适应市场需求的设计,避免再设计风险,缩短产品的上市周期;2)设计成果的再利用得以保证(IP);3)采用结构化开发手段,一旦系统基本功能结构确定,可以实行多人、多任务并行工作方式;4)选择实现系统的目标器件的类型、规模,硬件结构的自由度更大。
在刚接触EDA课程的时候,面对一种全新的硬件描述语言和软件工具,一开始是什么都不了解,后来通过实验课慢慢掌握了QUARTUEII部分功能的使用。
开始上机做实验时都是通过原理图输入进行设计和仿真,原理图设计主要调用相应模块通过连线将对应端口连在一起,原理图输入并不复杂,因此实验也不难。
在熟悉了基本操作和原理后开始学习VHDL语言描述。
VHDL主要包括库文件、实体和结构体三部分。
实体描述了电路器件的外部情况及各信号端口的基本性质;结构体负责描述电路器件的内部逻辑功能或电路结构。
在VHDL的使用过程中理解了自顶向下的设计思想,熟悉了软件的使用。
因为学校的课时安排有限,所以安排的实验个数也比较有限。
不过这些也并不会影响对这门技术的学习,课后有多种选题供我们选择做课程设计。
因为自己学的并不好,因此在选题时就选了个比较简单的课题——数字频率计。
这次设计也收获很多,平时做实验大家做的都是一样的,不懂的可以问别人,但课程设计每组的课题都不一样,所以只有自己查资料。
过多的依赖被人,自己不会得到锻炼,能力也不会提升,还有比较重要的就是团队合作精神,以后很多工作都不是一个人可以完成的,所以合作精神很重要。
每次课程设计是一次难得的锻炼机会,让我们能够充分利用所学过的理论知识还有自己的想象的能力,另外还让我们学习查找资料的方法,以及自己处理分析电路和EDA语言,并且设计的能力。
我相信是对我们的一个很好的提高。
平时在学习理论知识的时候,我们应该更注重实践。
虽然课程和设计都结束了,但要学的知识还很多,只有不断学习才能提升自己,跟上发展的步伐。
碰到的问题越让人绝望,解决后的喜悦程度就越高。
3.3改进意见
当量程低于1khz时候能够控制绿灯亮,当量程超过1khz的时候红灯亮,那样看上去更加的明显了。
在超过量程的时候应该发出相应的警告声音。
4实验箱调试现象
4.1待测信号小于1000HZ
图4-1-1待测信号128HZ低三位调试现象图
图4-1-2待测信号128HZ高三位调试现象图
现象解释:
当待测信号为128HZ时低三位为128,表示量程的灯不亮,控制开关拔向高电位,数码管显示高三位为000.报警信号的LED灯不亮
4.2待测信号频率超过1000HZ低于100KHZ
图4-2-1待测信号4096HZ高三位调试现象图
图4-2-2待测信号4096HZ低三位调试现象图
现象解释:
当待测信号为4096HZ时高三位为040,表示量程的灯亮,控制开关拔向高电位,数码管显示低三位为096.报警信号的LED灯不亮
4.3待测信号超出量程
图4-3-1待测频率1.5MHZ高三位调试现象图
图4-3-2待测频率1.5MHZ低三位调试现象图
现象分析:
当超出量程会发生报警,低三位和高三位会出现错误
4.4复位清零信号
图4-4复位清零调试现象图
现象分析:
当clr为高电平,计数器清零,数码管上显示000
参考文献
[1]《PLD与数字系统设计》李辉.西安电子科技大学出版社,2005.
[2]《集成电路设计VHDL教程》赵俊超等著.北京:
希望电子出,2002.
[3]《VHDL程序设计》曾繁泰,陈美金著.北京:
清华大学出版社,2001.
[4]《VHDL 实用教程》潘松,王国栋著.成都:
电子科技大学出社,2001.
[5]《数字电路逻辑设计》王毓银著.北京:
高等教育出版社,2001.
[6]焦素梅.EDA技术基础[M].北京:
清华大学出版社,2005.
[7]焦素梅.EDA课程设计指导书[M].河南工业大学出版社,2008.
[8]黄志伟.FPGA系统设计与实践[M].电子工业出版社,2005.
附录:
VHDL描述
TESTCTL模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytestctlis
port(clk:
instd_logic;
tsten:
outstd_logic;
clr_cnt:
outstd_logic;
load:
outstd_logic);
endtestctl;
architecturebehavoftestctlis
signaldiv2clk:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')then
div2clk<=notdiv2clk;
endif;
endprocess;
process(clk,div2clk)
begin
if(clk='0'anddiv2clk='0')then
clr_cnt<='1';
else
clr_cnt<='0';
endif;
endprocess;
load<=notdiv2clk;
tsten<=div2clk;
endbehav;
CNT10模块
libraryieee;
useieee.std_logic_1164.all;
entitycnt10is
port(clk:
instd_logic;
clr:
instd_logic;
ena:
instd_logic;
cq:
outintegerrange0to9;
carry_out:
outstd_logic);
endcnt10;
architecturebehavofcnt10is
signalcqi:
integerrange0to9;
begin
process(clr,clk,ena)
begin
if(clr='1')then
cqi<=0;
elsif(clk'eventandclk='1')then
if(ena='1')then
if(cqi=9)then
cqi<=0;
carry_out<='1';
else
cqi<=cqi+1;
carry_out<='0';
endif;
endif;
endif;
endprocess;
REG32B模块
libraryieee;
useieee.std_logic_1164.all;
entityreg32bis
port(load:
instd_logic;
rst:
instd_logic;
din:
instd_logic_vector(23downto0);
dout:
outstd_logic_vector(23downto0));
endreg32b;
architecturebehavofreg32bis
signaldata:
std_logic_vector(23downto0);
begin
process(rst,load,data)
begin
ifrst='1'then
data<=(others=>'0');
elsif(load'eventandload='1')then
data<=din;
endif;
dout<=data;
endprocess;
endbehav;
SELTIME模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityseltimeis
port(clk:
instd_logic;
din:
instd_logic_vector(23downto0);
k:
instd_logic;
daout:
outstd_logic_vector(3downto0);
sel:
outstd_logic_vector(2downto0));
endseltime;
architecturebehavofseltimeis
signalsec:
std_logic_vector(2downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(sec="010")then
sec<="000";
else
sec<=sec+1;
endif;
endif;
endprocess;
process(sec,din(23downto0))
begin
ifk='0'thencasesecis
when"000"=>daout<=din(3downto0);
when"001"=>daout<=din(7downto4);
when"010"=>daout<=din(11downto8);
whenothers=>daout<="XXXX";