FPGA无关模块之间相互影响
我有一个摄像头模块,采集视频并显示到屏幕。
我又写了一个红外灯模块,其中部分代码如下:
//红外暂停恢复相关
reg light_ctl;
reg latch_valid;
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
light_ctl <= 1'b1;
latch_valid <= 1'b0;
end
else
begin
case(light_index[5])
1'b0:begin
if(latch_valid == 1'b1 && (basiccnt == light_index[4:0] + 5'd1))
begin
light_ctl <= 1'b1;
//latch_valid <= 1'b0; //!!!无法理解,本行注释掉则摄像头正常,不注释掉摄像头绿屏
end
end
1'b1:begin
if(basiccnt == (light_index[4:0] + 5'd1))
begin
light_ctl <= 1'b0;
latch_valid <= 1'b1;
end
end
default: ;
endcase
end
end
首先,我的红外灯是流动的,共32个,从第一个开始,依次点亮,同一时刻只有一个亮。
这一小段代码,只是想实现通过外部模块6bit信号,来控制红外灯在流动到一个固定位置时停止流动,保持常亮。
light_ctl可以理解为,为1表示红外灯正常流动,为0表示停止流动。light_index[5]为1bit的1时表示将红外灯停在light_index[4:0]处,即让light_ctl=0,需要一个合适的时机来把light_ctl赋值为0,这个合适的时机就是(basiccnt == light_index[4:0] + 5’d1)。
相反地,当light_index[5]为1bit的0时,则认为需要恢复红外灯的流动效果,即让light_ctl=1,需要一个合适的时机来把light_ctl赋值为1,这个合适的时机就是(basiccnt == light_index[4:0] + 5’d1)。
由于上电后light_index[5:0]的初始值为6bit的0,所以可能会直接进入light_index[5]==0的“恢复红外灯流动效果”的逻辑,但此时,并没有停止过红外灯的流动,所以不可进行恢复。为了解决这个问题,引入一个信号latch_valid(信号名由于历史原因起得不是很好请见谅),只有停止之后,才将latch_valid置1,只有latch_valid为1时,才可进入“恢复红外灯流动效果”的逻辑。
我的问题在于,注释掉//latch_valid <= 1’b0;则对我的摄像头模块没有影响,摄像头模块和红外灯模块都运行正常,当我解注之后,我的摄像头无法正常工作。我不认为这个赋值会对摄像头有影响,他们之间没有任何交集。当然,//latch_valid <= 1’b0;这行代码其实不写也可以,但我想问的是,为什么写上就不行了?