1. 简易频率计的设计与验证

您所在的位置:网站首页 频率比的测量设计 1. 简易频率计的设计与验证

1. 简易频率计的设计与验证

2024-07-11 08:51| 来源: 网络整理| 查看: 265

1.3.3. 程序设计¶

了解了实验要求之后,根据等精度测量相关知识,我们开始实验工程的程序设计。接下来我们将会通过整体说明和分步介绍的方式,对整个实验工程做详细说明,带领读者一步步实现简易频率计的设计。

1.3.3.1. 整体说明¶

根据实验要求,结合等精度测量相关知识,实验工程整体框架如图 31‑4所示;子功能模块的简要描述,具体见表格 31‑1。

图 31‑4 实验工程整体框图

表格 31‑1 子功能模块简介

模块名称

功能描述

freq_meter

顶层模块

clk_test_gen

时钟生成模块,生成待检测时钟

freq_meter_calc

频率计算模块,检测并计算时钟频率

seg_595_dynamic

数码管显示模块,显示时钟频率

由图表可知,本实验工程包括4个子模块,其中频率计算模块(freq_meter_calc)是实验工程的核心模块,他将输入的待检测信号利用等精度测量法进行计算,得出被测时钟信号时钟频率并输出;数码管显示模块(seg_595_dynamic)接收频率计算模块输出的计算结果,并显示在数码管上;被测时钟生成模 块(clk_test_gen)负责产生某一频率的待检测时钟信号;最后的顶层模块(freq_meter),内部将上述3个子功能模块实例化其中,连接各自对应信号,外部输入时钟、复位和待检测信号,输出段选、位选和待检测数据。

数码管显示模块(seg_595_dynamic)的相关内容在前文已经有了详细介绍;被测时钟生成模块(clk_test_gen)为调用IP核生成,关于IP核的调用前面章节也有详细介绍,这两模块的内容不再赘述。

接下来,我们会分别对频率计算模块(freq_meter_calc)和顶层模块(freq_meter)的内容做一下介绍。

注:由频率计算模块输出的测量结果的单位为Hz,为提高频率计测量范围,将结果除以1000后,再传入数码管显示模块,同时数码管小数点左移三位,所以数码管显示结果的单位为MHz;被测时钟生成模块(clk_test_gen)负责产生待检测时钟信号,如有条件的读者可用信号发生器代替该模块,直接输入待检测时钟信 号。

1.3.3.2. 频率计算模块¶

模块框图

频率计算模块的作用是:使用等精度测量法对输入的待检测时钟信号进行频率测量,并将测量结果输出。频率计算模块框图,具体见图 31‑5;模块输入输出端口描述,具体见表格 31‑2。

图 31‑5 频率计算模块框图

模块内部实例化一个时钟生成IP核,负责将50MHz系统时钟信号(sys_clk)倍频生成100MHz标准时钟。

为什么要使用100MHz时钟信号作为标志信号呢?在前文的等精度测量原理中,我们知道,被测时钟信号的时钟频率fx的相对误差与被测时钟信号无关;增大“软件闸门”的有效范围或者提高“标准时钟信号”的时钟频率fs,可以减小误差,提高测量精度。

使用100 MHz时钟作为标准时钟信号,实际闸门时间大于或等于1s,就可使测量的最大相对误差小于或等于10-8,即精度达到1/100 MHz,大大提高了测量精度。

表格 31‑2 模块输入输出信号功能描述

信号

位宽

类型

功能描述

sys_clk

1Bit

Input

系统时钟,频率50MHz

sys_rst_n

1Bit

Input

复位信号。低电平有效

clk_test

1Bit

Intput

待检测时钟信号输入

freq

34Bit

Output

频率测量结果输出

模块有3路输入信号:时钟(sys_clk)、复位(sys_rst_n)和待检测时钟信号(clk_test);有输出信号1路,输出频率测量结果(freq)。

波形图绘制

在模块框图小节,我们已经对本模块做了简单介绍,接下来,我们将通过波形图的绘制,对各信号波形进行详细说明,教会读者等精度测量的实现方法。频率计算模块整体波形图如图 31‑6所示。

图 31‑6 频率计算模块整体波形图

结合等精度测量法原理,我们对各信号波形的设计与实现进行详细说明。

第一部分:软件闸门gate_s及相关信号的设计与实现

由等精度测量原理可知,实现等精度测量必不可少的是实际闸门,而实际闸门是由软件闸门得来,所以我们先来生成一下软件闸门。我们计划一个完整周期的软件闸门为1.5s,前0.25s保持低电平,中间1s保持高电平,最后0.25s保持低电平。低电平部分是为了将各计数器清0,并计算待测时钟信号时钟频率;高电平部分就 是软件闸门有效部分,高电平保持1s是为了提高测试精度,在前文已有提及。

软件闸门的生成我们需要声明计数器进行时间计数,计数时钟使用系统时钟sys_clk。声明软件闸门计数器cnt_gate_s,计数时钟为50MHz系统时钟,时钟周期为20ns,计数器cnt_gate_s初值为0,在(0 – CNT_GATE_S_MAX)范围内循环计数。

