今天在写Verilog代码的时候遇到了一个棘手的问题。
我想要实现的目标是:在一个sensor信号上升时,激活一个复位信号rst_light。但是又不能让它一直保持激活状态,必须让它在激活一小段时间后再变为未激活的状态。波形图大概是长这样:
__________________________
sensor _____________|
__
rst_light ______________| |_______________________
尝试上网查询,但是没有合适的解决方法
又尝试去问AI,但是AI给的答复,会让rst_light在sensor激活后一直保持激活的状态。从而使得它对应的模块无法正常工作。总之就是没有解决问题。
后来我想到了用这样的方式解决:
always @(posedge sensor) rst_light <= 1'b1;
always @(posedge sys_clk)
if(rst_light == 1'b1)
rst_light <= 1'b0;
这种方式从逻辑上行得通,但是出现了两个always语句一起对rst_light赋值的问题。综合的时候会报错。
经过我一天的思考,终于找到了这个方法:
reg sensor_mid;
always @(posedge sys_clk) sensor_mid <= ~sensor;
assign rst_light = sensor_mid && sensor;
这个方法使用了一个中间变量sensor_mid,它是sensor延迟再取反得到的。这样就能使得sensor和sensor_mid中间产生一点空隙,而这点空隙正好能为rst_clk信号提供一小段存在的时间。从而解决了问题。