测量占空比

最近尝试了很多方法测量占空比,虽然说原理简单,但是测量的时候误差还是挺大的,凡是没呢么容易,

最后终于实现了1HZ-5M 占空比的测量,精度小于%0.1

另外发现了一个问题,fpga一条语句如果很复杂的话,可能会出现问题。

例如 assign  duty_altera = pinlv << 1 + pinlv;也就是pinlv_altera 是频率的三倍,在sigtab仿真时出错了,如果把这两条语句分开写就没毛病了。

程序思路:

设定一个1S钟的闸门,在闸门有效期间测量高电平持续时间和低电平持续时间,需要注意的是:

在测量时间时需要以边沿做为开始计数的标志,否则程序容易崩溃。然而实际测量出来,还是有误差的,经过测量多组数据发现:高电平测量的时间所记录的个数比实际上少记录了2*pinlv个,而低电平恰恰相反。经过补偿,满足题目的要求。

module    duty(
        //system    interface
        input                clk,
        input                rst_n,
        //sig        interface
        input                sig_in,
        //pinlv        interface
        input        [31:0]    pinlv,
        //user        interface
        output    reg    [15:0]    duty,
        output    reg    [31:0]    cnt_high,
        output    reg    [31:0]    cnt_low,
        output                high_pulse,
        output                low_pulse,
        output        [31:0]    duty_alter
);

//buffer
reg        sig_in_buffer;
reg        sig_in_buffer1;
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        sig_in_buffer  <= 0;
        sig_in_buffer1 <= 0;
    end
    else
    begin
        sig_in_buffer  <= sig_in;
        sig_in_buffer1 <= sig_in_buffer;
    end
end
assign        high_pulse =  (sig_in_buffer == 1 && sig_in_buffer1 == 0) ? 1 : 0;
assign        low_pulse  =  (sig_in_buffer == 0 && sig_in_buffer1 == 1) ? 1 : 0;
//parameter        CNT_1S = 32‘d199_9;
parameter        CNT_1S = 32‘d199_999_999;
reg        [31:0]    cnt_1s;
reg                fgate;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt_1s <= 0;
    else if(cnt_1s >= CNT_1S)
        cnt_1s <= 0;
    else
        cnt_1s <= cnt_1s + 1;
end

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        fgate <= 0;
    else if(cnt_1s == CNT_1S)
        fgate <= ~fgate;
    else
        fgate <= fgate;
end

reg        fstart;
always @(posedge sig_in_buffer1 or negedge rst_n)
begin
    if(!rst_n)
        fstart <= 0;
    else if(fgate)
        fstart <= 1;
    else
        fstart <= 0;
end
reg        [2:0]        state_high;
reg        [2:0]        state_low;
//cnt
reg        [31:0]        cnt_high_temp;
reg        [31:0]        cnt_low_temp;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        state_high <= 0;
    else
    case(state_high)
    2‘d0 :
    begin
        if(high_pulse)
            state_high <= 2‘d1;
        else
            state_high <= 2‘d0;
    end

    2‘d1 :
    begin
        if(low_pulse)
            state_high <= 2‘d0;
        else
            state_high <= 2‘d1;
    end

    default : ;
    endcase
end

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        state_low <= 0;
    else
    case(state_low)
    2‘d0 :
    begin
        if(low_pulse)
            state_low <= 2‘d1;
        else
            state_low <= 2‘d0;
    end

    2‘d1 :
    begin
        if(high_pulse)
            state_low <= 2‘d0;
        else
            state_low <= 2‘d1;
    end

    default : ;
    endcase
end
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt_high_temp <= 0;
    else if(fstart)
    begin
        if(state_high == 1)
            cnt_high_temp <= cnt_high_temp + 1;
        else
            cnt_high_temp <= cnt_high_temp;
    end
    else
        cnt_high_temp <= 0;
end

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt_low_temp <= 0;
    else if(fstart)
    begin
        if(state_low == 1)
            cnt_low_temp <= cnt_low_temp + 1;
        else
            cnt_low_temp <= cnt_low_temp;
    end
    else
        cnt_low_temp <= 0;
end
wire    [31:0]    pinlv1;
assign    pinlv1     = pinlv << 1;
assign    duty_alter =  pinlv << 1;

always @(negedge fstart or negedge rst_n)
begin
    if(!rst_n)
    begin
        cnt_high <= 0;
        cnt_low <= 0;
    end
    else
    begin
        cnt_high <= cnt_high_temp + duty_alter ;
        cnt_low  <= cnt_low_temp  - duty_alter ;
    end
end

endmodule
时间: 2024-10-17 15:30:24

测量占空比的相关文章

基于ZigBee与GPRS的铅尘监测系统设计

