您当前的位置: 首页 >  fpga开发

正点原子

暂无认证

  • 0浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子FPGA连载】第二十九章频率计实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

正点原子 发布时间:2021-11-04 12:09:27 ,浏览量:0

1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 4)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第二十九章频率计实验

数字频率计是一种基本的测量仪器,被广泛应用于航天、电子、测控等领域。基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在使用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个频率区域能保持恒定的测试精度。本章我们通过新起点开发板搭建等精度频率计,学习等精度频率计的设计思想和实现方案。 本章分为以下几个章节: 2828.1简介 28.2实验任务 28.3硬件设计 28.4程序设计 28.5下载验证

29.1简介 频率测量在电子设计和测量领域中经常用到,因此对频率测量方法的研究在实际工程应用中具有重要意义。常用的频率测量方法有两种:周期测量法和频率测量法。周期测量法是先测量出被测信号的周期T,然后根据频率求出被测信号的频率。频率测量法是在时间t内对被测信号的脉冲数N进行计数,然后求出单位时间内的脉冲数,即为被测信号的频率。但是上述两种方法都会产生±1个基准时钟误差或被测时钟的误差,在实际应用中有一定的局限性。根据测量原理,很容易发现周期测量法适合于低频信号测量,频率测量法适合于高频信号测量,但二者都不能兼顾高低频率同样精度的测量要求。 等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。在计数允许时间内,同时对基准时钟和被测信号进行计数,再通过数学公式推导得到被测信号的频率。由于门控信号是被测信号的整数倍,就消除了对被测信号产生的±l周期误差,但是会产生对基准时钟±1周期的误差。等精度测量原理如图 29.1.1所示。 在这里插入图片描述

图 29.1.1 等精度测量原理 从以上叙述的等精度的测量原理可以很容易得出如下结论:首先,被测信号频率clk_fx的相对误差与被测信号的频率无关;其次,增大测量时间段“软件闸门”或提高“标频”clk_fs,可以减小相对误差,提高测量精度;最后,由于一般提供基准时钟clk_fs的石英晶振稳定性很高,所以基准时钟的相对误差很小,可忽略。假设基准时钟的频率为100MHz,只要实际闸门时间大于或等于1s,就可使测量的最大相对误差小于或等于10^(-8),即精度达到1/100MHz。等精度测量的核心思想在于如何保证在实际测量门闸内被测信号为整数个周期,这就需要在设计中让实际测量门闸信号与被测信号建立一定的关系。基于这种思想,设计中以被测信号的上升沿作为开启门闸和关闭门闸的驱动信号,只有在被测信号的上升沿才将图 29.1.1中预置的“软件闸门”的状态锁存,因此在“实际闸门”Tx内被测信号的个数就能保证整数个周期,这样就避免普通测量方法中被测信号的±1的误差,但会产生高频的基准时钟信号的±l周期误差,由于基准时钟频率远高于被测信号,因此它产生的±1周期误差对测量精度的影响十分有限,特别是在中低频测量的时候,相较于传统的频率测量和周期测量方法,可以大大提高测量精度。 等精度测频的原理图如图 29.1.2所示。如图中所示,预置软件闸门信号Gate是由新起点开发板的定时模块产生,gate的时间宽度对测频精度的影响较小,故可以在较大的范围内选择,GATE信号经被测时钟clk_fx同步化(图中的D触发器)到被测时钟域下。另外,为了方便处理,这里选择预置闸门信号的长度由参数GATE_TIME设置。图中的fs_cnt和fx_cnt是2个可控的32位高速计数器,fs_cnt_en和fx_cnt_en分别是其计数使能端,由同步化后的gate信号控制,基准时钟信号clk_fs从时钟输入端clk_fs输入,待测信号clk_fx从时钟输入端clk_fx输入。测量时,生成的gate信号,在被测时钟同步化后用来控制启动和关闭2个计数器,2个计数器分别对被测信号和基准时钟计数。若在一次实际闸门时间GATE_TIME中,计数器对被测信号的计数值为fx_cnt,对基准时钟的计数值为fs_cnt,而基准时钟的频率为CLK_FS,则被测信号的频率为clk_fx,则由公式 在这里插入图片描述 图 29.1.2 是新起点开发板实现功能的原理图。 在这里插入图片描述

图 29.1.2 新起点实现的功能的原理图 29.2实验任务 本次的实验任务是板载50MHz的时钟通过内部逻辑进行分频,来产生500KHz频率的信号,作为被测时钟,然后用Verilog HDL编写的等精度测量模块测量被测时钟,并通过数码管显示。 29.3硬件设计 本次实验只需将新起点开发板P6扩展口的两个IO使用跳帽或者杜邦线连接即可。本次实验将新起点开发板的N9引脚做为分频产生的时钟的输出端,P9引脚作为被测时钟的输入端,通过一根导线(杜邦线)或者跳帽进行连接。 在这里插入图片描述

图 29.3.1 硬件原理图 由于端口引脚较多,这里仅给出部分管脚列表,如下表所示: 表 29.3.1 等精度频率计实验管脚分配 在这里插入图片描述

XDC约束语句如下: set_location_assignment PIN_M2 -to sys_clk set_location_assignment PIN_M1 -to sys_rst_n set_location_assignment PIN_P9 -to clk_fx set_location_assignment PIN_N9 -to clk_out 29.4程序设计 根据实验任务,我们可以大致规划出系统的控制流程:首先我们设计一个测试时钟模块用于生成被测的时钟,然后用等精度频率计模块测量被测时钟的频率,并将测得的时钟频率值送入数码管显示模块进行显示。由此画出系统的功能框图如下所示: 在这里插入图片描述