声明软件闸门gate_s,只有计数器cnt_gate_s计数在((CNT_RISE_MAX+1)-(CNT_GATE_S_MAX-CNT_RISE_MAX))范围内保持有效高电平,高电平保持时间为1s,其他时刻均为低电平。两信号波形图如下。

图 31‑7 gate_s、cnt_gate_s信号波形图

第二部分:实际闸门gate_a的设计与实现

生成软件闸门后,使用被测时钟对软件闸门进行同步生成实际闸门gate_a,实际闸门波形图如下。

图 31‑8 gate_a信号波形图

第三部分:实际闸门下,标准信号和被测信号时钟计数相关信号的波形设计与实现

在实际闸门下,分别对标准信号和被测信号的时钟周期进行计数。声明计数器cnt_clk_stand,在实际闸门下对标准时钟信号clk_stand进行时钟周期计数;声明计数器cnt_clk_test,在实际闸门下对被测时钟信号clk_test进行时钟周期计数,两计数器波形如下。

图 31‑9 cnt_clk_stand、cnt_clk_test信号波形图

计数器cnt_clk_stand、cnt_clk_test在实际闸门下计数完成后,需要进行数据清零,方便下次计数。但是被测时钟频率的计算需要计数器的数据,所以在计数器数据清零之前我们需要将计数器数据做一下寄存,对于数据寄存的时刻,我们选择实际闸门的下降沿。

声明寄存器cnt_clk_stand_reg;在标准时钟信号clk_stand同步下对实际闸门打一拍得到gate_a_s;使用实际闸门gate_a和gate_a_s得到标准时钟下的实际闸门下降沿标志信号gate_a_fall_stand。当gate_afall_stand信号为高电平时,将计数器cn t_clk_stand数值赋值给寄存器cnt_clk_stand_reg。

对于计数器cnt_clk_test的数值寄存,我们使用相同的方法,声明寄存器cnt_clk_test_reg;在被检测时钟信号clk_test同步下对实际闸门打一拍得到gate_a_t;使用实际闸门gate_a和gate_a_t得到被检测时钟下的实际闸门下降沿标志信号gate_a_fall_test 。当gate_a_fall_test信号为高电平时,将计数器cnt_clk_test数值赋值给cnt_clk_test_reg。

上述各信号的信号波形如图 31‑10所示。

图 31‑10 标准信号和被测信号时钟计数相关信号波形图

第四部分:计算标志信号calc_flag、频率计算结果freq信号波形的设计与实现

实际闸门下的标准时钟和被测时钟的周期个数已经完成计数,且对结果进行了寄存,标准时钟信号的时钟频率为已知量,得到这些参数,结合公式可以进行频率的求解。同时,新的问题出现,在哪一时刻进行数据求解。

我们可以利用最初声明的软件闸门计数器cnt_gate_s,声明计算标志信号calc_flag,在计数器cnt_gate_s计数到最大值,将calc_flag拉高一个时钟周期的高电平作为计算标志,计算被检测时钟信号时钟频率freq。两信号波形图如下。

图 31‑11 calc_flag、freq信号波形图

到了这里,频率计算模块涉及的各信号波形均已设计并实现,经过整合后就得到频率计算模块整体波形图。本模块波形图的设计仅供参考,读者也可按照自己思路设计波形图。

代码编写

波形图各信号讲解完毕,参照绘制的波形图编写模块参考代码。频率计数模块参考代码,具体见代码清单 31‑1。

代码清单 31‑1 频率计算模块参考代码(freq_meter_calc.v)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145module freq_meter_calc ( input wire sys_clk , //系统时钟,频率50MHz input wire sys_rst_n , //复位信号,低电平有效 input wire clk_test , //待检测时钟 output reg [33:0] freq //待检测时钟频率 ); //// //\* Parameter And Internal Signal \// //// //parameter define parameter CNT_GATE_S_MAX = 28'd37_499_999 , //软件闸门计数器计数最大值 CNT_RISE_MAX = 28'd6_250_000 ; //软件闸门拉高计数值 parameter CLK_STAND_FREQ = 28'd100_000_000 ; //标准时钟时钟频率 //wire define wire clk_stand ; //标准时钟,频率100MHz wire gate_a_fall_s ; //实际闸门下降沿(标准时钟下) wire gate_a_fall_t ; //实际闸门下降沿(待检测时钟下) //reg define reg [27:0] cnt_gate_s ; //软件闸门计数器 reg gate_s ; //软件闸门 reg gate_a ; //实际闸门 reg gate_a_stand ; //实际闸门打一拍(标准时钟下) reg gate_a_test ; //实际闸门打一拍(待检测时钟下) reg [47:0] cnt_clk_stand ; //标准时钟周期计数器 reg [47:0] cnt_clk_stand_reg ; //实际闸门下标志时钟周期数 reg [47:0] cnt_clk_test ; //待检测时钟周期计数器 reg [47:0] cnt_clk_test_reg ; //实际闸门下待检测时钟周期数 reg calc_flag ; //待检测时钟时钟频率计算标志信号 //// //\* Main Code \// //// //cnt_gate_s:软件闸门计数器 always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) cnt_gate_s


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3