这是我昨天遇到的一个问题:
简单来说是判定启动的led_en处于不定状态。而led_en无法启动的原因很简单:

不等式左边的h_cnt、v_cnt,以及等式右边的h_sync、h_back、h_disp等信号并没有赋值,从一开始就处于不定状态。

经过检查,h_cnt、v_cnt两个信号可以复位置0,而h_sync、h_back、h_disp等信号并没有复位置零的相关代码,这也造成了一个大问题——不等式右边的信号一开始就是不确定的,让led_en这个信号也变成了不确定状态。
而RGB彩条模块在仿真时,怎么启动呢?——根据led_en进行判断。
assign lcd_rgb = lcd_de ? {24{1'bz}} : 24'h80;
而根据我阅读完整个代码,它的逻辑是这样的:
1、想要上电启动,必须确定led_en使能信号。
2、想要确定使能信号,必须要给ID号。
3、想要获得ID号,必须上电。

好了,它的仿真直接变成死循环了。 那么有没有破解之道呢?有的,那就是让led_en变成确定的信号。让判断语句可以正常运行。
assign lcd_en = ((h_cnt >= h_sync + h_back) &&
(h_cnt < h_sync + h_back + h_disp)&&
(v_cnt >= v_sync + v_back) &&
(v_cnt < v_sync + v_back + v_disp))?1'b1:1'b0;
做法很简单,那就是可h_sync、 h_back 、h_disp一开始就复位归零。添加以下代码即可:
always @(posedge lcd_pclk or negedge rst_n) begin
if(!rst_n)begin
h_sync <= 0;
h_back <= 0;
h_disp <= 0;
h_total <= 0;
v_sync <= 0;
v_back <= 0;
v_disp <= 0;
v_total <= 0;
end
这是修改代码之后的仿真结果

8109





