0

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;这行代码其实不写也可以,但我想问的是,为什么写上就不行了?

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2020-08-10 19:32:15 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它

想向站长提问,微信扫码立刻加入! shawn的FPGA圈.png
0

可能是你这个模块本身出现了时序问题,导致摄像头模块也出错。

编辑 标为违禁 删除 链接 更多选项...
luozz 头像

评论

好的,谢谢,我去检查一下

菜菜菜纪良 头像菜菜菜纪良 ( 2020-08-12 10:19:21 +0800 )编辑
登录/注册后进行回答

提问工具

1 follower

统计

已提问: 2020-08-10 19:32:15 +0800

已查看: 17 次

最后更新: Aug 11