请高手帮忙,我用Verilog写了一个LCD的驱动,用状态机写的,但编译的时候有很多警告。请高手指点,初学中。。。所有变量都定义为reg
always @(posedge clkdiv,negedge reset)
begin
if(!reset)
current_state<=st0;
else
current_state<=next_state;
end
always @(current_state,lcd_busy)
begin
case(current_state)
st0: //initial
begin
lcd_req=1'b0;
cnt_a=2'b00;
cnt_d=2'b00;
addr_a=5'd0;
addr_d=6'd0;
data_all=0;
f0=1'b0;
next_state<=st1;
end
st1:
begin
next_state<=st2;
end
st2: //LCD is busy? yes wait.else put the data on the data_bus
begin
if(lcd_busy==1'b1)
next_state<=st2;
else
next_state<=st3;
end
st3:
begin
if(!f0) //writing f0
begin
lcd_data=8'hf0;
f0=1'b1;
next_state<=st6;
end
else
begin
next_state<=st4;
end
end
st4://write x\y axis
begin
if(cnt_a<2'd2)
begin
lcd_data=axis(addr_a);
addr_a=addr_a+5'd1;
cnt_a=cnt_a+2'd1;
next_state<=st6;
end
else
next_state<=st5;
end
st5: //write data
begin
if(cnt_d<2'd2)
begin
lcd_data<=data_ram(addr_d);
addr_d=addr_d+6'd1;
cnt_d=cnt_d+2'd1;
end
else //finishing writing one chinese word
begin
data_all=data_all+1;
cnt_d=2'd0;
cnt_a=2'd0;
f0=1'b0;
end
next_state<=st6;
end
st6: //request LCD processing
begin
lcd_rea=1'b1;
next_state<=st7;
end
st7: //waiting data is dealt with
begin
if(lcd_busy==1'b0)
next_state<=st7;
else
next_state<=st8;
end
st8: //withdrawing requesting_signal
begin
if(data_all<DANUM) //write next data
next_state<=st2;
else
next_state<=st0;
end
default:
next_state<=st0;
endcase
end
整个程序的任务是完成LCD显示汉字,为了显示汉字要先向LCD里写F0,X、Y坐标,最后送入汉字的区码、位码。每次向LCD发送写指令时要先判断LCD是否忙(lcd_busy==1?)不忙时(lcd_busy==0)将数据送到数据线上,下一步是请求LCD处理(令lcd_req=1),再次判断(lcd_busy==1?)如果是则表明LCD处于数据处理状态此时可令lcd_req=0,以撤消请求。这样就完成了一次LCD数据写操作。
我在学程序的时候严格按照步骤来的,但编译出来总是提示好多错误,并且仿真得不到结果,像提示 cnt_a,cnt_d
addr_a,addr_d,data_all,f0这些变量有不安全行为,并产生了Latch,还说在Always里面读了但没放到信号列表里,还有通过很多的途径张变了这些变量的值。
希望哪位高人能提出些建议,先谢谢各位!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |