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

正点原子

暂无认证

  • 0浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子FPGA连载】第二十五章 频率计实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

正点原子 发布时间:2022-01-10 16:47:38 ,浏览量:0

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

第二十五章 频率计实验

数字频率计是一种基本的测量仪器,被广泛应用于航天、电子、测控等领域。基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在使用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个频率区域能保持恒定的测试精度。本章我们通过Zynq领航者开发板搭建等精度频率计,学习等精度频率计的设计思想和实现方案。 本章分为以下几个章节: 等精度频率计简介 实验任务 硬件设计 程序设计 下载验证   等精度频率计简介 频率测量在电子设计和测量领域中经常用到,因此对频率测量方法的研究在实际工程应用中具有重要意义。常用的频率测量方法有两种:周期测量法和频率测量法。周期测量法是先测量出被测信号的周期T,然后根据频率f=1/T求出被测信号的频率。频率测量法是在时间t内对被测信号的脉冲数N进行计数,然后求出单位时间内的脉冲数,即为被测信号的频率。但是上述两种方法都会产生±1个基准时钟误差或被测 时钟的误差,在实际应用中有一定的局限性。根据测量原理,很容易发现周期测量法适合于低频信号测量,频率测量法适合于高频信号测量,但二者都不能兼顾高低频率同样精度的测量要求。 等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。在计数允许时间内,同时对基准时钟和被测信号进行计数,再通过数学公式推导得到被测信号的频率。由于门控信号是被测信号的整数倍,就消除了对被测信号产生的±l周期误差,但是会产生对基准时钟±1周期的误差。等精度测量原理如图 7.5.13.1所示。 在这里插入图片描述

图 7.5.13.1 等精度测量原理 从以上叙述的等精度的测量原理可以很容易得出如下结论:首先,被测信号频率clk_fx的相对误差与被测信号的频率无关;其次,增大测量时间段“软件闸门”或提高“标频”clk_fs,可以减小相对误差,提高测量精度;最后,由于一般提供基准时钟clk_fs的石英晶振稳定性很高,所以基准时钟的相对误差很小,可忽略。假设基准时钟的频率为100MHz,只要实际闸门时间大于或等于1s,就可使测量的最大相对误差小于或等于10^(-8),即精度达到1/100MHz。等精度测量的核心思想在于如何保证在实际测量门闸内被测信号为整数个周期,这就需要在设计中让实际测量门闸信号与被测信号建立一定的关系。基于这种思想,设计中以被测信号的上升沿作为开启门闸和关闭门闸的驱动信号,只有在被测信号的上升沿才将图 7.5.13.1中预置的“软件闸门”的状态锁存,因此在“实际闸门”Tx内被测信号的个数就能保证整数个周期,这样就避免普通测量方法中被测信号的±1的误差,但会产生高频的基准时钟信号的±l周期误差,由于基准时钟频率远高于被测信号,因此它产生的±1周期误差对测量精度的影响十分有限,特别是在中低频测量的时候,相较于传统的频率测量和周期测量方法,可以大大提高测量精度。 等精度测频的原理图如图 7.5.13.2所示。图中,预置软件闸门信号GATE是由Zynq的定时模块产生,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,则由公式 (fs_cnt)/(CLK_FS)=GATE_TIME=(fx_cnt)/(clk_fx) (1-1) 推出: clk_fx=fx_cnt×(CLK_FS)/(fs_cnt) (1-2) 图 7.5.13.2中的所有功能都在ZYNQ PL端实现。 在这里插入图片描述

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

图 7.5.13.1 硬件原理图 由于端口引脚较多,这里仅给出部分管脚列表,如下表所示: 表 25.3.1 等精度频率计实验管脚分配 信号名 方向 管脚 端口说明 电平标准 sys_clk input U18 系统时钟,50M LVCMOS33 sys_rst_n input N16 系统复位,低有效 LVCMOS33 clk_fx input J14 被测时钟 LVCMOS33 clk_out output K14 输出时钟 LVCMOS33 程序设计 根据实验任务,我们可以大致规划出系统的控制流程:首先我们设计一个测试时钟模块用于生成被测的时钟,然后用等精度频率计模块测量被测时钟的频率,并将测得的时钟频率值送入LCD显示模块进行显示。由此画出系统的功能框图如下所示: 在这里插入图片描述

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

图 7.5.13.2 顶层模块原理图 等精度频率计模块(cymometer):等精度频率计模块测量输入的被测时钟的频率。并将测得的频率结果输出。 时钟产生模块(clk_test):时钟产生模块产生被测的时钟。 LCD显示模块(lcd_rgb_char):将等精度频率计测得的时钟频率值在LCD上显示出来。 顶层模块的代码如下:

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   
10      //RGB LCD接口 
11      output             lcd_hs  ,     //LCD 行同步信号
12      output             lcd_vs  ,     //LCD 场同步信号
13      output             lcd_de  ,     //LCD 数据输入使能
14      inout      [23:0]  lcd_rgb ,     //LCD RGB565颜色数据
15      output             lcd_bl  ,     //LCD 背光控制信号
16      output             lcd_clk       //LCD 采样时钟
17      
18  );
19  
20  //parameter define
21  parameter    CLK_FS = 26'd50000000;  // 基准时钟频率值
22  
23  //wire define
24  wire    [19:0]       data_fx;        // 被测信号测量值
25  
26  //*****************************************************
27  //**                    main code
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  clk_test #(.DIV_N(7'd100)            // 分频系数
43  ) u_clk_test(
44      //源时钟
45      .clk_in      (sys_clk  ),        // 输入时钟
46      .rst_n       (sys_rst_n),        // 复位信号
47      //分频后的时钟
48      .clk_out     (clk_out  )         // 测试时钟
49  );
50  
51  //例化LCD显示模块
52  lcd_rgb_char  u_lcd_rgb_char
53  (
54     .sys_clk    (sys_clk),
55     .sys_rst_n  (sys_rst_n),
56     .data       (data_fx),
57     //RGB LCD接口 
58     .lcd_hs     (lcd_hs),       //LCD 行同步信号
59     .lcd_vs     (lcd_vs),       //LCD 场同步信号
60     .lcd_de     (lcd_de),       //LCD 数据输入使能
61     .lcd_rgb    (lcd_rgb),      //LCD RGB565颜色数据
62     .lcd_bl     (lcd_bl),       //LCD 背光控制信号
63     .lcd_clk    (lcd_clk)       //LCD 采样时钟
64  );
65  
66  endmodule

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

1   module clk_test #(parameter DIV_N = 7'd100)    //分频系数
2       (
3        //源时钟
4        input        clk_in     ,                 // 输入时钟
5        input        rst_n      ,                 // 复位信号
6        //分频后的时钟
7        output  reg  clk_out                      // 输出时钟
8   );
9   
10  //reg define
11  reg [9:0] cnt;                                 // 时钟分频计数
12  
13  //*****************************************************
14  //**                    main code
15  //*****************************************************
16  
17  //时钟分频,生成500KHz的测试时钟
18  always @(posedge clk_in or negedge rst_n) begin
19      if(rst_n == 1'b0) begin
20          cnt                 
关注
打赏
1665308814
查看更多评论
0.0495s