在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2454|回复: 7

[讨论] 如何让等精度频率计实时更新数据?

[复制链接]
发表于 2012-10-11 13:00:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
如题,现在等精度频率计做的很准了,标准信号频率为100kHz,被测频率(由信号发生器得到)只要小于100kHz都可以准确测量并显示数据,但现在的问题是数据不能实时更新,也就是每更改一次频率,总要将程序重新下载才行。

望各位不吝赐教,谢谢!
 楼主| 发表于 2012-10-11 13:02:05 | 显示全部楼层
肯定有人会的!
 楼主| 发表于 2012-10-11 13:42:41 | 显示全部楼层
DDDDDDDDDD
 楼主| 发表于 2012-10-11 15:19:31 | 显示全部楼层
module Counter
(
        CLK, Clear,
        Sig_in, Switch,
       
   Cnt_data1, Cnt_data2
);

        input CLK, Clear;
        input Sig_in, Switch;

        output [31:0]Cnt_data1, Cnt_data2;
               
        /********************************************/

        parameter Freq_100KHz = 17'd100_000,                 //Fs = 100,000
       
                                 Ns0 = 14'd9_999;                                                //Ns0 = 10,000                               
               
        /****************** 被测信号 *****************/

        reg [31:0]count1 =32'd0, count2 = 32'd0;
       
        reg trigger = 1'b0;
       
        reg [13:0]Sig_num = 14'd0;
       
        reg Sig_flag;
       
        always @ ( posedge Sig_in )
                begin
                        if( Clear == 1'b1 )
                                begin
                                        count1 <= 32'd0;
                                        Sig_flag <= 1'b0;
                                end
                        else if( Switch == 1'b1 && count1 <= Sig_num )
                                begin
                                        trigger <= 1'b1;
                                        count1 <= count1 + 1'b1;
                                        Sig_flag <= 1'b1;
                                end
                        else
                                begin
                                        trigger <= 1'b0;
                                        count1 <= count1;
                                        Sig_flag <= 1'b0;
                                end
                end
               
        /****************** 标准信号 *****************/
               
        always @ ( posedge CLK )
                begin
                        if( trigger == 1'b1 )
                                count2 <= count2 + 1'b1;
                        else
                                count2 <= count2;
                end

        /********************************************/
               
        always @ ( posedge CLK )
                begin
                        if( ( count2 < Ns0 ) && ( Sig_flag == 1'b1 ) )
                                begin
                                        Sig_num <= Sig_num + 1'b1;
                                end
                        else
                                begin
                                        Sig_num <= Sig_num;
                                end
                end
               
        /********************************************/

        assign Cnt_data1 = count1 * Freq_100KHz;
                                                               
        assign Cnt_data2 = count2;
       
        /********************************************/

endmodule
发表于 2012-10-11 17:27:36 | 显示全部楼层
因为你的模块从设计上看本身就是只能测试一次(是吗?),
同时又没有恢复初始状态的方法啊。
 楼主| 发表于 2012-10-11 19:14:40 | 显示全部楼层
回复 5# jackertja


    我用状态机做的系统控制,Clear每次计数前都清零了,应该可以不停的测量,您有没有比较好的计数方法?
 楼主| 发表于 2012-10-11 19:20:02 | 显示全部楼层
回复 5# jackertja


    module Counter
(
        CLK, Clear, Sig_in,
        Enable_0, Switch,
       
   Cnt_data1, Cnt_data2
//        Count_over
);

        input CLK, Clear;
        input Sig_in, Enable_0, Switch;

        output [31:0]Cnt_data1, Cnt_data2;
//        output reg Count_over;
               
        /********************************************/

        parameter Freq_100KHz = 17'd100_000,                 //Fs = 100,000
       
                                 Ns0 = 14'd9_999;                                                //Ns0 = 10,000                               
               
        /****************** 被测信号 *****************/

        reg [31:0]count1 =32'd0, count2 = 32'd0;
       
        reg trigger = 1'b0;
       
        reg [13:0]Sig_num = 14'd0;
       
        reg Sig_flag;
       
        always @ ( posedge Sig_in )
                if( Clear == 1'b1 )
                        begin
                                count1 <= 32'd0;
                                Sig_flag <= 1'b0;
//                                Count_over <= 1'b0;
                        end
                else if( Enable_0 )
                        begin
                                if( Switch == 1'b1 && count1 <= Sig_num )
                                        begin
                                                trigger <= 1'b1;
                                                count1 <= count1 + 1'b1;
                                                Sig_flag <= 1'b1;
                                        end
                                else
                                        begin
                                                trigger <= 1'b0;
                                                count1 <= count1;
                                                Sig_flag <= 1'b0;
//                                                Count_over <= 1'b1;        //count_over结束计数标志
                                        end
                        end
               
        /****************** 标准信号 *****************/
               
        always @ ( posedge CLK )
                begin
                        if( Clear == 1'b1 )
                                begin
                                        count2 <= 32'd0;
                                end
                        else
                                begin
                                        if( trigger == 1'b1 )
                                                begin
                                                        count2 <= count2 + 1'b1;
                                                end
                                        else
                                                begin
                                                        count2 <= count2;
                                                end
                                end
                end

        /********************************************/
               
        always @ ( posedge CLK )
                begin
                        if( Clear == 1'b1 )
                                begin
                                        Sig_num <= 14'd0;
                                end
                        else
                                begin
                                        if( ( count2 < Ns0 ) && ( Sig_flag == 1'b1 ) )
                                                begin
                                                        Sig_num <= Sig_num + 1'b1;
                                                end
                                        else
                                                begin
                                                        Sig_num <= Sig_num;
                                                end
                                end
                end
               
        /********************************************/

        assign Cnt_data1 = count1 * Freq_100KHz;
                                                               
        assign Cnt_data2 = count2;
       
        /********************************************/

endmodule
发表于 2012-10-16 19:55:53 | 显示全部楼层
我用状态机做的系统控制,Clear每次计数前都清零了,应该可以不停的测量,您有没有比较好的计数方法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-28 00:31 , Processed in 0.030396 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表