EDA课程设计.docx
《EDA课程设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
EDA课程设计
《EDA技术使用教程》
课程设计报告
题目名称:
设计一个1HZ~9999HZ的频率计
学生姓名:
学号:
专业年级:
指导教师:
时间:
2014年12月28日
目录
一.设计任务与要求1
二.设计思路2
三.频率计设计原理3
四.频率计的各个设计模块4
4.1.频率产生器lpm_counter0:
4
4.2.测频控制信号发生器testpl:
6
4.3.十进制计数器cnt10:
7
4.4.16位锁存器reg16b:
9
4.5.数码管控制器ledcom:
10
4.6.译码器ymq:
12
4.7元件声明及例化14
五.仿真结果16
六.心得体会17
七.参考文献18
1.设计任务与要求
设计一个1HZ~9999HZ的频率计,需满足一下条件:
1)待测信号为方波信号,且已进行量化,1表示高电平,0表示低电平,占空比不定;
2)提供一个1HZ的信号,去控制打开被检测信号的与门,使计数器在一秒钟内计数;
3)数码管显示的就是被检测信号的频率,以十进制显示;
4)系统时钟10MHz
2.设计思路
数字频率计是一种用十进制数字显示被测信号频率的数字测量仪器.它的基本功能是测量方波信号及其他各种单位时间内变化的物理量。
本数字频率计采用自顶向下的设计思想,通过闸门提供的1s闸门时间对被测信号进行计数及测出的被测信号的频率,测出的频率再通过译码器译码后输出给显示器显示。
我分为以下的六个部分来完成这次的设计:
1)频率产生器lpm_counter0:
2)测频控制信号发生器testpl:
3)十进制计数器cnt10:
4)16位锁存器reg16b
5)数码管控制器ledcom:
6)译码器ymq:
在实验仿真电路中clk端口用实验箱的输出为标准时基信号,sig端口接入被测的信号,clr端口连接一个电平开关,将电平开关-置高电平,输出端接好LED显示器就可以观察被测信号的频率了。
3.频率计设计原理
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。
直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。
直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
本设计中使用的就是直接测频法,即用计数器在计算1s内输入信号周期的个数,其测频范围为1Hz~9999H。
4.频率计的各个设计模块
4.1.频率产生器lpm_counter0:
有一50MHz的时钟输入端clk,经过分频处理后从输出端q[26..0]输出27种频率信号,从中选出三个不同频率的信号:
q[25]为1Hz输入testpl的clk端,q[13]为测试信号输入低位计数器的cnt10的clk端,q[17]为数码管显示选择的扫描信号输入数码管控制器的clk端。
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;
4.2.测频控制信号发生器testpl:
输入端clk收到1Hz信号后,其输出端testen控制各个cnt10的使能,clr_cnt控制各个cnt10的清零,load控制锁存器内数据的输出。
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;
4.3.十进制计数器cnt10:
有一时钟使能输入端en,用于锁定计数值。
当高电平"1"时计数允许计数,低电平"0"时禁止计数。
多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
代码:
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.4.16位锁存器reg16b:
将已有16位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
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;
4.5.数码管控制器ledcom:
两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
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;
4.6.译码器ymq:
输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平"1"可以使四个数码管的小数点不显示。
经译码器的处理输出后数码管显示相应的数值。
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;
4.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:
ledcomportmap(clk3,rout,datao,ledc);
u8:
ymqportmap(datao,led);
u9:
lpm_counter0portmap(clk,q(25)=>clk1,q(15)=>clk2,q(17)=>clk3);
endart;
5.仿真结果
5.1.设计的原理框图如下所示:
5.2频率计原理图
5.3仿真结果