集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1051|回复: 1

如何编写测量信号周期?

[复制链接]
zzy919713424 发表于 2012-7-25 09:51:48 | 显示全部楼层 |阅读模式
如何编写一个用来测量未知信号的周期,已知的是有一个100kHZ的信号,要求输出未知信号的周期和一个中断电平,求帮忙。自己编了两天了都没搞出来
@HDL现场 该用户已被删除
@HDL现场 发表于 2012-7-25 18:11:55 | 显示全部楼层
本帖最后由 @HDL现场 于 2012-7-25 18:15 编辑

/****************************************
Module name : test_period
Project name : test_period
Description    : 检测时钟周期
Property        : 范围  时钟为100khz以下,最大2^32 us , 误差为10us   (1/100khz(s))
****************************************/

module test_period(
     input      wire   sys_clk,      // 100khz
     input      wire   reset,
     input      wire   test_clk,    //
     output    wire  [31:0]  period_us  //输出数据,单位为us
);
/******************低电平计数*********************/
reg   [31:0]          cnt_l,
                        cnt_h;
always @(posedge sys_clk)       
    if(!reset)
         cnt_l <= 32'd0;
    else if(!test_clk)
               cnt_l <= cnt_l + 1'b1;
        else
                       cnt_l <= 32'd0;
                          
reg        [31:0]        cnt_l_reg;
always @(posedge sys_clk)
        cnt_l_reg        <=        cnt_l;
/******************高电平计数**********************/
always @(posedge sys_clk)  
    if(!reset)
                        cnt_h         <= 32'd0;
    else if(test_clk)
                                        cnt_h <= cnt_h + 1'b1;
                        else
                                        cnt_h<= 32'd0;
                                       
reg        [31:0]        cnt_h_reg;
always @(posedge sys_clk)
        cnt_h_reg        <=        cnt_h;

/***************检测下降沿*********************/
reg                h2l_1,
                h2l_2;
always @(posedge sys_clk)
        if(!reset)
                begin
                        h2l_1        <=        1'b1;
                        h2l_2        <=        1'b1;
                end
        else
                begin
                        h2l_1        <=        test_clk;
                        h2l_2        <=        h2l_1;
                end
wire        h2l        =        h2l_2 & (!h2l_1);       

/**************检测上升沿*******************/
reg                l2h_1,
                l2h_2;
always @(posedge sys_clk)
        if(!reset)
                begin
                        l2h_1        <=        1'b0;
                        l2h_2        <=        1'b0;
                end
        else
                begin
                        l2h_1        <=        test_clk;
                        l2h_2        <=        l2h_1;
                end
wire        l2h        =        l2h_2 & (!l2h_1);

/*****************锁存数据*****************/
reg        [31:0]        rec_cnt_l,
                        rec_cnt_h;
always @(posedge clk)
        if(!reset)       
                rec_cnt_l        <=        32'd0;
        else
                if(l2h)
                        rec_cnt_l <= cnt_l_reg;
                else
                        rec_cnt_l <= rec_cnt_l;

always @(posedge clk)
        if(!reset)       
                rec_cnt_h        <=        32'd0;
        else
                if(h2l)
                        rec_cnt_h <= cnt_h_reg;
                else
                        rec_cnt_h <= rec_cnt_h;

/************************************************/
wire        [32:0]        count        =        rec_cnt_l + rec_cnt_h;  // 高低电平相加
wire        [31:0]        result        =        count[32:1];                // 结果除以2(左移一位即可)

assign        period_us  =  result;

endmodule
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-26 01:27 , Processed in 0.073603 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表