这是我编写的驱动程序,我的仿真图像也符合器件本身的时序。不知道什么原因就是液晶没有显示的<br />module lcd1 (clk0,rst,lcd_data,rs,rw,en,cont);<br /> input clk0,rst;<br /> output [7:0] lcd_data;<br /> output rs,rw,en,cont;<br /> reg rs,rw,cont;<br /> reg [7:0] lcd_data;<br /> reg [3:0] state;<br /> reg [3:0] count;<br /> <br />parameter [3:0]<br /> warmup = 4'b0000,<br /> funcset= 4'b0001,<br /> dspoff = 4'b0011,<br /> clrdsp = 4'b0010,<br /> modeset= 4'b0110,<br /> dspon = 4'b0111,<br /> setaddr= 4'b0101,<br /> write = 4'b0100;<br /> initial<br /> begin<br /> //en=1;<br /> count=4'b0000; <br /> state=warmup;<br /> cont=1;<br /> end <br /><br />always @ (posedge clk0 or negedge rst )<br /> begin<br /> if(!rst) <br /> begin<br /> count=4'b0000; <br /> state=warmup;<br /> end<br /> else<br /> begin<br /> <br /> case(state)<br /> warmup : begin <br /> if(count==4'b0111)<br /> begin<br /> count=4'b0000;<br /> state=funcset;<br /> end<br /> else begin<br /> count=count+4'b0001;<br /> state=warmup;<br /> end<br /> end<br /> funcset : begin <br /> if(count==4'b1111)<br /> begin<br /> count=4'b0000;<br /> state=dspoff;<br /> end<br /> else begin<br /> count=count+4'b0001;<br /> state=funcset;<br /> end<br /> end<br /> dspoff : state=clrdsp; <br /> clrdsp: begin <br /> if(count==4'b0101)<br /> begin<br /> count=4'b0000;<br /> state=modeset;<br /> end<br /> else begin<br /> count=count+4'b0001;<br /> state=clrdsp;<br /> end<br /> end<br /> modeset: state=dspon;<br /> dspon: begin <br /> if(count==4'b0100)<br /> begin<br /> count=4'b0000;<br /> state=setaddr;<br /> end<br /> else begin<br /> count=count+4'b0001;<br /> state=dspon;<br /> end<br /> end<br /> setaddr: state=write;<br /> write : begin <br /> if(count==4'b0011)<br /> begin<br /> count=4'b0000;<br /> state=warmup;<br /> end<br /> else begin<br /> count=count+4'b0001;<br /> state=write;<br /> end<br /> end <br /> default : state=warmup;<br /> endcase <br /> end<br /> end<br /><br />always @ (state or count )<br /> begin<br /> case(state)<br /> warmup : begin<br /> rs=0;<br /> rw=0; <br /> lcd_data=8'b00000000;<br /> end<br /> funcset:lcd_data=8'b00111000;<br /> dspoff :lcd_data=8'b00001000;<br /> clrdsp :lcd_data=8'b00000001;<br /> modeset:lcd_data=8'b00000110;<br /> dspon:lcd_data=8'b00001100;<br /> setaddr: begin<br /> rs=0;<br /> rw=0; <br /> lcd_data=8'b10000000; <br /> end<br /> write : begin<br /> rs=1;<br /> rw=0; <br /> case(count)<br /> 'b0000 : lcd_data=8'b01000001; <br /> 'b0001 : lcd_data=8'b01000001; <br /> 'b0010 : lcd_data=8'b01000001; <br /> 'b0011 : lcd_data=8'b01000001; <br /> default: lcd_data=8'b01000010; <br /> endcase<br /> end<br /> default :lcd_data=8'bzzzzzzzz;<br /> endcase <br /> end<br /> assign en=clk0;<br />endmodule<br /> |
|