1、3 数字频率计的设计设计要求1设计一个能测量方波信号频率的频率计,测量结果用十进制数显示。2. 测量的频率范围是 110KHz,分成两个频段,即 1999Hz,1KHz 10KHz,用三位数码管显示测量频率,用 LED 显示表示单位,如亮绿灯表示 Hz,亮红灯表示 KHz。3. 具有自动校验和测量两种功能,即能用标准时钟校验测量精度。4. 具有超量程报警功能,在超出目前量程档的测量范围时,发出灯光和音响信号。设计提示 脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为f=N/T,f 为被测信号的频率,N 为计数器所累计的脉冲个数, T 为产生 N个脉冲所需的时间。所以,在 1 秒时间内
2、计数器所记录的结果,就是被测信号的频率。 测量/校验选择模块* 计数器模块 送存选择报警模块 锁存模块 扫描显示模块 测量/校验选择模块*输入信号:选择信号 selet 被测信号 meas 测试信号 test输出信号:CP1当 selet=0 时,为测量状态,CP1=meas;当 selet=1 时,为校验状态,CP1=test。校验与测量共用一个电路,只是被测信号 CP1 不同而已。 设置 1 秒定时信号(周期为 2 秒) ,在 1 秒定时时间内的所有被测信号送计数器输入端。 计数器对 CP1 信号进行计数,在 1 秒定时结束后,将计数器结果送锁存器锁存,同时将计数器清零,为下一次采样测量做
3、好准备。 设置量程档控制开关 K,单位显示信号 Y,当 K=0 时,为 1999Hz 量程档,数码管显示的数值为被测信号频率值,Y 显示绿色,即单位为 Hz;当 K=1时,为 1KHz10KHz 量程档,被测信号频率值为数码管显示的数值乘1000,Y 显示红色,即单位为 KHz。 设置超出量程档测量范围示警信号 alert。计数器由四级十进制计数构成(带进位 C) 。若被测信号频率小于 1KHz(K=0) ,则计数器只进行三级十进制计数,最大显示值为 999.Hz,如果被测信号频率超过此范围,示警信号驱动灯光、扬声器报警;若被测信号为 1KHz10KHz(K=1) ,计数器进行四位十进制计数,
4、取高三位显示,最大显示值为 9.99KHz,如果被测信号频率超过此范围,报警。设计文档一、原理测频的原理归结成一句话,即在单位时间内对被测信号进行计数。下图说明了测频的原理及误差产生的原因。图 1 测频的原理在上图中,假设时基信号为 1khz,则用此法测得待测信号为 1khz*7=70khz。但从图中可以看出,待测信号应该在 77khz,误差约为 7/779.1%。这个误差是比较大的,实际上,测量的脉冲个数的误差会在 间。假设所测得脉冲个数为 n,则所测频率的最大误差为 1/(n-1)*100%。显然,减小误差的方法就是增大 n。本频率计的要求测量结果以 3 位数表示,则测频误差应为 1%0.
5、1%,则 n 的取值范围为:100 nen,num=numina,display=lsb);u2:display port map(en1=en,num=numinb,display=middle);u3:display port map(en1=en,num=numinc,display=msb);end;这段程序是用类属映射的方法将一位七段数码管扩展成一个显示器的电路,其实显示器可以用图形的形式生成,但这里用这个方法主要是为了学习 VHDL的不同设计方法。图形方法的优点是比较直观,各个管脚的连接不容易出错,特别是当一个模块的包含许多子模块的时候,更能体现出图形方法的优越性。又例如:libr
6、ary ieee;use ieee.std_logic_1164.all;entity fredevider10 isgeneric (n:integer:=9);port(clkin:in std_logic;clkout:out std_logic);end;architecture behavior of fredevider10 issignal counter:integer range 0 to n;signal clk:std_logic;beginprocess(clkin)beginif rising_edge(clkin) thenif counter=n thenclki
7、f over=1thenstateif over=1 then stateif low=1 thenstateif low=1 thenstateenoutclockenendisplaydisplaydisplaydisplaydisplaydisplaydisplaydisplaydisplaydisplaydisplayen,num=numina,display=lsb);u2:display port map(en1=en,num=numinb,display=middle);u3:display port map(en1=en,num=numinc,display=msb);end;