|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 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 |
|
|