FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享,行业资讯-正文

基于FPGA的频率计设计

FPGA小白FPGA小白
技术分享, 行业资讯
3年前
0
0
964

一、原理介绍

1.什么是频率计

频率计是一种专门对被测信号频率进行测量的电子测量仪器。本实验是基于FPGA的频率计,所以主要用于测量方波,若需要测其他波形,则需要加入前级信号处理电路。

2.测量方法与基本原理

1)FPGA普通测量法

直接计数单位时间内的脉冲数。在1s闸门时间内,记录被测信号的脉冲个数Nx,则待测频率Fx=Nx,此方法对低频信号测量误差较大,舍弃。

普通测量法(图未画基准时钟)

测量时,门宽不一定为1s,所以给出通常情况下的计算公式:

其中,clk_fs为基准时钟,clk_fx为待测信号,fs_cnt为基准时钟个数,fx_cnt为待测时钟个数

2)FPGA等精度测量法

本方案除给定闸门时间外,还由被测信号再生成一路计数允许信号。计数允许信号在闸门时间内第一个被测信号的上升沿开启,在闸门时间结束后被测信号的第一个上升沿结束,最后在计数允许信号的有效时间内,分别对标准频率信号个数、被测信号个数和被测信号高电平时间内标准频率信号个数计数后,再经过相关运算即可得所求频率、占空比和时间间隔。

等精度测量法(同样未画基准时钟)

3)FPGA代码设计

FPGA主要完成测量待测信号频率,对输入信号个数和标准信号个数进行计数。本实验针对这部分进行设计。

3.待测信号如何输入FPGA

1)管脚图:GPIO部分(FPGA型号:Cyclone III    EP3C16F484C6N)

FPGA主要完成测量待测信号频率,对输入信号个数和标准信号个数进行计数。本实验针对这部分进行设计。

原则:一定!一定!一定注意所配管脚与实际管脚的位置,配哪个用哪个,用哪个配哪个。

2)使用杜邦线连接信号源,为防止FPGA被烧坏,信号源要设置为输出3.3Vpp,偏移1.65V。

二、实验程序

1.RTL图

显而易见,频率计有三个部分:门信号,边沿检测,计数器

2.Verilog(参考设计)

1.门控部分:

module gate
(
        input                 clk_fs ,     // 基准时钟信号
        input                 rst_n   ,  // 复位信号
 
        //cymometer interface
        input                 clk_fx ,//待测信号
		  output		reg				gate , //门控信号
		  output    reg           gate_fs // 同步到基准时钟的门控信号
		  );
		  
localparam   GATE_TIME = 16'd5_000;        // 门控时间设置
reg    [15:0]   gate_cnt    ;           // 门控计数
 
reg             gate_fs_r   ;           // 用于同步gate信号的寄存器
 
