VHDL语言设计数字频率计

上传人:缘*** 文档编号:63563906 上传时间:2022-03-19 格式:DOCX 页数:15 大小:540.32KB
返回 下载 相关 举报
VHDL语言设计数字频率计_第1页
第1页 / 共15页
VHDL语言设计数字频率计_第2页
第2页 / 共15页
VHDL语言设计数字频率计_第3页
第3页 / 共15页
点击查看更多>>
资源描述
数字频率计的设计、频率计实现的功能要设计的频率计的测量围为1MHz。为了提高测量的精度,量程分为三档,分别是:10kHz、100kHz、IMHzo并要求在测量频率大于或小于选择的量程时,频率计自动换档。1、当读数大于999时,频率计处于超量程状态,下一次测量时,量程自动增加一档。2、当读数小于009时,频率计处于欠量程状态,下一次测量时,量程自动减小一档。3、当超出测量围时,显示错误。4、在计数时不显示数据,计数完成后只显示测量结果。5、小数点位置要自动移位。二、频率计各局部的分析在这个设计中,需要用计数器来进展计数,而且计数器在各个档位要被重复使用,在测量的过程中,计数允许时钟信号还要进展调整,故将计数器设计成一个单独的模块,提供计数值的输出。显示结果包括数值显示,档位显示及溢出标志显示。其中数值显示要用到三个数码管,实验箱上连在一起的三个数码管中,只有两个数码管部接有译码器,因此我们自己还要在程序中为那个没有译码器的数码管再加一段七段译码器程序来显示结果。档位标志由三个LED灯来显示,代替数码管上的小数点的功能。溢出标志由两个LED灯来显示,其中一个显示结果溢出,另一个显示输入信号在测量围之。该频率计的顶层逻辑电路原理图如图1所示:COUNTER|ts1 signal,slg_clk en科 3:0qS3:DCYMOMETER13sreset adkq2n 口 :0Jendk cntok cntovdot2 0111out_data0GHO17jcnlak.7F玉:图1三、频率计各局部的设计和实现从上面的分析可以知道,频率计可以由三个模块来组成。下面对各个模块的设计方法和实现方法进展详细说明。1、时基进程的设计和实现在实际使用时,输入的信号是随意的,没有方法预知输入的频率。因此选取频率计的时基是非常重要的。在设计要求中,将量程分为三档,在某一档进展测量时,需要提供该档的时基。在10kHz档,该档最大读数为9.99kHz,最小读数为0.01kHz,所以要提供的时基是频率为0.01kHz的脉冲。同理,在100kHz档上,要提供的时基应该是频率为0.1kHz的脉冲。在1MHz档上,要提供的时基是频率为1kHz的脉冲。这三种脉冲信号从输入信号中提取,可以采用分频的方法来产生。将输入信号先进展分频产生1kHz的脉冲信号,然后将分频后的1kHz信号通过一个10倍的分频器,产生0.1kHz的脉冲信号,同时使用一个100倍分频器对1kHz的信号分频产生0.01kHz的脉冲信号。在测量频率时,采用输入信号作为时基,以输入信号为时钟,用一个计数器测量在一个时基周期里输入的信号的周期数,这样就可以得到输入信号的频率。产生一个高电平为时基信号周期的脉冲信号作为时基,使得能够在程序中以“如果时基信号为1作为判断条件,如果满足条件那么计数器开场计数。同理,在设计中还要产生高电平为时基信号周期的1/10和1/100的脉冲信号作为时基。这三种时基采用有限状态机来实现。状态机采用1kHz的脉冲信号触发,由于还要产生高电平为10ms和1ms的脉冲信号,故采用100个状态的有限状态机。要产生高电平为1ms的脉冲信号,只要在状态99的时候产生高电平,状态100的时候恢复到低电平即可。要产生高电平为10ms的脉冲信号,只要在状态90的时候产生高电平,在状态100的时候恢复到低电平即可。需要产生哪一个时基就根据此时频率计所在的档位作为判断条件进展控制。在100个状态中,很多状态的功能是一样的,可以将它们合并在一起。2、计数器的设计和实现为了计数方便,将计数器定义成一个整型信号。只要使用“计数器=计数器+1;就可以。这个计数值要作为显示输出,就要将这个计数器用个位、十位、百位分开表示,并且要遵循加法规那么。这样可以直接通过七段译码器进展显示。在不同的档位,小数点的位置是不同的,可以用小数点的显示所在的档位为判断条件。由于实验箱上的数码管没有小数点的,故在实验板上用三个LED灯来代替小数点的现实。计数器的VHDL语言描述如程序1所示。其中,reset为异步置位端口,sig_clk为时钟输入端口,en为信号输入端口,q1为计数值的个位输出端口,q2为计数值的十位输出端口,q3为计数值的百位输出端口。cou1为计数值的个位,cou2为计数值的十位,cou3为计数值的百位。ctrcou为控制计数功能的进程,outctr为控制计数值输出的进程。程序1:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitycounterisport(reset:instd_logic;sig_clk:instd_logic;-时钟输入端口en:instd_logic;-信号输入端口q1:outstd_logic_vector(3downto0);-计数值的个位输出端口q2:outstd_logic_vector(3downto0);-计数值的十位输出端口q3:outstd_logic_vector(3downto0);-计数值的百位输出端口end;architecturecountofcounterissignalcou1:std_logic_vector(3downto0);-计数值的个位signalcou2:std_logic_vector(3downto0);-计数值的十位signalcou3:std_logic_vector(3downto0);-计数值的百位begin-控制计数功能的进程ctrcou:process(reset,sig_clk)beginifreset=1thencou1=0000;cou2=0000;cou3=0000;elseifsig_clkeventandsig_clk=1thenifen=1thenifcou3=1010thencou3=1010;elsifcou3=1001andcou2=1001andcou1=1001thencou1=0000;cou2=0000;cou3=1010;elsifcou1=1001andcou2=1001thencou1=0000;cou2=0000;cou3=cou3+1;elsifcou1=1001thencou1=0000;cou2=cou2+1;elsecou1=cou1+1;endif;elsecou1=0000;cou2=0000;cou3=0000;endif;endif;endif;endprocessctrcou;-控制计数值输出的进程outctr:process(reset,en)beginifreset=1thenq1=0000;q2=0000;q3=0000;elseifeneventanden=0thenq1=cou1;q2=cou2;q3out_dataout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_data=0110001;endcase;endprocess;endouview;其中in_data表示输入的4位二进制数的端口,out_data为七段译码输出端口。4、有限状态机的设计和实现有限状态机程序如程序3所示。state是用于产生时基的状态机类型。在其中有开场状态start、判断状态judge、计数状态1countl、计数状态289count2to89、计数状态90count90、计数状态9198count91to98、计数状态99count99、计数状态100count100。由于计数状态289是一样的,所以将它们合成一个,同样对计数状态9198也进展合并。由于时基信号都要在计数状态100时清零,所以计数状态100单独提取。产生高电平为100ms的时基需要在计数状态1的时候将时基信号置1,从199计数状态只有99ms,在计数状态1之前的judge状态中,如果处于10kHz的档位,就要将时基信号置1。产生高电平为10ms的时基,需要在计数状态90将时基信号置1。产生高电平为1ms的时基,需要在计数状态99的时候将时基信号置1,所以计数状态1、计数状态90和计数状态99要单独提取。程序3中,mycrm是一个state类型的信号,信号crmcou用于状态机中的计数器,其计数值从0到100,信号clk1k为产生的频率为1kHz的脉冲信号。标志信号flag用于标志不同的档位,当flag为0时表示10kHz的测频档,当flag为1时表示100kHz的测频档,当flag为2时表示1MHz的测频档,当它为其他时表示溢出。程序3:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitycymometerisport(areset:instd_logic;aclk:instd_logic;q2_in:instd_logic_vector(3downto0);enclk,tok,tov:outstd_logic;dot:outstd_logic_vector(2downto0);-小数点的输出end;architecturecymofcymometeristypestateis(start,judge,count1,count2to89,count90,count91to98,count99,count100);signalmycrm:state;signalcrmcou:integerrange0to100;-状态机中的计数器signalclk1k:std_logic;-1kHz的脉冲信号signalcou1s:integerrange0to999;一产生1s显示计时信号的计数器signalclk1s:std_logic;-产生1s显示计时信号的脉冲信号signalflag:std_logic_vector(1downto0);-测频档的标志begin-使用2KHz的脉冲产生频率为1KHz的脉冲进程crclk1k:process(areset,aclk)beginifareset=1then-计数器清零clk1k=0;elseifaclkeventandaclk=1thenclk1k=notclk1k;endif;endif;endprocesscrclk1k;-产生1S的显示计时信号cr1s:process(areset,clk1k)beginifareset=1thencou1s=0;clk1s=0;elseifclk1keventandclk1k=1thenifcou1s=997thenclk1s=notclk1s;cou1s=cou1s+1;elsifcou1s=999thenclk1s=notclk1s;cou1s=0;elsecou1sdotdotdotdot=111;endcase;endprocesscrdot;-用于产生时基的状态机cretimer:process(areset,clk1k)beginifareset=1thentov=0;tok=0;crmcou=0;enclk=0;flag=01;mycrm-开场状态ifclk1s=1thencrmcou=0;enclk=0;mycrm=judge;elsemycrm=start;ifq2_in=0000orq2_in=1010thentov=1;tok=0;elsetov=0;tok-判断状态ifflag=11then-溢出档ifq2_in=1010thenflag=11;elseflag=10;endif;elsifflag=00then-10kHz测频档ifq2_in=0000thenflag=00;enclk=1;elsifq2_in=1010thenflag=01;elseflag=flag;endif;elsifflag=01then-100kHz测频档ifq2_in=0000thenflag=flag-1;enclk=1;elsifq2_in=1010thenflag=flag+1;elseflag=flag;endif;else-1MHz测频档ifq2_in=0000thenflag=flag-1;elsifq2_in=1010thenflag=flag+1;elseflag=flag;endif;endif;mycrm-计数状态1ifflag=00thenenclk=1;endif;crmcou=1;mycrm-计数状态289ifcrmcou=88thencrmcou=89;mycrm=count90;elsecrmcou=crmcou+1;mycrm-计数状态90ifflag=01thenenclk=1;endif;crmcou=90;mycrm-计数状态9198ifcrmcou=97thencrmcou=98;mycrm=count99;elsecrmcou=crmcou+1;mycrm-计数状态99if flag=10 or flag=11 then enclk=1;end if;crmcou=99;mycrm-计数状态100crmcou=100;enclk=0; mycrm null;end case;end if;end if;end process cretimer;end cym;5、频率计的综合设计将前面设计好的模块例化到一个程序里,程序 4:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;组成了所要设计的频率计。 程序如程序4 所示。entity plj isport(reset:in std_logic;clk:in std_logic;testsignal:in std_logic;q1:out std_logic_vector(3 downto 0);q2:out std_logic_vector(3 downto 0);q3:out std_logic_vector(0 to 6);tok,tov:out std_logic;dot:out std_logic_vector(2 downto 0);attribute lock :string;attribute lock of reset:signal is 34;attribute lock of clk:signal is 20;attribute lock of testsignal: signal is 52;-小数点的输出-引脚锁定attribute lock of q1:attribute lock of q2:attribute lock of q3:signal is 53,54,55,56;signal is 57,58,59,60;signal is 81,80,79,78,77,76,75;attributelockoftok:signalis17;attributelockoftov:signalis15;attributelockofdot:signalis71,70,69;end;architecturertlofpljisponentcymometer-对控制器进展元件说明port(areset:instd_logic;aclk:instd_logic;q2_in:instd_logic_vector(3downto0);enclk,tok,tov:outstd_logic;dot:outstd_logic_vector(2downto0);-小数点的输出endponent;ponentcounter-对计数器进展元件说明port(reset:instd_logic;sig_clk:instd_logic;-外部时钟输入en:instd_logic;-时基信号q1:outstd_logic_vector(3downto0);-计数值个位q2:outstd_logic_vector(3downto0);-计数值十位q3:outstd_logic_vector(3downto0);-计数值百位endponent;ponentviewis-引用七段译码器port(in_data:instd_logic_vector(3downto0);out_data:outstd_logic_vector(0to6);endponent;signalen_s:std_logic;-子模块之间接口信号说明signalq3out_s:std_logic_vector(3downto0);begin-在构造体描述中使用元件例化语句U0:cymometerportmap(reset,clk,q3out_s,en_s,tok,tov,dot);U1:counterportmap(reset,testsignal,en_s,q1,q2,q3out_s);U2:viewportmap(q3out_s,q3);endrtl;四、仿真与测试我们选用软件ModelSimSE6.0来进展功能仿真;由于译码器比拟简单,而且又不涉及时钟信号,故将译码器的仿真略去。以下分别是计数器、状态机和整合后的频率计的仿真波形:1、计数器的仿真:图2、图3为计数器的仿真波形,仿真时间设为01s,sig_clk即待测信号设定初值为0,周期20us,占空比50%,reset即复位信号设定初值为1,周期为1s,占空比为1%,en即计数允许信号设定初值为0,周期为24ms,占空比为50%。对波形的分析如下:图2图31、图2和图3的仿真设定值一样,不同之处在于图3将图例放得较大些。2reset为0,en为1时,计数器才能开场计数。3采用sig_clk的上升沿计数,en的周期为24ms高电平持续12ms,sig_clk的周期为20us,即20us一个上升沿,那么计数初值为120000/20=600,与波形仿真的结果一致。2、状态机的仿真:图4、图5为状态机的仿真波形图,其中图4显示的是016s的波形,图5显示的是9.1s10.2s的波形。两个波形的仿真设定值一样,仿真时间为020s,arese即复位信号的初值为1,周期为20s,占空比为1%;aclk即外部输入信号的初值为0,周期为500us即输入为2K的时钟信号,占空比为50%;q2_in采用counter即计数波形,周期为1s,起始值为0,终值为10,步进为1。波形的分析如下:1从图4看,q2_in为10,即溢出时,flag由设定的01切换至10,档位标志由010切换至001,即实现了自动换档功能。换档过程tok及tov信号的转变亦符合设计要求。2clk1s波形的周期为1s,高电平为2ms,在高电平状态进入judge状态;enclk周期为1s,其高电平所占时间由档位确定,从图5可看出,换档前后的enclk提供的计数时基由10ms变成1ms,这与设计要求完全相符。图4图53、整合后的频率计的仿真:图6为整合后的频率计的仿真波形。仿真时间为05s,reset即复位信号初值为1,周期为5s,占空比为1s;clk即外部输入时钟信号初值为0,周期为500us,占空比为50%,即频率为2K的时钟信号;testsignal即待测信号初值为0,周期为50us,占空比为50%,即待测信号为20K的时钟信号。波形的分析如下:图61从波形上看,从t=2s后,q1=0,q2=0,q3为2的译码值,dot=,tok=1,tov=0,频率计的输出正确地显示与输入一致20KHZ的输出信息。2在02s时间段,由于复位后q3=0,在1S之前状态机尚提供计数的时基,即在此之前计数器尚未进入正常的工作状态,但dot已进入正常的工作状态,帮dot会显示出换档信息,即从010切换至100;2s后频率计所有器件进入正常工作状态,所有的显示信息也开场正确显示。五、总结与体会1、利用实验室提供的编译软件调试时,发现复位信号的边沿触发设置存在问题,将其改为电平触发后便顺利通过。2、利用实验室提供的函数信号发生器来产生待测信号,假设使用实验板上的10M信号来作为输入的分频信号,发现实验结果与函数发生器显示的输入频率值存在很大的误差;当使用2KHZ信号来分频后,发现实验结果与输入很接近,每个档位显示的数值的最后一位与函数发生器显示的输入误差平均为3左右。考虑到函数发生器的显示也可能存在误差,我们可以认为本设计根本可实现设计要求,能正确地测量输入数字信号的频率。3、现场调试时,由于实验室软件与宿舍所用的调试软件提供器件的类型不同,在宿舍编译通过的程序到了实验室出现了很多问题,最终在教师离开之后我们才调试成功,只可惜教师已经离开,未能看到我们的展示成果。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!