2、可编程逻辑器件EPM7128的分频模块
分频模块的目的是将可编程逻辑器件EPM7128的83脚输入的12M频率信号,分频成10Hz频率信号给计数模块做基准时钟,即计时时间是100ms。
3、可编程逻辑器件EPM7128的计数模块
由分频模块分频后的10Hz信号送到计数模块,它通过门控电路,加到可以控制开、闭时间的闸门上。被测脉冲加到计数模块中闸门的输入端,开始测频时,先将计数器置0,待门控信号到来后,打开闸门,允许被测脉冲通过,计数器开始计数,直到门控信号结束,闸门关闭,停止计数。因此,当门控信号的周期为1s时,在闸门开通时间1s通过闸门的被测脉冲个数即为该被测信号的频率,为了使上位机获得更多的数据和精度,使门控信号的周期为0.1s。
以下是可编程逻辑器件EPM7128的计数模块的程序部分代码:
always @ (posedge CLK_1hz or negedge RST)
begin
if (!RST)
begin
CNT_EN=0;
LOAD=1;
end
else
begin
CNT_EN=~CNT_EN;
LOAD=~CNT_EN;
end
end
assign CNT_CLR=~(~CLK_1hz&LOAD);
assign INT=LOAD; //使用LOAD的上升沿使单片机中断。
always @(posedge CLKX or negedge CNT_CLR)
begin
if (!CNT_CLR) //当CNT_CLR为低电平到来时,OUT=0;计数器清零
OUT=0;
else if (CNT_EN)
begin
OUT=OUT+1; //当CLKX的上升沿到来时,计数器加1
end
end
always @(posedge LOAD) //当锁存信号LOAD的上升沿到来时,执行以下语句
begin
FRE=OUT; //将OUT赋值给FRE
end
endmodule
上面给出了可编程逻辑器件EPM7128的计数模块的程序关键代码。CLK_1hz表示门控信号,CLKX表示被测脉冲,RST为系统复位信号,FRE为锁存后的脉冲频率数据,INT为给单片机的中断信号,这几个信号是计数模块中的输入、输出信号。在计数模块中还有几个内部定义的信号,CNT_EN为计数允许信号,CNT_CLR为计数清零信号,LOAD表示锁存信号,OUT表示锁存前的脉冲频率信号。门控信号为10Hz,每两个时钟周期进行一次频率测量,即在每两个时钟周期CLK_1hz内,先到来半个时钟周期的CNT_CLR,用于清零;随后,CNT_EN在一个时钟周期CLK_1hz内有效,进行计数;最后,在后到来的半个时钟周期内,当LOAD的上升沿到来时,锁存计数结果。
4、51单片机AT89S52的程序
51单片机先初始化定时器、串口及中断设置等,给EPM7128发出复位信号,然后进入大循环程序,等待外中断。当EPM7128计时时间到,给AT89S52的外中断0发出中断信号,AT89S52的程序跳到外中断中,进行数据处理,分别给出选择信号SEL0~SEL2的组合,分时接收EPM7128的数据信号,再通过串口发给上位机。由于所测频率不会超过10MHz,因此只读取24位数据即可。