0 引言 ZigBee数传技术是一种应用于短距离.低传输数据速率下的新一代无线通信技术.它具有功耗低.数据传输可靠.网络容量大,兼容性.安全性强,实现成本低等特点,而被广泛应用于监控领域.通用分组无线业务(GPRS)是一种基于GSM系统的无线分组交换技术,具有充分利用已有网络.资源利用率高.始终在线.传输速率高.资费合理等特点. GPRS通信模块可应用于远程数据监测系统.远程控制系统.无线定位系统等.近年来,随着无线传感器网络技术的迅猛发展以及人们对环境保护和环境监督提出的更高要求,越来越多的企

关于22.5KHz模拟脉冲信号(60V)占空比测试,占空比精度0.1%

两种方法: 1.采集信号完整波形,进行计算: 是否选择一个250KS/s采样率的模拟量采集卡就可以显示要求的波形了呢? NO! 我们还未考虑测量精度0.1%! 因为模拟量信号是连续的,信号的周期是1/(22.5K)=44.4us,占空比精度要求0.1%,信号的分辨率至少为44.4us/1000=44.4ns, 采样率要比1/44.4ns=22.5MS/s要大才可测量到满足精度要求的波形! 2.将模拟信号转换成数字信号,使用脉冲计数来计算其占空比: 将60V模拟脉冲信号转成数字量脉冲信号,使用脉冲

总结2---万用表测量方波和正弦波的电压

万用表测出来的方波的电压是平均值,正弦波是有效值. 原因是:万用表采用的是积分ADC,得到的结果为平均值.  ……为什么是这样,查到的时候,再续!! ---------------------------------------------------------------------- 电流.某一截面上的电量叫做电流强度,简称电流,也至电荷在导体中的定向移动. 导体中的自由电荷在电场力的作用下做有规则的定向运动就形成了电流. 通过导体截面的电荷量Q跟通过这些电荷量所用时间t的比值成为电流.也

GPS拓展无线同步模块GSYN1000系列在广域同步测量的应用方案

摘要: GPS和北斗应用于广域同步测量,已有成熟的技术,但如果要把广域同步测量用无线方式扩展到每个低成本的传感网节点,因为传感网节点资源少成本低,精度就难于提高.慧聚通信开发的GSYN1000系列GPS拓展无线同步模块,可以达到百纳秒(100nS)级精度,为无线移动式广域同步测量监测系统的时间同步提供了新的实现方案. 关键词: 时间同步,广域同步,相量测量,GPS,北斗,GSYN1000,无线同步模块. 前言: GPS和北斗应用于广域同步测量,已有成熟的技术.但如果要把广域同步测量用无线方式扩展

节点传播能力的测量

意见领袖 三种定量测量用户在线影响力的方法: 1)激发回复,即用户发布一条帖子后收到的回复数 2)激发对话,即该用户回复帖子后,所激发他人的讨论 2)语言扩散,即他人是否沿用该用户所使用的词语 基于网络结构节点传播能力的测量 局部属性指标:度值.局部中心性等 全局属性指标:特征向量中心性.Katz指标.介数中心性.核函数等 网络位置属性指标:K核.混合度分解 基于随机游走:PageRank.HITS.LeaderRank等

13.按比例显示图片、自定义属性、测量

有时候服务器返回的图片有可能宽高是不一样的,所以需要按照一定宽高比例去显示,修改专题界面 自定义属性 <resources> <declare-styleable name="com.itheima.googleplay.view.RatioLayout"> <attr name="ratio" format="float"></attr> </declare-styleable> &l

android ListView条目中TextView隐藏到显示时的测量

觉得ExpendableListView挺好用,但是就是代码复杂了点,我一时半会理解不了,于是就直接自己写个效果来实现.先来看一下expendableListView中展开的动画效果: 然后我模仿此效果,建立如下的item布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent" andr

通过源码分析View的测量

要理解View的测量,首先要了解MeasureSpec,系统在测量view的宽高时,要先确定MeasureSpec. MeasureSpec(32为int值)由两部分组成: SpecMode(高2位):测量模式. SpecSize(低30位):某种测量模式下的规格大小. SpecMode有3类: UNSPECIFIED: 父容器不对view做大小限制,一般用于系统内部,表示一种测量状态. EXACTLY:精确模式.对应于:LayoutPrams中的match_parent和具体数值. AT_MO

归纳测量数据处理的方法.

1.测量误差与测量结果的不确定度 ①测量误差的定义 首先,需要明确测量误差的定义.当我们进行测量时,由于理论的近似性.实验仪器的局限性等,测量结果总不可能绝对准确.待测物理量的真值同我们的测量值之间总会存在某种差异.我们将测量误差定义为 测量误差=测量值-真值 ②测量误差的分类 其次,按照习惯的分类方法,根据误差的性质,误差又分为系统误差和随机误差. ③系统误差 我们在这里讨论系统误差.系统误差指的是在相同条件下,多次测量同一物理量时,测量值对真值的偏离总是相同的误差.其造成原因大概分为三类: