设计要求:输入频率范围100HZ-100KHZ,相差0-90度。
参数设计:采用50MHz晶振的FPGA实验板搭建。分两档测量,150MHZ档位测试4KHZ-100KHz频率之间信号;3MHZ档位测试100HZ-4KHZ之间信号。计数器采用16位。
思路一:构造两个计数器,一个测信号周期,另一个测相差周期。
一、输入10KHz正弦波,经过RC移相网络后有大约36度相移。需要用FPGA测相差。
代码如下
View Code
1 module Test_pha
2 (
3 input clk,
4 input rst_n,
5
6 input start,
7 input IN1,
8 input IN2,
9
10 output [23:0] N1,
11 output [23:0] N2,
12 output AheadLag,
13 output PDout
14 );
15 //超前/滞后检测模块
16 reg r_AheadLag;
17 always @(posedge IN1)
18 if(IN2==1'b1) r_AheadLag<=1'b1;//IN2 ahead IN1
19 else r_AheadLag<=1'b0;//IN2 lag IN1
20 assign AheadLag=r_AheadLag;
21 //鉴相器模块
22 assign PDout=IN1^IN2;
23
24 //控制模块
25 reg EN1;
26 wire EN2;
27 always @(posedge IN1 or negedge rst_n)
28 if(!rst_n) EN1<=1'b0;
29 else EN1<=~EN1;
30
31 //计数器N2控制模块
32 assign EN2=PDout&EN1;
33
34 //N1计数模块
35 reg [23:0] r_N1;
36 wire [23:0] r_N1_next;
37 always @ (posedge clk or negedge rst_n)
38 if(!rst_n) r_N1<=0;
39 else if(EN1==1'b1)
40 r_N1<=r_N1_next;
41 else r_N1<=0;
42
43 assign r_N1_next=r_N1+1'b1;
44 assign N1=r_N1;
45
46 //N2计数模块
47 reg [23:0] r_N2;
48 wire [23:0] r_N2_next;
49 always @ (posedge clk or negedge rst_n)
50 if(!rst_n) r_N2<=0;
51 else if(EN2==1'b1)
52 r_N2<=r_N2_next;
53 else r_N2<=0;
54
55 assign r_N2_next=r_N2+1'b1;
56 assign N2=r_N2;
57
58 endmodule
RTL级视图
RTL仿真波形
思路二:构造一个计数器,根据控制信号分别读取信号周期和相差。
模块构造分析:
1、PLL模块。提供150MHz时钟。
2、频率档位选择模块。通过Sel信号为计数器选择150M或3M时钟信号。150MHZ信号通过分频后添加测试引脚。
3、定制16位计数器,具有高电平清零端aclr。
4、触发信号。将两路信号相与产生脉冲信号,通过D触发器后输出给模块6。
5、极性判断信号。判断信号2是超前信号1还是滞后。
6、计数器控制模块。通过模块4脉冲信号控制计数器清零和计数值读取。
7、数据输出模块。将计数器的值送到外围引脚。