频率测试fpga实现

一种简单的频率测试方法及Verilog 实现 (2012-05-23 22:30:35)

转载▼

标签:

verilog

对于频率测量,有很多的测试方法,这里我们介绍一种采用基准频率计数的方法测试频率。该测试方法非常容易理解。首先设计两个计数器BASE_CLK_CNT和CLK_TST_CNT,基准时钟BASE_CLK作为计数器BASE_CLK_CNT的输入时钟,被测信号CLK_TST作为CLK_TST_CNT的输入时钟。两个计数器同时开始计数,当CLK_TST_CNT计数到n 时计数结束,这个时候根据BASE_CLK_CNT的值m 和BASE_CLK的频率,可以计算出CLK_TST的频率。

在上述的测频方法中,两个计数器同时开始计数是整个设计的难点。由于

CLK_TST和BASE_CLK是两个异步信号,如果不对信号做特定的处理,就很难做到两个计数器同时开始计数。而且由于两个信号时异步信号,所以在做电路设计时,如果不做相应的处理,容易引起系统的不稳定。

这里我们采用的方法是,用最基本的CDC 电路来处理CLK_TST,使之转换为与BASE_CLK在同一时钟域的信号,然后再进行频率测量。这里最基本的CDC 电路也就是把CLK_TST用BASE_CLK锁两拍,然后生成新的CLK_TST信号。下面是具体的verilog 实现:CLK_TST为输入信号,CLK_TST_2Q为输出的与BASE_CLK同时钟域的信号。经过这样的处理,整个频率测量电路的设计就可以在同一个时钟域中进行。

reg CLK_TST_Q;

reg CLK_TST_2Q;

always @(posedge BASE_CLK or negedge RESET)

begin

if(~RESET) begin

CLK_TST_Q

CLK_TST_2Q

end

else begin

CLK_TST_Q

CLK_TST_2Q

end

end

不过这样做的结果就是引入测量误差,其绝对值小于4个BASE_CLK周期(测试周期开始的点0~2 BASE_CLK周期,测试周期结束的点0~2BASE_CLK周期,综合起来,应该小于4个BASE_CLK周期,一般情况下,应该是小于2个BASE_CLK周期)。下图是上述电路的仿真波形:

通常情况下,带来的误差是两条竖线之间的长度,比较差的情况下,误差会再加上一个BASE_CLK的周期。

CLK_TST_2Q的被测信号与BASE_CLK有相同的上升沿,所以我们在CLK_TST_2Q上升沿的时候让两个计数器都开始计数。当CLK_TST_CNT计数到n 时,两个计数器同时停止计数。而对于n 的选取,则要根据测试精度,CLK_TST的稳定度,BASE_CLK的频率等各方面的要求来设定。不过建议数值最好选用2*x。这样便于后继的数据处理,在计算CLK_TST的时候,可以直接对BASE_CLK_CNT进行移位处理。

采用一个简单的状态机来实现这个测频电路。状态机有三个状态,FT_IDLE,

FT_TST和FT_DOUT。系统复位或者一次测量结束以后,状态机进入FT_IDLE状态,当TST_EN信号有效的时候,开始进行频率测量。当CLK_TST_CNT的计数值达到n (在该例子中,我们选择64)的时候,进入FT_DOUT状态。FT_DOUT状态持续的时间,由一个小的计数器的计数值来决定,我们可以通过改变这个计数器的值来让数据输出的时间符合后继处理电路的要求。

这个例程中直接给出BASE_CLK_CNT的值,CLK_TST的频率值还需要换算电路做进一步的处理,但这里不再给出。

下面是测频电路的verilog 实现:

module FRE_TST(

BASE_CLK, //base clock,default is 100MHz

CLK_TST, //clock on test

RESET, //async system reset

TST_EN, //test enable signal

DATA_OUT, //24bit test data out to uart

DATA_OUT_EN //24bit test data out enable

);

input BASE_CLK;

input CLK_TST;

input RESET;

input TST_EN;

output [23:0] DATA_OUT;

output DATA_OUT_EN;

parameter FT_IDLE = 3'b001,

FT_TST = 3'b010,

FT_DOUT = 3'b100;

reg [2:0] FTSTSM, FTSTSMNXT;

wire PHASE_FT_IDLE = FTSTSM[0];

wire PHASE_FT_TST = FTSTSM[1];

wire PHASE_FT_DOUT = FTSTSM[2];

wire PHASENXT_FT_DOUT = FTSTSMNXT[2];

wire PHASENXT_FT_TST = FTSTSMNXT[1];

