江湖人称纪博大 2021-09-03 16:19 采纳率: 87.5%
浏览 372
已结题

如何用verilog语言实现对一段信号脉冲个数和脉冲宽度的统计呢?

初步学习verilog,目前需要做的工作是 采集到一段信号。想要统计这段信号的脉冲个数,以及脉冲宽度的分布情况。
初步想法是通过对该段信号的上升沿检测,检测到上升沿就计数+1,可以最终得到脉冲个数。
然后检测下降沿,通过下降沿的时间减去上升沿的时间可以得到脉冲宽度,并且也存放起来。
目前只是单纯的实现了上升沿和下降沿的检测。

module edge_detect(
    input clk,
    input rst,
    input sig,
    output pos_edge,
    output neg_edge
);

reg sig_r1,sig_r2; //2级寄存器
reg cnt;           //对上升沿进行计数
always @(posedge clk) begin   //复位
    if (rst) begin
        sig_r1 <= 1'b0;
        sig_r2 <= 1'b0;
        end
        else begin
            sig_r1 <= sig;
            sig_r2 <= sig_r1;
        end
end

  • 写回答

2条回答 默认 最新

  • 老皮芽子 2021-09-04 14:05
    关注
    
    
    module edge_detect(
        input clk,
        input rst,
        input sig,
        output pos_edge,
        output neg_edge
    );
    reg sig_r1,sig_r2; //2级寄存器
    reg [15:0]    cnt_r = 0;      //对上升沿进行计数
    reg [15:0]    cnt_s = 0;        //计数结果
    reg    pos_edge_r = 0;
    reg    neg_edge_r = 0;
    
    assign    pos_edge = pos_edge_r;    //上升沿脉冲比实际的 sig 迟后 2 个clk 和 sig_r2 对齐
    assign    neg_edge = neg_edge_r;    //下降沿脉冲比实际的 sig 迟后 2 个clk 和 sig_r2 对齐
    
    always @(posedge clk) begin   //复位
        if (rst) begin
            sig_r1 <= 1'b0;
            sig_r2 <= 1'b0;
            end
            else begin
                sig_r1 <= sig;
                sig_r2 <= sig_r1;
            end
    end
    
    always @(posedge clk)
    begin
        if (rst)
        begin
            pos_edge_r    <= 1'b0;
        end
        else if(sig_r1 != sig_r2 && sig_r1 == 1'b1) //上升沿
        begin
            pos_edge_r    <= 1'b1;
        end
        else
        begin
            pos_edge_r    <= 1'b0;
        end
    end
    
    always @(posedge clk)
    begin
        if (rst)
        begin
            neg_edge_r    <= 1'b0;
        end
        else if(sig_r1 != sig_r2 && sig_r1 == 1'b0) //下降沿
        begin
            neg_edge_r    <= 1'b1;
        end
        else
        begin
            neg_edge_r    <= 1'b0;
        end
    end
    
    always @(posedge clk)
    begin
        if (rst)
        begin
            cnt_r <= 16'b0;
        end
        else if(sig_r2 == 1)
        begin
            cnt_r <= cnt_r + 1;
        end
        else
        begin
            cnt_r <= 16'b0;
        end
    end
    
    always @(posedge clk)
    begin
        if (rst)
        begin
            cnt_s <= 16'b0;
        end
        else if(neg_edge_r == 1)
        begin
            cnt_s <= cnt_r;
        end
    end
    
    endmodule
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 沙漠之雕SD 2021-09-03 17:21
    关注

    要做一个计时器吧

    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月13日
  • 已采纳回答 10月5日
  • 创建了问题 9月3日

悬赏问题

  • ¥15 关于#c++#的问题:c++如何使用websocketpp实现websocket接口调用,求示例代码和相关资料
  • ¥15 51单片机的外部中断,按下按键后不能切换到另一个模式
  • ¥15 java连接sqlserver有问题
  • ¥15 yolov8 如何调cfg参数
  • ¥15 这个四人抢答器代码哪儿有问题?仿真程序怎么写?
  • ¥15 burpsuite密码爆破
  • ¥15 关于#ubuntu#的问题,如何解决?(相关搜索:移动硬盘)
  • ¥15 scikit安装之后import不了
  • ¥15 Ros2编译一个使用opencv的c++节点的时候,报了这个错误,请问怎么解决啊
  • ¥15 人脸识别相关算法 YOLO,AI等