多周期高电平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
代码说明
toggle_reg寄存器:用于跟踪脉冲的翻转状态,在en有效且sig为高时,每个时钟上升沿翻转一次- 使能控制:当
en为低时,直接将toggle_reg复位为0,确保pulse输出低电平 - 脉冲输出逻辑:通过
toggle_reg & sig确保只有在sig为高电平时才输出翻转后的脉冲,sig变低时立即拉低pulse
这样就能实现需求:当sig持续高电平的每个时钟周期,pulse都会在时钟上升沿完成一次翻转;en无效时pulse保持低电平。
内容的提问来源于stack exchange,提问作者geeky
相关产品推荐
相关产品推荐

