You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多周期高电平sig信号的脉冲生成故障排查及需求实现

问题描述

我有一个sig信号,该信号可能持续多个时钟周期保持高电平。我希望为其生成一个脉冲信号,该脉冲需要随sig保持高电平的每个时钟周期进行翻转:

  • 每当sig从低电平跳变到高电平时,能得到对应的脉冲
  • 当sig连续3个时钟周期为高时,脉冲需要完成3次翻转(从0到1再到0,再到1)
  • 仅当en为高时执行此逻辑,en为低时pulse保持低电平

我编写了如下Verilog模块代码,但无法生成预期的脉冲,波形图中pulse始终为低:

module PULSE_GEN  (input clk,  input sig,input en,output wire pulse);

reg r1,r2,r3;
        always @(posedge clk) begin
           if(en)
           begin
             r1 =sig;
             r2 = r1 ^ sig; 
             r3 = r1 & r2;
           end
           else
             r3 = 1'b0;
        end 

assign pulse =  r3; 

endmodule
问题分析

原代码的核心问题在于阻塞赋值的逻辑错误:

  • 在同一个时钟沿,r1被直接赋值为当前的sig,此时r1和sig的电平完全一致
  • 计算r2 = r1 ^ sig时,结果恒为0,最终r3 = r1 & r2也恒为0,导致pulse始终输出低电平
修正后的代码
module PULSE_GEN (
    input clk,
    input sig,
    input en,
    output wire pulse
);

reg toggle_reg;

always @(posedge clk) begin
    if (!en) begin
        // 使能无效时,复位翻转寄存器
        toggle_reg <= 1'b0;
    end else begin
        if (sig) begin
            // sig为高时,每个时钟沿翻转寄存器状态
            toggle_reg <= ~toggle_reg;
        end else begin
            // sig为低时,复位翻转寄存器
            toggle_reg <= 1'b0;
        end
    end
end

// 仅当sig为高时,输出翻转寄存器的状态;sig为低时输出0
assign pulse = toggle_reg & sig;

endmodule
代码说明
  1. toggle_reg寄存器:用于跟踪脉冲的翻转状态,在en有效且sig为高时,每个时钟上升沿翻转一次
  2. 使能控制:当en为低时,直接将toggle_reg复位为0,确保pulse输出低电平
  3. 脉冲输出逻辑:通过toggle_reg & sig确保只有在sig为高电平时才输出翻转后的脉冲,sig变低时立即拉低pulse

这样就能实现需求:当sig持续高电平的每个时钟周期,pulse都会在时钟上升沿完成一次翻转;en无效时pulse保持低电平。

内容的提问来源于stack exchange,提问作者geeky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:54