|  | 
 
| 
本帖最后由 glorygr 于 2011-9-16 09:36 编辑
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 
 | 手机屏驱动不同于AV屏的驱动,每次开机时必须写一些初始化代码。我打算按照SPI时序写,CS低有效,SCL上升沿采集数据。SDA为输出的数据。 初始化模块思路如下:
 
 initial_module包含spi_write_module和initial_control_module两个模块。SPI发送模块主要按照时序完成一次9位代码的发送。initial_control_module模块告诉SPI发送模块何时开始发送数据以及需要发送几次9位代码。全部发送完毕后initial_control_module块告知顶层模块初始化完毕,跳出初始化程序。
 初版程序如下:初始化模块需要循环(顶层初始化控制Top_Start_Sig=1)先写9'b000010111,再写9'b000101101和9'b000101001两条代码,且后面两条代码间需100ms间隔。系统时钟为50MHZ,但是程序出错,不知哪个地方出错?如何做才能使程序正常运行?还请高手指点一二,小弟不胜感激~~
 
 module initial_module(
 CLK,
 RSTn,
 Start_Sig,
 Done_Sig,
 SPI_Out
 );
 input CLK;
 input RSTn;
 input Start_Sig;
 output Done_Sig;
 output [2:0] SPI_Out;//[2] CS [1] SCL [0] SDA
 wire SPI_Start_Sig;
 wire [8:0]SPI_Data;
 wire SPI_Done_Sig;
 initial_control_module U1
 ( .CLK(CLK),
 .RSTn(RSTn),
 .Start_Sig(Start_Sig),
 .SPI_Done_Sig(SPI_Done_Sig),//input-from U2
 .SPI_Start_Sig(SPI_Start_Sig),//output-to U2
 .SPI_Data(SPI_Data),          //output-to U2
 .Done_Sig(Done_Sig)           //output-to top
 );
 spi_write_module U2
 ( .CLK(CLK),
 .RSTn(RSTn),
 .Start_Sig(SPI_Start_Sig),//input-from U1
 .SPI_Data(SPI_Data),      //input-from U1
 .Done_Sig(SPI_Done_Sig),  //output-to U1
 .SPI_Out(SPI_Out)         //output-to U1
 );
 endmodule
 
 module initial_control_module(
 CLK,
 RSTn,
 Start_Sig,
 SPI_Done_Sig,
 SPI_Start_Sig,
 SPI_Data,
 Done_Sig
 );
 input CLK;
 input RSTn;
 input Start_Sig;
 input SPI_Done_Sig;
 output SPI_Start_Sig;
 output [8:0]SPI_Data;
 output Done_Sig;
 reg[3:0]i;
 
 reg[8:0] rData;
 reg isSPI_Start;
 reg [31:0] delaycn;//延时计数器
 reg isDone;
 always@(posedge CLK or negedge RSTn)begin
 if (!RSTn)
 begin i<=4'd0;
 rData<=9'b100000000;
 isSPI_Start<=1'b0;
 isDone<=1'b0;
 delaycn<=32'b0;//延时计数器清零
 end
 else begin
 //delaycn<=delaycn+1'b1;//延时计数器计数
 if(Start_Sig)
 case(i)
 4'd0:
 begin
 if(SPI_Done_Sig)begin isSPI_Start<=1'b0;i<=i+1'b1;end
 else begin rData<=9'b000010111;isSPI_Start<=1'b1;end
 end
 
 4'd1:
 begin
 if(SPI_Done_Sig)begin isSPI_Start<=1'b0;i<=i+1'b1;end
 else begin rData<=9'b000101101;isSPI_Start<=1'b1;end
 end
 4'd2:
 begin
 if(delaycn<5000000)begin i<=4'd2;delaycn<=delaycn+1'b1; end
 else begin delaycn<=32'b0;i<=i+1'b1;end
 end
 4'd3:
 begin
 if(SPI_Done_Sig)begin isSPI_Start<=1'b0;i<=i+1'b1;end
 else begin rData<=9'b000101001;isSPI_Start<=1'b1;end
 end
 
 
 4'd4:
 begin rData<=9'b100000000;isDone<=1'b1;i<=i+1'b1;end
 
 4'd5:
 begin isDone<=1'b0;i<=4'd0;end
 
 endcase
 end
 end
 assign Done_Sig=isDone;
 assign SPI_Start_Sig=isSPI_Start;
 assign SPI_Data=rData;
 endmodule
 
 module spi_write_module(
 CLK,
 RSTn,
 Start_Sig,
 SPI_Data,
 Done_Sig,
 SPI_Out
 );
 input CLK;
 input RSTn;
 input Start_Sig;
 input [8:0] SPI_Data;//8位spi数据+1位读写位
 output Done_Sig;
 output [2:0] SPI_Out;
 parameter TOPSUS=4'd3;//设置分频数
 reg [3:0] Count1;
 reg [4:0] i;//
 reg SPI_CS; //
 reg rCLK;//SCL 空闲时为高电平
 reg rDO;//SDA
 reg isDone;
 always@(posedge CLK or negedge RSTn)begin
 if(!RSTn)Count1<=4'd0;
 else if(Count1==TOPSUS) Count1<=4'd0;
 else if(Start_Sig)Count1<=Count1+1'b1;
 else Count1<=4'd0;
 end
 
 always@(posedge CLK or negedge RSTn)begin
 if(!RSTn)begin
 i<=5'd0;
 rCLK<=1'b0;
 rDO<=1'b0;
 isDone<=1'b0;
 SPI_CS<=1'b1;//CS 空闲时为高电平
 end
 else if(Start_Sig)begin
 //SPI_CS<=1'b0;
 case(i)
 5'd0:
 begin
 if(Count1==TOPSUS)begin
 rCLK<=1'b1;SPI_CS<=1'b1;i<=i+1'b1;
 end
 end
 5'd1://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 SPI_CS<=1'b0;rCLK<=1'b0;rDO<=(SPI_Data[8]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd3://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[7]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd5://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[6]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd7://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[5]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd9://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[4]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd11://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[3]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd13://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[2]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd15://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[1]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd17://SCL下降沿数据开始建立
 if(Count1==TOPSUS)begin
 rCLK<=1'b0;rDO<=(SPI_Data[0]&&1'b1);i<=i+1'b1;
 end                                              //SCL下降沿数据开始建立
 5'd2,5'd4,5'd6,5'd8,5'd10,5'd12,5'd14,5'd16,5'd18: //SCL上升沿数据开始采集
 if(Count1==TOPSUS)begin
 rCLK<=1'b1;i<=i+1'b1;
 end
 5'd19:
 if(Count1==TOPSUS)
 begin rCLK<=1'b0;i<=i+1'b1;end          //SCL上升沿数据开始采集
 5'd20:
 if(Count1==TOPSUS)begin isDone<=1'b1; rCLK<=1'b0;i<=i+1'b1;SPI_CS<=1'b1;end
 5'd21:
 begin isDone<=1'b0;i<=5'd0;SPI_CS<=1'b1;end
 endcase
 end
 end
 assign Done_Sig=isDone;
 assign SPI_Out={SPI_CS,rCLK,rDO};
 endmodule
 | 
 | 
 |