eda课程设计数字频率计的设计.docx
- 文档编号:10995654
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:16
- 大小:65.06KB
eda课程设计数字频率计的设计.docx
《eda课程设计数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《eda课程设计数字频率计的设计.docx(16页珍藏版)》请在冰豆网上搜索。
eda课程设计数字频率计的设计
VHDL与数字系统设计
设计说明书
数字频率计的设计
起止日期:
2010年12月14日至2010年12月26日
学生姓名
班级
学号
成绩
指导教师(签字)
计算机与通信学院
2010年12月26日
课题名称
数字频率计
人数
7
组长
同组人员
课
题
的
主
要
内
容
及任务
一、设计的主要技术参数
在PC机上以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
二、设计任务
主要内容:
设计一个数字显示的频率计
主要任务:
1、频率计采用三位数码管显示。
2、频率测量范围为1Hz~999Hz,并有溢出指示。
3、频率计设有1~999Hz和1~999kHz两个量程,并用LED指示。
4、频率计能根据测试信号的频率进行量程自动切换。
当频率小于1kHz时,系统选择1s的闸门时间,当频率大于等于1kHz时,在下一次测量时,选择0.1s的闸门时间。
5、采用记忆显示方式,即在计数过程中不显示测试数据,待技术过程结束后显示测试结果,并将此结果保持到下一次计数结束。
显示时间不小于1s。
三、设计工作量
2周完成
进度安排
2010/12/14集体针对设计进行分析、讨论,确定好分工,明确设计进度,以及对设计总体上有个了解。
12/15-12/18各组员针对自己的任务,查找相关资料,完成各自相关部分。
12/19-12/20集体讨论,找出一个较佳的方案。
12/21-12/25进行可行性分析,对有错或不佳的地方加以改正。
2010/12/26最后分析整理,书写课程设计报告。
参考资料
1、王小军主编.《VHDL简明教程》.清华大学出版社,1997
2、潘松、王国栋主编.《VHDL应用教程》电子科技大学出版社,2000
3、甘历主编.《VHDL应用于开发实践》科学出版社,2003
4、刘爱荣主编.《EDA技术与CPLD/FPGA开发应用简明教程》.清华大学出版社,2007
一、设计背景
随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青睐。
目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。
为了克服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。
其设计的灵活性使得EDA技术得以快速发展和广泛应用。
以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域。
电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。
EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。
二、设计原理
1、频率计设计原理
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。
直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
本设计中使用的就是直接测频法,即用计数器在计算1s内输入信号周期的个数,其测频范围为1Hz~9999Hz。
2.设计的原理框图如下所示:
三、设计思路
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
这就要求测频控制信号发生器testpl的计数使能信号tsten能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的使能端en进行同步控制。
当tsten为高电平"1"时,允许计数;为低电平"0"时停止计数,并保持其计数结果。
在停止计数期间,首先需要一个锁存信号load的上跳沿将计数器在前1秒种的计数值锁存进16位锁存器reg16b中。
锁存信号之后,必须有一个清零信号clr_cnt对计数器进行清零,为下1秒的计数操作做准备。
,然后由外部数码管控制器ledcom控制的7段译码器ymq译出,并稳定显示。
四、设计步骤与过程
1、频率产生器lpm_counter0:
有一50MHz的时钟输入端clk,经过分频处理后从输出端q[26..0]输出27种频率信号,从中选出三个不同频率的信号:
q[25]为1Hz输入testpl的clk端,q[13]为测试信号输入低位计数器的cnt10的clk端,q[17]为数码管显示选择的扫描信号输入数码管控制器的clk端。
2、测频控制信号发生器testpl:
输入端clk收到1Hz信号后,其输出端testen控制各个cnt10的使能,clr_cnt控制各个cnt10的清零,load控制锁存器内数据的输出。
3、十进制计数器cnt10:
有一时钟使能输入端en,用于锁定计数值。
当高电平"1"时计数允许计数,低电平"0"时禁止计数。
多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
4、16位锁存器reg16b:
将已有16位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
。
5、数码管控制器ledcom:
两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
6、译码器ymq:
输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平"1"可以使四个数码管的小数点不显示。
经译码器的处理输出后数码管显示相应的数值。
7、元件声明及例化:
将各个元器件依据设计相连
五、心得体会
这次课程设计中,我不仅复习巩固了课堂所学的理论知识,提高了对所学知识的综合应用能力,并从根本上了解了VHDL语言的一些基本用法,应用了原来不会或者不熟练的句型,如if句,case句等,也学会了一些基本功能的实现方法,如分频,状态控制等等,从另外一个角度重新审视了上学期完全从硬件角度出发的电路设计,明白了软硬件之间的交互。
通过这个课题,对系统框图、逻辑流程图、状态转移图的设计有了一定的了解。
也懂得了系统的前期设计对于后续的编程和调试的重要性。
本课题采用了自下而上的设计方法,根据系统对硬件的要求,画出系统控制流程图;然后根据控制流程图,分化模块,利用模块实现功能;最后进行仿真和调试。
每个成功的背后都要面对无数次的失败,这次课设也不例外。
虽然遇到不少问题与困难,但通过老师以及同学的帮助,都一一得到顺利地解决。
我想这必定会为将来的实践积累宝贵的经验和教训。
总之,这次课设我们都受益匪浅。
整个过程氛围浓厚,本人也态度十分认真,积极向老师和同学求教并在此过程中收获良多,能够进一步了解和使用一门与硬件直接打交道的基本语言对我们将来的学习和工作都会十分有益。
附件:
附件1、设计图形元件原理图:
附件2、程序源代码:
1、频率产生器:
libraryieee;
useieee.std_logic_1164.all;
librarylpm;
uselpm.lpm_components.all;
entitylpm_counter0is
port(clock:
instd_logic;
q:
outstd_logic_vector(26downto0));
endlpm_counter0;
architecturesynoflpm_counter0is
signalsub_wire0:
std_logic_vector(26downto0);
componentlpm_counter
generic(
lpm_direction:
string;
lpm_port_updown:
string;
lpm_type:
string;
lpm_width:
natural
);
port(clock:
instd_logic;
q:
outstd_logic_vector(26downto0));
endcomponent;
begin
q<=sub_wire0(26downto0);
lpm_counter_component:
lpm_counter
genericmap(
lpm_direction=>"up",
lpm_port_updown=>"port_unused",
lpm_type=>"lpm_counter",
lpm_width=>27
)
portmap(
clock=>clock,
q=>sub_wire0
);
endsyn;
2、测频控制信号发生器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytestplis
port(clk:
instd_logic;--1Hz信号
tsten:
outstd_logic;--计数器使能信号
clr_cnt:
outstd_logic;--计数器清零信号
load:
outstd_logic);--锁存器输出控制信号
endtestpl;
architectureartoftestplis
signaldiv2clk:
std_logic;
begin
process(clk)
begin
ifclk'eventandclk='1'then
div2clk<=notdiv2clk;--div2clk为2Hz
endif;
endprocess;
process(clk,div2clk)
begin
if(clk='0'anddiv2clk='0')then
clr_cnt<='1';--当div2clk与clk同时为零时计数器清零
elseclr_cnt<='0';--当div2clk处于的高电平时计数器计数
endif;
endprocess;
load<=notdiv2clk;--锁存器输出与计数器使能信号反相
tsten<=div2clk;
endart;
3、有时钟使能的十进制计数器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk,clr,en:
instd_logic;
--clk:
计数器时钟,clr:
清零信号,en:
计数使能信号
q:
outstd_logic_vector(3downto0);--q:
4位计数结果输出
c10:
outstd_logic);--计数进位
endcnt10;
architectureartofcnt10is
signalcqi:
std_logic_vector(3downto0);
begin
process(clk,clr)
begin
ifclr='1'thencqi<="0000";
--当输入的clr_cnt为低电平0时清零
elsifclk'eventandclk='1'then
ifen='1'then
--当输入的tesen为高电平1时允许计数
if(cqi<9)thencqi<=cqi+1;
elsecqi<="0000";--等于9则计数器清零
endif;
--当输入的tesen为低电平0时禁止计数,锁定计数值
endif;
endif;
endprocess;
--产生进位
process(cqi)
begin
ifcqi="1001"thenc10<='1';--当加的9时产生进位输出
elsec10<='0';
endif;
endprocess;
q<=cqi;
endart;
4、16位锁存器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityreg16bis
port(load:
instd_logic;--输出锁存控制信号
din:
instd_logic_vector(15downto0);
dout:
outstd_logic_vector(15downto0));
endreg16b;
architectureartofreg16bis
begin
process(load,din)
begin
ifload'eventandload='1'then
--load为高电平时teten为低电平,计数器禁止
dout<=din;--锁存输入的数据
endif;
endprocess;
endart;
5、数码管控制器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityledcomis
port(clk:
instd_logic;--数码管扫描频率
datain:
instd_logic_vector(15downto0);--锁存器输入的16位信号
dataout:
outstd_logic_vector(3downto0);-输出至译码器的4位信号
com:
outstd_logic_vector(3downto0));--输出数码管选择信号
endledcom;
architectureartofledcomis
signalcomclk:
std_logic_vector(1downto0);
begin
--comclk同扫描频率clk循环变化
process(clk)
begin
ifrising_edge(clk)then
ifcomclk>=3then
comclk<="00";
elsecomclk<=comclk+1;
endif;
endif;
endprocess;
--数码管选择
process(comclk)
begin
casecomclkis
when"00"=>com<="1000";
when"01"=>com<="0100";
when"10"=>com<="0010";
when"11"=>com<="0001";
whenothers=>NULL;
endcase;
endprocess;
--对应数码管的输出
process(comclk,datain)
begin
casecomclkis
when"11"=>dataout<=datain(3downto0);
when"10"=>dataout<=datain(7downto4);
when"01"=>dataout<=datain(11downto8);
when"00"=>dataout<=datain(15downto12);
whenothers=>NULL;
endcase;
endprocess;
endart;
6、七段数码管的译码器
libraryIEEE;
useIEEE.std_logic_1164.all;
entityymqis
port(
d_in:
instd_logic_vector(3downto0);
--数码管控制器输入四位信号
d_out:
outstd_logic_vector(7downto0));--输出8位信号
endymq;
--第8位d_out[7]为逗号
architectureartofymqis
begin
process(d_in)
begin
cased_inis--第8位为1高电平逗号不显示
when"0000"=>d_out<="11000000";--0
when"0001"=>d_out<="11111001";--1
when"0010"=>d_out<="10100100";--2
when"0011"=>d_out<="10110000";--3
when"0100"=>d_out<="10011001";--4
when"0101"=>d_out<="10010010";--5
when"0110"=>d_out<="10000010";--6
when"0111"=>d_out<="11111000";--7
when"1000"=>d_out<="10000000";--8
when"1001"=>d_out<="10010000";--9
whenothers=>NULL;
endcase;
endprocess;
endart;
7、元件声明及例化将各个元器件依据设计相连
libraryieee;
useieee.std_logic_1164.all;
entitylxis
port(clk:
instd_logic;
led:
outstd_logic_vector(7downto0);
ledc:
outstd_logic_vector(3downto0));
endlx;
architectureartoflxis
componentlpm_counter0--待调用的频率生成器端口定义
PORT
(clock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(26DOWNTO0));
endcomponent;
--十进制计数器
componentcnt10--待调用的有时钟使能的十进制计数器端口定义
port(clk,clr,en:
instd_logic;
q:
outstd_logic_vector(3downto0);
c10:
outstd_logic);
endcomponent;
--16位锁存器
componentreg16b--待调用的32位锁存器端口定义
port(load:
instd_logic;
din:
instd_logic_vector(15downto0);
dout:
outstd_logic_vector(15downto0));
endcomponent;
--测频控制器
componenttestpl--待调用的测频控制信号发生器端口定义
port(clk:
instd_logic;
tsten:
outstd_logic;
clr_cnt:
outstd_logic;
load:
outstd_logic);
endcomponent;
--数码管选择器
componentledcom--待调用的数码管选择器端口定义
port(clk:
instd_logic;
datain:
instd_logic_vector(15downto0);
dataout:
outstd_logic_vector(3downto0);
com:
outstd_logic_vector(3downto0));
endcomponent;
--译码器
componentymq--待调用的译码器端口定义
port(d_in:
instd_logic_vector(3downto0);
d_out:
outstd_logic_vector(7downto0));
endcomponent;
signalclk1,clk2,clk3:
std_logic;--clk1为1Hz信号,clk2为被测信号,clk3为数码管扫描信号
signaltsten,clr,load:
std_logic;
signalc1,c2,c3,c4:
std_logic;
signalqout,rout:
std_logic_vector(15downto0);
signaldatao:
std_logic_vector(3downto0);
begin
u0:
testplportmap(clk1,tsten,clr,load);
u1:
cnt10portmap(clk2,clr,tsten,qout(3downto0),c1);
u2:
cnt10portmap(c1,clr,tsten,qout(7downto4),c2);
u3:
cnt10portmap(c2,clr,tsten,qout(11downto8),c3);
u4:
cnt10portmap(c3,clr,tsten,qout(15downto12),c4);
u5:
reg16bportmap(load,qout(15downto0),rout);
u6:
ledcomport
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 课程设计 数字频率计 设计