//门控信号计数器,使用被测时钟计数
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n)
        gate_cnt <= 16'd0; 
    else if(gate_cnt == GATE_TIME + 5'd20)
        gate_cnt <= 16'd0;
    else
        gate_cnt <= gate_cnt + 1'b1;
end
	  
 
//门控信号,拉高时间为GATE_TIME个实测时钟周期
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n)
        gate <= 1'b0;
    else if(gate_cnt < 4'd10)
        gate <= 1'b0;     
    else if(gate_cnt < GATE_TIME + 4'd10)
        gate <= 1'b1;
    else if(gate_cnt <= GATE_TIME + 5'd20)
        gate <= 1'b0;
    else 
        gate <= 1'b0;
end
 
//将门控信号同步到基准时钟下
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        gate_fs_r <= 1'b0;
        gate_fs   <= 1'b0;
    end
    else begin
        gate_fs_r <= gate;
        gate_fs   <= gate_fs_r;
    end
end
 
endmodule

2.边沿检测

module pexg(
        input                 clk_fs ,     // 基准时钟信号
        input                 rst_n   ,  // 复位信号
 
 
        input                 clk_fx , 
			input gate,
			input gate_fs     ,  
		  output    neg_gate_fs,
		  output    neg_gate_fx
		  );
reg                gate_fs_d0  ;           // 用于采集基准时钟下gate下降沿
reg                gate_fs_d1  ;           // 
reg                gate_fx_d0  ;           // 用于采集被测时钟下gate下降沿
reg                gate_fx_d1  ;           // 		  
//wire define
 
//边沿检测,捕获信号下降沿
assign neg_gate_fs = gate_fs_d1 & (~gate_fs_d0);
assign neg_gate_fx = gate_fx_d1 & (~gate_fx_d0);
 
 
//打拍采门控信号的下降沿(被测时钟)
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n) begin
        gate_fx_d0 <= 1'b0;
        gate_fx_d1 <= 1'b0;
    end
    else begin
        gate_fx_d0 <= gate;
        gate_fx_d1 <= gate_fx_d0;
    end
end
 
//打拍采门控信号的下降沿(基准时钟)
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        gate_fs_d0 <= 1'b0;
        gate_fs_d1 <= 1'b0;
    end
    else begin
        gate_fs_d0 <= gate_fs;
        gate_fs_d1 <= gate_fs_d0;
    end
end
endmodule

3.计数器

module CNT
   #(parameter    CLK_FS = 26'd50_000_000,// 基准时钟频率
	parameter  MAX       =  10'd64)  // 定义数据位宽        
    (   //system clock
        input                 clk_fs ,     // 时钟信号
        input                 rst_n   ,  // 复位信号
 
        //cymometer interface
        input                 clk_fx ,     // 待测信号
		input gate,       // 门控信号(与待测时钟同步)
		input gate_fs,    // 与基准时钟同步的门控信号
		input  neg_gate_fx,//
		input  neg_gate_fs,//
        
		output reg    [MAX-1:0]   fs_cnt      ,           //门控时间内基准时钟信号的个数 
		output reg    [MAX-1:0]   fx_cnt      ,          // 门控时间内待测信号的个数
		output reg  	[MAX-1:0]   data_fx_temp  // 待测信号的频率值
);
 
 
reg    [MAX-1:0]   fs_cnt_temp ;           // fs_cnt 计数
reg    [MAX-1:0]   fx_cnt_temp ;           // fx_cnt 计数
 
//门控时间内待测信号的计数,设置的为5000个,这里重新计数,只是用于检验信号是否正确
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n) begin
        fx_cnt_temp <= 32'd0;
        fx_cnt <= 32'd0;
    end
    else if(gate)begin
      fx_cnt_temp <= fx_cnt_temp + 1'b1;
    end   
    else if(neg_gate_fx) begin
        
        fx_cnt_temp <= 32'd0;
        fx_cnt <= fx_cnt_temp;
        
    end
end
 
//门控时间内基准时钟的计数
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        fs_cnt_temp <= 32'd0;
        fs_cnt <= 32'd0;
    end
    else if(gate_fs)
        begin
        fs_cnt_temp <= fs_cnt_temp + 1'b1;
        end
    else if(neg_gate_fs) begin
        
        fs_cnt_temp <= 32'd0;
		fs_cnt <= fs_cnt_temp;
    end
end
//计算待测信号的频率值
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        data_fx_temp <= 64'd0;
    end
    else if(gate_fs == 1'b0)
			data_fx_temp <=CLK_FS*fx_cnt/fs_cnt;
end
 
endmodule

4.顶层

module top_cymometer(
    //system clock
    input                  sys_clk  ,    // 时钟信号
    input                  sys_rst_n,    // 复位信号
//spi没有使用
//		input  CS_N,
//		input  SCLK,
//		output MISO,
    //cymometer interface
    input                  clk_fx   ,    // 被测时钟
//    output                 clk_out  ,    // 输出时钟
//	output [7:0] led0,
//	output [7:0] led1,
//	output [7:0] led2,
//	output [7:0] led3,
	output [63:0]data_fx
);
 
//parameter define
parameter    CLK_FS = 26'd50000000;      // 基准时钟频率值
 
 
gate//生成门控信号
(
        .clk_fs      (sys_clk  ),     // 基准时钟信号
        .rst_n       (sys_rst_n),  // 复位信号
 
        //cymometer interface
        .clk_fx      (clk_fx   ), //待测信号
		  .gate(gate ) , //门控信号
		  .gate_fs(gate_fs) // 同步到基准时钟的门控信号
		  );
 
pexg//边沿捕获
(
        .clk_fs      (sys_clk  ),     // 基准时钟信号
        .rst_n       (sys_rst_n),  // 复位信号
 
		  .gate(gate ) , //门控信号
		  .gate_fs(gate_fs), // 同步到基准时钟的门控信号
       .clk_fx      (clk_fx), //待测信号
		
		  .neg_gate_fs(neg_gate_fs),
		  .neg_gate_fx(neg_gate_fx)
		  );
		  
CNT  
    (
	 
	 //system clock
        .clk_fs      (sys_clk  ),     // 基准时钟信号
        .rst_n       (sys_rst_n),  // 复位信号
 
        //cymometer interface
        .clk_fx      (clk_fx   ), //待测信号
		  .gate(gate )  ,//门控信号
		  .gate_fs(gate_fs) ,// 同步到基准时钟的门控信号
		  .neg_gate_fs(neg_gate_fs),
		  .neg_gate_fx(neg_gate_fx),
        
		  .fs_cnt(fs_cnt)      ,          // 门控时间内基准时钟的计数值
		  .fx_cnt(fx_cnt)      ,           // 门控时间内被测时钟的计数值		
        .data_fx_temp(data_fx)  
);
//通过SPI模块实现与单片机通信
//spi(.clk(sys_clk),
//    .rst_n(sys_rst_n),              
//    .CS_N(CS_N),
//    .SCLK(SCLK),
//    .MOSI(MOSI),
//    .txd_data(data_fx),
//    .MISO  (MISO)
//	 );
//实现比较,最后调试是通过signaltap分析
//seg_led u_seg_led(
//    //module clock
//    .clk         (sys_clk  ),            // 数码管驱动模块的驱动时钟
//    .rst_n       (sys_rst_n),            // 复位信号
   //user interface
//    .data        (data_fx  ),            // 被测频率值
//   .seg_led0	(led0),
//	.seg_led1	(led1),
//	.seg_led2	(led2),
//	.seg_led3 	(led3)
//);
endmodule

3.指派引脚(很坑)

原则:就是上述原则,用哪个配哪个,要看清楚

to, location
# 50 MHz clock input   
sys_clk   , PIN_G21  
 
sys_rst_n , PIN_G3
 
 
clk_fx    , PIN_AB11

由于输出使用SignalTap查看,所以就不指派输出的引脚了,关于SignalTap文件的设置:

sys_clk为50MHz系统时钟,stp主要是为了查看data_fx信号,其他的不重要。

二、调试验证

1.输入不同频率的方波

信号源调整为如图,原则为上述原则,后续只需要更改频率,频率过低的话,测试太慢,从2k开始

2kHz:

100kHz:

1MHz:

10MHz:

7355608Hz:

频率为1k的整数倍时,测量结果精确,频率非整数时,信号源输出可能会有问题,导致一定的误差。

OVER结束

本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/1198.html
分享:
FPGA在线学习教程来了|高云FPGA系列教程免费学
FPGA在线学习教程来了|高云FPGA系列教程免费学上一篇
FPGA是什么?(科普必看)下一篇
FPGA是什么?(科普必看)
相关文章
总数:1.57K

基于FPGA的HDMI接口设计:2026年时序约束与调试经验

QuickStart步骤1:准备环境。安装Vivado2024.2(或更高版本),确认支持目标器件(如XilinxArtix-7/Ki…
二牛学FPGA二牛学FPGA
技术分享
26天前
0
0
33
0

2026年Chiplet互连标准UCIe在FPGA异构集成中落地挑战升温:技术、生态与学习路径深度解析

随着半导体行业对更高性能、更低功耗和更快上市周期的追求,Chiplet(小芯片)技术已成为后摩尔时代的重要演进方向。作为Chiplet互连的关键…
二牛学FPGA二牛学FPGA
行业资讯
1个月前
0
0
49
0

FPGA时序收敛实施指南:系统化分析与修复时序违例

时序收敛是FPGA设计从功能仿真走向物理实现的关键环节,决定了设计能否在目标频率下稳定运行。本文提供一套从问题定位到方案实施的结构化指南,旨在帮…
二牛学FPGA二牛学FPGA
技术分享
1个月前
0
0
76
0

RISC-V时代芯片设计人才技能升级指南:从指令集到系统集成的实践路径

随着RISC-V指令集架构在数据中心、边缘计算、AI加速及消费电子等领域的快速渗透,其生态系统预计将在2026年前后进入全面爆发期。这一趋势对芯…
FPGA小白FPGA小白
技术分享
1个月前
0
0
85
0

FPGA MIPI CSI-2图像传感器接收端逻辑设计与实现指南

本文档旨在提供一套完整、可落地的FPGAMIPICSI-2接收端(RX)逻辑设计实施方案。MIPICSI-2是移动产业处理器接口联盟制定的…
二牛学FPGA二牛学FPGA
技术分享
1个月前
0
0
73
0

基于FPGA的实时视频流H.265编码器设计入门

QuickStart步骤1:下载并安装Vivado2023.2(或更高版本),确保包含H.265编码器IP核(如XilinxV…
二牛学FPGA二牛学FPGA
技术分享
28天前
0
0
49
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容