reg CLK_TST_Q;

reg CLK_TST_2Q;

always @(posedge BASE_CLK or negedge RESET)

begin

if(~RESET)

begin

CLK_TST_Q

CLK_TST_2Q

end

else

begin

CLK_TST_Q

CLK_TST_2Q

end

end

reg [23:0] BASE_CLK_CNT;

reg [11:0] CLK_TST_CNT;

always @(posedge CLK_TST_2Q or negedge RESET) begin

if(~RESET)

CLK_TST_CNT

else if(PHASE_FT_IDLE)

CLK_TST_CNT

else if(CLK_TST_CNT == 12'b0000_0100_0001)

CLK_TST_CNT

else if(PHASE_FT_TST )

CLK_TST_CNT

else

CLK_TST_CNT

end

wire TST_END_TMP = (CLK_TST_CNT == 12'b0000_0100_0001) ; //count 65 reg TST_END_TMP_Q;

always @(posedge BASE_CLK or negedge RESET)

begin

if(~RESET)

TST_END_TMP_Q

else

TST_END_TMP_Q

end

wire TST_END = ~TST_END_TMP_Q & TST_END_TMP;

reg [2:0] data_out_cnt;

always @(posedge BASE_CLK or negedge RESET) begin

if(~RESET)

data_out_cnt

else if(PHASE_FT_IDLE)

data_out_cnt

else if(PHASE_FT_DOUT)

data_out_cnt

else

data_out_cnt

end

wire DATA_OUT_END;

assign DATA_OUT_END = (data_out_cnt == 3'd5);

always @(posedge BASE_CLK or negedge RESET) begin

if(~RESET)

BASE_CLK_CNT

else if( PHASE_FT_TST )

BASE_CLK_CNT

else if(PHASE_FT_IDLE)

BASE_CLK_CNT

else

BASE_CLK_CNT

end

always @(posedge BASE_CLK or negedge RESET) begin

if(~RESET)

FTSTSM

else

FTSTSM

end

always @(FTSTSM or TST_EN or CLK_TST_2Q or TST_END or DATA_OUT_END) begin FTSTSMNXT = FTSTSM;

case (FTSTSM)

FT_IDLE:

if(TST_EN & CLK_TST_2Q)

FTSTSMNXT = FT_TST;

else

FTSTSMNXT = FT_IDLE;

FT_TST:

if(TST_END)

FTSTSMNXT = FT_DOUT;

else

FTSTSMNXT = FT_TST;

FT_DOUT:

if(DATA_OUT_END)

FTSTSMNXT = FT_IDLE;

else

FTSTSMNXT = FT_DOUT;

default:

FTSTSMNXT = FT_IDLE;

endcase

end

assign DATA_OUT_EN = PHASE_FT_DOUT;

assign DATA_OUT = BASE_CLK_CNT;

endmodule

下面是仿真的结果:

BASE_CLK的周期是5ns ,CLK_TST的周期是1000ns 。

n 值取65时,BASE_CLK_CNT和CLK_TST_CNT在测量结束时的值:

一种简单的频率测试方法及Verilog 实现 (2012-05-23 22:30:35)

转载▼

标签:

verilog

对于频率测量,有很多的测试方法,这里我们介绍一种采用基准频率计数的方法测试频率。该测试方法非常容易理解。首先设计两个计数器BASE_CLK_CNT和CLK_TST_CNT,基准时钟BASE_CLK作为计数器BASE_CLK_CNT的输入时钟,被测信号CLK_TST作为CLK_TST_CNT的输入时钟。两个计数器同时开始计数,当CLK_TST_CNT计数到n 时计数结束,这个时候根据BASE_CLK_CNT的值m 和BASE_CLK的频率,可以计算出CLK_TST的频率。

在上述的测频方法中,两个计数器同时开始计数是整个设计的难点。由于

CLK_TST和BASE_CLK是两个异步信号,如果不对信号做特定的处理,就很难做到两个计数器同时开始计数。而且由于两个信号时异步信号,所以在做电路设计时,如果不做相应的处理,容易引起系统的不稳定。

这里我们采用的方法是,用最基本的CDC 电路来处理CLK_TST,使之转换为与BASE_CLK在同一时钟域的信号,然后再进行频率测量。这里最基本的CDC 电路也就是把CLK_TST用BASE_CLK锁两拍,然后生成新的CLK_TST信号。下面是具体的verilog 实现:CLK_TST为输入信号,CLK_TST_2Q为输出的与BASE_CLK同时钟域的信号。经过这样的处理,整个频率测量电路的设计就可以在同一个时钟域中进行。

reg CLK_TST_Q;

reg CLK_TST_2Q;

always @(posedge BASE_CLK or negedge RESET)

begin

if(~RESET) begin

CLK_TST_Q

CLK_TST_2Q

end

else begin

CLK_TST_Q

CLK_TST_2Q

end

end

不过这样做的结果就是引入测量误差,其绝对值小于4个BASE_CLK周期(测试周期开始的点0~2 BASE_CLK周期,测试周期结束的点0~2BASE_CLK周期,综合起来,应该小于4个BASE_CLK周期,一般情况下,应该是小于2个BASE_CLK周期)。下图是上述电路的仿真波形:

通常情况下,带来的误差是两条竖线之间的长度,比较差的情况下,误差会再加上一个BASE_CLK的周期。

CLK_TST_2Q的被测信号与BASE_CLK有相同的上升沿,所以我们在CLK_TST_2Q上升沿的时候让两个计数器都开始计数。当CLK_TST_CNT计数到n 时,两个计数器同时停止计数。而对于n 的选取,则要根据测试精度,CLK_TST的稳定度,BASE_CLK的频率等各方面的要求来设定。不过建议数值最好选用2*x。这样便于后继的数据处理,在计算CLK_TST的时候,可以直接对BASE_CLK_CNT进行移位处理。

采用一个简单的状态机来实现这个测频电路。状态机有三个状态,FT_IDLE,

FT_TST和FT_DOUT。系统复位或者一次测量结束以后,状态机进入FT_IDLE状态,当TST_EN信号有效的时候,开始进行频率测量。当CLK_TST_CNT的计数值达到n (在该例子中,我们选择64)的时候,进入FT_DOUT状态。FT_DOUT状态持续的时间,由一个小的计数器的计数值来决定,我们可以通过改变这个计数器的值来让数据输出的时间符合后继处理电路的要求。

这个例程中直接给出BASE_CLK_CNT的值,CLK_TST的频率值还需要换算电路做进一步的处理,但这里不再给出。

下面是测频电路的verilog 实现:

module FRE_TST(

BASE_CLK, //base clock,default is 100MHz

CLK_TST, //clock on test

RESET, //async system reset

TST_EN, //test enable signal

DATA_OUT, //24bit test data out to uart

DATA_OUT_EN //24bit test data out enable

);

input BASE_CLK;

input CLK_TST;

input RESET;

input TST_EN;

output [23:0] DATA_OUT;

output DATA_OUT_EN;

parameter FT_IDLE = 3'b001,

FT_TST = 3'b010,

FT_DOUT = 3'b100;

reg [2:0] FTSTSM, FTSTSMNXT;

wire PHASE_FT_IDLE = FTSTSM[0];

wire PHASE_FT_TST = FTSTSM[1];

wire PHASE_FT_DOUT = FTSTSM[2];

wire PHASENXT_FT_DOUT = FTSTSMNXT[2];

wire PHASENXT_FT_TST = FTSTSMNXT[1];

reg CLK_TST_Q;

reg CLK_TST_2Q;

always @(posedge BASE_CLK or negedge RESET)

begin

if(~RESET)

begin

CLK_TST_Q

CLK_TST_2Q

end

else

begin

CLK_TST_Q

CLK_TST_2Q

end

end

reg [23:0] BASE_CLK_CNT;

reg [11:0] CLK_TST_CNT;

always @(posedge CLK_TST_2Q or negedge RESET) begin

if(~RESET)

CLK_TST_CNT

else if(PHASE_FT_IDLE)

CLK_TST_CNT

else if(CLK_TST_CNT == 12'b0000_0100_0001)

CLK_TST_CNT

else if(PHASE_FT_TST )

CLK_TST_CNT

else

CLK_TST_CNT

end

wire TST_END_TMP = (CLK_TST_CNT == 12'b0000_0100_0001) ; //count 65 reg TST_END_TMP_Q;

always @(posedge BASE_CLK or negedge RESET)

begin

if(~RESET)

TST_END_TMP_Q

else

TST_END_TMP_Q

end

wire TST_END = ~TST_END_TMP_Q & TST_END_TMP;

reg [2:0] data_out_cnt;

always @(posedge BASE_CLK or negedge RESET) begin

if(~RESET)

data_out_cnt

else if(PHASE_FT_IDLE)

data_out_cnt

else if(PHASE_FT_DOUT)

data_out_cnt

else

data_out_cnt

end

wire DATA_OUT_END;

assign DATA_OUT_END = (data_out_cnt == 3'd5);

always @(posedge BASE_CLK or negedge RESET) begin

if(~RESET)

BASE_CLK_CNT

else if( PHASE_FT_TST )

BASE_CLK_CNT

else if(PHASE_FT_IDLE)

BASE_CLK_CNT

else

BASE_CLK_CNT

end

always @(posedge BASE_CLK or negedge RESET) begin

if(~RESET)

FTSTSM

else

FTSTSM

end

always @(FTSTSM or TST_EN or CLK_TST_2Q or TST_END or DATA_OUT_END) begin FTSTSMNXT = FTSTSM;

case (FTSTSM)

FT_IDLE:

if(TST_EN & CLK_TST_2Q)

FTSTSMNXT = FT_TST;

else

FTSTSMNXT = FT_IDLE;

FT_TST:

if(TST_END)

FTSTSMNXT = FT_DOUT;

else

FTSTSMNXT = FT_TST;

FT_DOUT:

if(DATA_OUT_END)

FTSTSMNXT = FT_IDLE;

else

FTSTSMNXT = FT_DOUT;

default:

FTSTSMNXT = FT_IDLE;

endcase

end

assign DATA_OUT_EN = PHASE_FT_DOUT;

assign DATA_OUT = BASE_CLK_CNT;

endmodule

下面是仿真的结果:

BASE_CLK的周期是5ns ,CLK_TST的周期是1000ns 。

n 值取65时,BASE_CLK_CNT和CLK_TST_CNT在测量结束时的值:


相关文章

  • 电子系统设计综合实验
  • 电子系统设计综合实验指导书 (选择以下项目中的一项作为综合实验项目). 项目一 等精度频率计 一.课程设计目的 1.进一步熟悉Quartus Ⅱ的软件使用方法,熟悉keil 软件使用: 2. 熟悉单片机与可编程逻辑器件的开发流程及硬件测试方 ...查看


  • 频率特性测试仪
  • <国外电子元器件>2008年第12期测控与仪器仪表 频率特性测试仪 施智强,何欣,唐铭杰,沈骋曦 (武汉大学电子信息学院,湖北武汉430079) 摘要:以集成的直接数字合成器(DDS)AD9851为核心,利用现场可编程门阵列(F ...查看


  • 波形发生器 1
  • 电子设计大赛 -波形发生器 目 录 1 2 引言 ............................................................................................... ...查看


  • 基于FPGA的嵌入式逻辑分析仪设计
  • 第21卷第1期 2006年2月 长沙电力学院学报(自然科学版) Vol.21Feb. No.1 JOURNALOFCHANGSHAUNIVERSITYOFELECTRICPOWER(NATURALSCIENCE) 2006 基于FPGA的嵌 ...查看


  • 频率特性测试仪的设计
  • 第17卷第2期 V01.17 No.2 电子设计工程 ElectronicDesignEngineering 2009年2月 Feb.2009 频率特性测试仪的设计 伍玉.夏新凡 (武汉大学电子信息学院,湖北武汉430079) 摘要:以89 ...查看


  • 通信工程设计
  • AMI编译码程序设计 一.预备知识 1. quartus II软件的使用方法. 2. verilog语言知识. 3. 通信原理课本中关于AMI编译码部分的知识. 二.实验目的 1. 验证二次开发例程,了解用FPGA实现AMI编译码的方法. ...查看


  • 正弦信号发生器设计论文
  • 安徽工贸职业技术学院 毕业论文(设计) 论文题目: 正弦信号发生器设计 姓 名: 欧阳高翔 指导教师: 崔璨 提交日期: 2009年4月 专 业: 生产过程自动化 正弦信号发生器设计 摘要:本设计基于两个函数信号发生器芯片MAX038和FP ...查看


  • 等精度数字频率计
  • 等精度数字频率计测量方法: 一. 测频原理 所谓"频率",就是周期性信号在单位时间变化的次数.电子计数器是严格按照f =N/T的定义进行测频,其对应的测频原理方框图和工作时间波形如图1 所示.从图中可以看出测量过程:输入 ...查看


  • EDA实验正弦波信号发生器设计
  • 实验八 正弦信号发生器的设计 一.实验目的 1.学习用VHDL设计波形发生器和扫频信号发生器. 2.掌握FPGA对D/A的接口和控制技术,学会LPM_ROM在波形发生器设计中的实用方法. 二.实验仪器 PC机 . EDA实验箱 一台 Qua ...查看


热门内容