图 29.4.1 等精度频率计实验系统框图 由系统框图可知,FPGA部分包括四个模块:顶层模块(top_cymometer)、等精度频率计模块(cymometer)、时钟产生模块(test_pll)以及数码管显示模块(seg_led)。各模块功能如下: 顶层模块(top_cymometer):顶层模块完成了对其它三个模块的例化,实现各模块之间的数据交互。时钟产生模块产生被测时钟输出,并从外部接入至等精度频率计模块,以进行频率测量,将测量的结果传输给数码管显示模块进行显示。顶层模块的原理图如下图所示: 在这里插入图片描述

图 29.4.2 顶层模块原理图 等精度频率计模块(cymometer):等精度频率计模块测量输入的被测时钟的频率。并将测得的频率结果输出。 时钟产生模块(test_pll):时钟产生模块产生被测的时钟。 数码管显示模块(seg_led):用来驱动数码管将等精度频率计测得的时钟频率值在数码管上显示出来。 顶层模块的代码如下:

1   module top_cymometer(
2       //system clock
3       input                  sys_clk  ,    // 时钟信号
4       input                  sys_rst_n,    // 复位信号
5   
6       //cymometer interface
7       input                  clk_fx   ,    // 被测时钟
8       output                 clk_out  ,    // 输出时钟
9       //user interface
10      output          [5:0]  sel      ,    // 数码管位选
11      output          [7:0]  seg_led       // 数码管段选
12  );
13  
14  //parameter define
15  parameter    CLK_FS = 26'd50000000;      // 基准时钟频率值
16  
17  //wire define
18  wire    [19:0]       data_fx;            // 被测信号测量值
19  
20  //*****************************************************
21  //**                    main code
22  //*****************************************************
23  
24  //例化PLL,生成待测试时钟500Khz
25  test_pll    test_pll_inst (
26      .inclk0           (sys_clk  ),
27      .c0               (clk_out  )
28      );
29  
30  //例化等精度频率计模块
31  cymometer #(.CLK_FS(CLK_FS)              // 基准时钟频率值
32  ) u_cymometer(
33      //system clock
34      .clk_fs      (sys_clk  ),            // 基准时钟信号
35      .rst_n       (sys_rst_n),            // 复位信号
36      //cymometer interface
37      .clk_fx      (clk_fx   ),            // 被测时钟信号
38      .data_fx     (data_fx  )             // 被测时钟频率输出
39  );
40      
41  //例化数码管显示模块
42  seg_led u_seg_led(
43      //module clock
44      .clk         (sys_clk  ),            // 数码管驱动模块的驱动时钟
45      .rst_n       (sys_rst_n),            // 复位信号
46      //seg_led interface
47      .seg_sel     (sel      ),            // 数码管位选
48      .seg_led     (seg_led  ),            // 数码管段选
49      //user interface
50      .data        (data_fx  ),            // 被测频率值
51      .point       (6'd0     ),            // 数码管显示的点控制
52      .en          (1'b1     ),            // 数码管驱动使能信号
53      .sign        (1'b0     )             // 控制符号位显示
54  );
55  
56  endmodule

顶层代码主要完成对各模块的例化并实现模块信号间的交互。第15行的基准时钟频率值参数为基准时钟频率值,当用不同的基准时钟时修改此参数即可。 等精度频率计模块的代码如下:

1   module cymometer
2   #(parameter    CLK_FS = 26'd50_000_000) // 基准时钟频率值
3       (   //system clock
4           input                 clk_fs ,     // 基准时钟信号
5           input                 rst_n  ,     // 复位信号
6   
7           //cymometer interface
8           input                 clk_fx ,     // 被测时钟信号
9           output   reg [19:0]   data_fx      // 被测时钟频率输出
10  );
11  
12  //parameter define
13  localparam   MAX       =  6'd32;           // 定义fs_cnt、fx_cnt的最大位宽
14  localparam   GATE_TIME = 16'd5_000;        // 门控时间设置
15  
16  //reg define
17  reg                gate        ;           // 门控信号
18  reg                gate_fs     ;           // 同步到基准时钟的门控信号
19  reg                gate_fs_r   ;           // 用于同步gate信号的寄存器
20  reg                gate_fs_d0  ;           // 用于采集基准时钟下gate下降沿
21  reg                gate_fs_d1  ;           // 
22  reg                gate_fx_d0  ;           // 用于采集被测时钟下gate下降沿
23  reg                gate_fx_d1  ;           // 
24  reg    [   63:0]   data_fx_t    ;          // 
25  reg    [   15:0]   gate_cnt    ;           // 门控计数
26  reg    [MAX-1:0]   fs_cnt      ;           // 门控时间内基准时钟的计数值
27  reg    [MAX-1:0]   fs_cnt_temp ;           // fs_cnt 临时值
28  reg    [MAX-1:0]   fx_cnt      ;           // 门控时间内被测时钟的计数值
29  reg    [MAX-1:0]   fx_cnt_temp ;           // fx_cnt 临时值
30  
31  //wire define
32  wire               neg_gate_fs;            // 基准时钟下门控信号下降沿
33  wire               neg_gate_fx;            // 被测时钟下门控信号下降沿
34  
35  //*****************************************************
36  //**                    main code
37  //*****************************************************
38  
39  //边沿检测,捕获信号下降沿
40  assign neg_gate_fs = gate_fs_d1 & (~gate_fs_d0);
41  assign neg_gate_fx = gate_fx_d1 & (~gate_fx_d0);
42  
43  //门控信号计数器,使用被测时钟计数
44  always @(posedge clk_fx or negedge rst_n) begin
45      if(!rst_n)
46          gate_cnt             
关注
打赏
1665308814
查看更多评论
0.0478s