|
不知为什么仿真所有的信号都是未知状态!?实在不懂,即便控制模块写的有问题,但clk和rst_n不至于也是未知状态吧??!!请大师们帮忙!!
//////////////控制模块//////
module LCD_Control(
clk,rst_n,
LCD_DATA,LCD_EN,LCD_RW,LCD_RS,LCD_ON,LCD_BLON);
input clk,rst_n;
output LCD_RW,LCD_ON,LCD_BLON;
output LCD_RS;
output LCD_EN;
output [7:0]LCD_DATA;
reg LCD_RS;
reg LCD_EN;
reg [7:0]LCD_DATA;
///////////默认信号设置///////////////////////////////
wire LCD_RW=1'b0; //只写
wire LCD_ON=1'b1; //LCD电源开关,置1
wire LCD_BLON=1'b1;
//////////////////主状态机////////////////////////////
parameter IDLE = 2'b01;
parameter A = 2'b10;
///////////////////////////////////////////////////////
reg FF; //任务结束标志位
reg [ 1:0 ] state;
reg [ 4:0 ] LUT_INDEX;
reg [ 7:0 ] cnt_cmd;
reg [ 7:0 ] cnt_data;
parameter LUT_SIZE = 5'd13;
//////////////////tsk_wr_cmd状态//////////////////////
parameter CMD_ST0 = 5'b00001;
parameter CMD_ST1 = 5'b00010;
parameter CMD_ST2 = 5'b00100;
parameter CMD_ST3 = 5'b01000;
parameter CMD_ST4 = 5'b10000;
reg [ 5:0 ] cmd_state;
//////////////tsk_wr_cmd//////////////////////////////
task tsk_wr_cmd;
input [ 7:0 ] cmd_data;
case ( cmd_state )
CMD_ST0: begin
LCD_RS <= 1'b0;
LCD_DATA <= cmd_data;
cmd_state <= CMD_ST1;
end
CMD_ST1: begin
if ( cnt_cmd == 8'd100 ) begin
cnt_cmd <= 8'd0;
cmd_state <= CMD_ST2;
end
else
cnt_cmd <= cnt_cmd + 1;
end
CMD_ST2: begin
LCD_EN <= 1'b1;
cmd_state <= CMD_ST3;
end
CMD_ST3: begin
if ( cnt_cmd == 8'd100 ) begin
cnt_cmd <= 8'd0;
cmd_state <= CMD_ST4;
end
else
cnt_cmd <= cnt_cmd + 1;
end
CMD_ST4: begin
LCD_EN <= 1'b0;
LUT_INDEX <= LUT_INDEX + 1;
FF <= 1'b1; //退出此任务
end
endcase
endtask
//////////////////tsk_wr_data状态/////////////////////
parameter DATA_ST0 = 6'b000001;
parameter DATA_ST1 = 6'b000010;
parameter DATA_ST2 = 6'b000100;
parameter DATA_ST3 = 6'b001000;
parameter DATA_ST4 = 6'b010000;
reg [ 5:0 ] data_state;
////////////////////tsk_wr_data///////////////////////
task tsk_wr_data;
input [ 7:0 ] data;
case ( data_state )
DATA_ST0: begin
LCD_RS <= 1'b1;
LCD_DATA <= data;
data_state <= DATA_ST1;
end
DATA_ST1: begin
if ( cnt_data == 8'd100 ) begin
cnt_data <= 8'd0;
data_state <= DATA_ST2;
end
else
cnt_data <= cnt_data + 1;
end
DATA_ST2: begin
LCD_EN <= 1'b1;
data_state <= DATA_ST3;
end
DATA_ST3: begin
if ( cnt_data == 8'd100 ) begin
cnt_data <= 8'd0;
data_state <= DATA_ST4;
end
else
cnt_data <= cnt_data + 1;
end
DATA_ST4: begin
LCD_EN <= 1'b0;
LUT_INDEX <= LUT_INDEX + 1;
FF <= 1'b1;
end
endcase
endtask
//////////////////////////////////////////////////////
reg [ 7:0 ] LUT_DATA;
/////////////写数据查找表/////////////////////////////
always begin
case ( LUT_INDEX )
5'd0: LUT_DATA <= 8'h38;
5'd1: LUT_DATA <= 8'h0c;
5'd2: LUT_DATA <= 8'h06;
5'd3: LUT_DATA <= 8'h01;
5'd4: LUT_DATA <= 8'h30;
5'd5: LUT_DATA <= 8'h33;
5'd6: LUT_DATA <= 8'h30;
5'd7: LUT_DATA <= 8'h39;
5'd8: LUT_DATA <= 8'h34;
5'd9: LUT_DATA <= 8'h30;
5'd10: LUT_DATA <= 8'h39;
5'd11: LUT_DATA <= 8'h32;
5'd12: LUT_DATA <= 8'h34;
default: LUT_DATA <= 8'bzzzzzzzz;
endcase
end
////////////////////////////////////////////////////////
always @ ( posedge clk or negedge rst_n )
if ( !rst_n ) begin
cnt_cmd <= 8'd0;
cnt_data <= 8'd0; //计数器初始化
state <= IDLE;
cmd_state <=CMD_ST0;
data_state<= DATA_ST0;
LUT_INDEX <= 5'd0;
FF <= 1'b0;
end
else if ( LUT_INDEX < LUT_SIZE )
case ( state )
IDLE: begin
if ( LUT_INDEX <= 5'd3 ) begin
if ( FF == 1'b0 )
tsk_wr_cmd( LUT_DATA );
else begin
FF <= 1'b0;
state <= IDLE;
end
end
else
state <= A;
end
A: begin
if ( FF == 1'b0 )
tsk_wr_data( LUT_DATA );
else begin
FF <= 1'b0;
state <= A;
end
end
endcase
/////////////////////////////////////////////////////////////////////////
endmodule
下面是testbench
`timescale 1ns/1ns
module t;
reg clk,rst_n;
wire LCD_EN,LCD_RW,LCD_RS,LCD_ON,LCD_BLON;
wire [ 7:0 ] LCD_DATA;
always #5 clk = ~clk;
initial
begin
clk =0;
rst_n=0;
#20;
rst_n=1;
#8000 $stop;
end
LCD_Control t1(.clk(clk),.rst_n(rst_n),.LCD_EN(LCD_EN),.LCD_RW(LCD_RW),.LCD_RS(LCD_RS),.LCD_ON(LCD_ON),.LCD_BLON(LCD_BLON),.LCD_DATA(LCD_DATA));
endmodule
但是不知为什么仿真所有的信号都是未知状态!?实在不懂,即便控制模块写的有问题,但clk和rst_n不至于也是未知状态吧??!!请大师们帮忙!!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|