VHDL课程设计报告数字频率计.docx
《VHDL课程设计报告数字频率计.docx》由会员分享,可在线阅读,更多相关《VHDL课程设计报告数字频率计.docx(14页珍藏版)》请在冰豆网上搜索。
![VHDL课程设计报告数字频率计.docx](https://file1.bdocx.com/fileroot1/2022-11/23/fe071242-a895-4cda-aa4f-74beec2c1875/fe071242-a895-4cda-aa4f-74beec2c18751.gif)
VHDL课程设计报告数字频率计
《可编程数字系统》课程设计报告
《可编程数字系统》课程设计报告
摘要
随着计算机技术、超大规模集成电路、EDA技术的发展和可编程逻辑器件的广泛应用,传统的自下而上的数字电路设计方法、工具、器件已远远落后于当今信息技术的发展。
基于EDA技术和硬件描述语言的自上而下的设计技术正在承担起越来越多的数字系统设计任务。
本论文采用自上向下的设计方法,基于VHDL硬件描述语言,以QUARTUSⅡ为开发环境设计了一种数字频率计并且进行调试,达到了预期目标。
关键词:
EDAVHDLQUARTUSⅡ数字频率计占空比
一、设计任务及要求
设计一数字频率计,用VHDL语言描述,用QuartusII工具编译和综合,并在实验板上实现,同时提交实验报告。
功能要求与技术指标如下:
1.基本功能要求
(1)能够测量出方波的频率,其范围50Hz~50KHz。
(2)要求测量的频率绝对误差±5Hz。
(3)将测量出的频率以十进制格式在实验板上的4个数码管上显示。
(4)测量响应时间小于等于10秒。
以上
(1)~(4)基本功能要求均需实现。
2.发挥部分
(1)提高测量频率范围,如10Hz~100KHz或更高、更低频率,提高频率的测量绝对值误差,如达到±1Hz。
(2)可以设置量程分档显示,如X1档(显示范围1Hz~9999Hz),X10档(显示范围0.001KHz~9.999KHz),X100档(显示范围0.100KHz~999.9KHz)...可以自定义各档位的范围。
量程选择可以通过按键选择,也可以通过程序自动选择量程。
(3)能够测量出正弦波和三角波的频率(可以添加外围信号处理电路)。
(4)若是方波能够测量方波的占空比,并通过数码管显示。
以上
(1)~(4)发挥功能可选择实现其中的若干项。
二、设计原理
常用的频率测量方法有周期法、直接测频法和等精度频率测量法。
在对这
几种测量频率方法进行比较之后,选择了直接测频法。
直接测频法就是在确定的闸门时间内,记录被测信号的脉冲个数。
由于闸门时间通常不是待测信号的整数倍,这种方法的计数值也会产生最大为±1个脉冲误差。
数字频率计的测量整体原理如图1,被测信号为外部输入信号,送入测量电路,在确定的闸门时间内,测量计数、数据锁存和送显,就完成了频率计的基本功能,通过按键选择用来实现频率的测量、显示和待测信号占空比的测量、显示。
图2
三、系统分析
系统组成框图如图3所示,它主要由5个模块组成,分别是:
1HZ闸门信号产生与测频时序控制电路、频率计数电路、占空比电路、动态扫描电路和译码显示电路。
由于实验硬件要求所以设计一个动态LED数码管显示即扫描模块。
当系统正常工作时,由实验板的晶振提供50MHZ的标准时钟CLK作为输入信号。
对于频率测量,经过测频时序控制电路产生一个1秒宽度的计数信号,被测信号被送入计数模块,计数模块对输入的矩形波进行计数;对于占空比测量,通过标准时钟计算被测信号高电平以及周期的时长,并进行相关的换算。
然后将计数结果送入动态扫描电路并通过按键进行选择输出,输出结果由显示译码驱动电路将二进制表示的(BCD码)计数结果转换成相应的十进制结果,在数码管上可以看到计数结果。
图3系统组成
四、程序设计
系统的程序也相应的分成几个部分,以实现系统各个模块的功能。
系统的
程序设计如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
--------------------------------------------------------------------
ENTITYpinlvjiIS
PORT(k:
INSTD_LOGIC;--复位信号
k5:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
clkin:
INSTD_LOGIC;--外部输入被测信号
data_led:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--八段码
dp:
OUTSTD_LOGIC;
seg:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--数码管位选信号
ENDpinlvji;
ARCHITECTURErtlOFpinlvjiIS
SIGNALreset:
STD_LOGIC;
SIGNALcnt1,cnt2,cnt3,cnt4,cnt5,cnt6,cnt7:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALbcd:
STD_LOGIC_VECTOR(3DOWNTO0);--BCD码寄存器
SIGNALk_1hz:
INTEGERRANGE0TO50000000;--秒分频系数
SIGNALen,bclk,clk_shift,check_clk1,check_clk2,check_clk3,check_clk4:
std_logic;
SIGNALpoint:
STD_LOGIC_VECTOR(1DOWNTO0);--小数点
SIGNALpointout:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALbcd0,bcd1,bcd2,bcd3:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtemp:
STD_LOGIC_VECTOR(22DOWNTO0);
SIGNALZKB:
INTEGERRANGE0TO99;--占空比
SIGNALCNTZ1:
INTEGERRANGE0TO50000000:
=0;
SIGNALCNQ1:
INTEGERRANGE0TO50000000:
=0;
SIGNALCNTZ2:
INTEGERRANGE0TO50000000:
=0;
SIGNALCNQ2:
INTEGERRANGE0TO50000000:
=0;
SIGNALCLKOUT:
STD_LOGIC;
SIGNALZ1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALZ0:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCNT0:
INTEGERRANGE0TO50000000:
=0;
SIGNALZKOUT0,ZKOUT1:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
reset<=NOTk;
process(clk)--分频器;
variablecnt11,cnt22,cnt33,cnt44:
INTEGERRANGETO25000000;
begin
ifreset='1'then
cnt11:
=0;cnt22:
=0;cnt33:
=0;check_clk1<='0';check_clk2<='0';check_clk3<='0';check_clk4<='0';
elsifclk'eventandclk='1'then
ifcnt11=249thencheck_clk1<=notcheck_clk1;cnt11:
=0;
elsecnt11:
=cnt11+1;
endif;
ifcnt22=24999thencheck_clk2<=notcheck_clk2;cnt22:
=0;elsecnt22:
=cnt22+1;
endif;
ifcnt33=99999thencheck_clk3<=notcheck_clk3;cnt33:
=0;
elsecnt33:
=cnt33+1;
endif;
ifcnt44=499999thencheck_clk4<=notcheck_clk4;cnt44:
=0;elsecnt44:
=cnt44+1;
endif;
endif;
endprocess;
second:
process(clk,reset)
begin
ifreset='1'thenk_1hz<=0;
elsifclk'eventandclk='1'then
ifk_1hz<49999999thenk_1hz<=k_1hz+1;
elsek_1hz<=50000000;
endif;
endif;
ifk_1hz<49999999andreset='0'thenen<='1';
elseen<='0';
endif;
endprocess;
process(en,reset,bclk)--此进程完成对被测信号计脉冲数
begin
ifreset='1'then
cnt1<="0000";cnt2<="0000";cnt3<="0000";cnt4<="0000";cnt5<="0000";cnt6<="0000";cnt7<="0000";
elsifbclk'eventandbclk='1'then
ifcnt1="1001"thencnt1<="0000";
ifcnt2="1001"thencnt2<="0000";
ifcnt3="1001"thencnt3<="0000";
ifcnt4="1001"thencnt4<="0000";
ifcnt5="1001"THENcnt5<="0000";
ifcnt6="1001"thencnt6<="0000";
ifcnt7="1001"thencnt7<="0000";
elsecnt7<=cnt7+1;
endif;
elsecnt6<=cnt6+1;
endif;
elsecnt5<=cnt5+1;
endif;
elsecnt4<=cnt4+1;
endif;
elsecnt3<=cnt3+1;
endif;
elsecnt2<=cnt2+1;
endif;
elsecnt1<=cnt1+1;
endif;
endif;
endprocess;
process(clk,en)
begin
ifrising_edge(clk)then
if(k5='1')then
ifen='0'then
ifcnt7>"0000"thenbcd3<=cnt7;bcd2<=cnt6;bcd1<=cnt5;bcd0<=cnt4;point<="00";
elsifcnt6>"0000"thenbcd3<=cnt6;bcd2<=cnt5;bcd1<=cnt4;bcd0<=cnt3;point<="01";
elsifcnt5>"0000"thenbcd3<=cnt5;bcd2<=cnt4;bcd1<=cnt3;bcd0<=cnt2;point<="10";
elsebcd3<=cnt4;bcd2<=cnt3;bcd1<=cnt2;bcd0<=cnt1;point<="11";
endif;
endif;
else
bcd3<="1111";bcd2<="1111";
bcd1<="1111";bcd0<="1111";
bcd1<=zkout0;bcd0<=zkout1;
endif;
endif;
endprocess;
process(clk)--分频器;
variablecnt:
integerrange0to50000;
begin
ifclk'eventandclk='1'thencnt:
=cnt+1;
ifcnt<25000thenclk_shift<='1';
elsifcnt<50000thenclk_shift<='0';
elsecnt:
=0;clk_shift<='0';
endif;
endif;
endprocess;
process(clk_shift,reset)
variablecnt:
std_logic_vector(2downto0);
begin
ifreset='1'then
cnt:
="000";shift<="1111";
elsifclk_shift'eventandclk_shift='1'then
cnt:
=cnt+1;
ifcnt="001"then
seg<="1111";
bcd<="1111";
elsifcnt="010"then
seg<="1111";
bcd<=bcd3;
elsifcnt="011"then
seg<="0111";pointout<="0111";
bcd<=bcd2;
elsifcnt="100"then
seg<="1011";pointout<="1011";
bcd<=bcd1;
elsifcnt="101"then
seg<="1101";pointout<="1101";
bcd<=bcd0;
elsifcnt="110"then
seg<="1110";pointout<="1110";
elsifcnt="111"then
bcd<="1111";
seg<="1111";
endif;
endif;
endprocess;
process(clk_shift,bcd,k5)--译码
begin
ifclk_shift'eventandclk_shift='1'then
if(k5='0')then
dp<='1';
elsif((pointout="0111"andpoint="10")or(pointout="1011"andpoint="01")or(pointout="1101"andpoint="00")or(pointout="1110"andpoint="11"))then
dp<='0';
elsedp<='1';
endif;
casebcdis
when"0000"=>data_led<="1000000";--0
when"0001"=>data_led<="1111001";--1
when"0010"=>data_led<="0100100";--2
when"0011"=>data_led<="0110000";--3
when"0100"=>data_led<="0011001";--4
when"0101"=>data_led<="0010010";--5
when"0110"=>data_led<="0000010";--6
when"0111"=>data_led<="1111000";--7
when"1000"=>data_led<="0000000";--8
when"1001"=>data_led<="0010000";--9
whenothers=>data_led<="1111111";--Nosignal;
endcase;
endif;
endprocess;
process(clkin)--占空比计算
begin
if(rising_edge(clkin))then
clkout<=notclkout;
endif;
endprocess;
process(clkin,clk)
begin
if(rising_edge(clk))then
ifclkin='1'then
cntz1<=cntz1+1;
elsifcntz1/=0then
cnq1<=cntz1;cntz1<=0;
endif;
endif;
endprocess;
process(clkout,clk)
begin
if(rising_edge(clk))then
ifclkout='1'then
cnt2<=cnt2+1;
ELSIFcnt2/=0then
cnq2<=cnt2;cnt2<=0;
endif;
endif;
endprocess;
zkb<=cnq1*100/cnq2;
z1<=CONV_STD_LOGIC_VECTOR((zkbREM10),4);
z0<=CONV_STD_LOGIC_VECTOR(((zkb/10)REM10),4);
process(clk)
begin
if(rising_edge(clk))then
if(cnt0=50000000)then
cnt0<=0;
zkout0<=Z0;
zkout1<=Z1;
elsecnt0<=cnt0+1;
endif;
endif;
endprocess;
bclk<=clkinanden;
endrtl;
五、实验结果
经过多次修改和调试,设计基本上完成了功能要求,各项结果如下:
1、能够测量出方波的频率,其范围1Hz~9.9MHz;
2、可以根据输入信号大小自动变化量程;
3、要求测量的频率绝对误差±2Hz;
4、测量响应时间小于等于10秒;
5、将测量出的频率或占空比以十进制格式在实验板上的4个数码管上显示;
6、可以通过按键选择测量和显示频率或是占空比。
测试结果附图:
六、结论分析
本设计采用EDA技术,利用直接测频法的原理和VHDL语言,采用自顶向下的设计方法,实现了1Hz~10MHz频率测量和占空比测量的四位十进制的数字频率计,并在QUARTUSⅡ软件平台下对设计项目进行了编译。
实验结果表明,该系统能够满足本次设计的要求,并且具有测量误差小,可靠性高的优点。
七、心得体会
历时一周《可编程数字系统》课程设计结束了,在这个星期中,我遇到了许多问题,而正是在解决一个个问题的过程中,我对VHDL语言的理解和认识也不断加深,对EDA技术有了进一步的了解。
这个课程设计也让我懂得,理论知识真的很重要,而实践能够加深对理论知识的理解,将理论和实践结合起来,才能设计出优秀的作品。
在这个课程设计过程中,我不只是完成一个设计,更重要的是在这一过程中所体会和学到的一些非知识技能层面的东西——细心、坚持、不断学习,我相信这会是一次难得的经历。