|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2010-10-22 09:26:11
|
显示全部楼层
我写了这个控制器。但是液晶没反应,不知道是什么问题。
我写过2遍了,用VHDL写了一个不行,现在用VERILOG写的这个也不行。
大家帮我看看是不是有什么原则上的问题?
module avalon_tft
( clk,
reset_n,
chipselect,
address,
write,
byteenable,
writedata,
data,cs,rd,rs,wr,reset
);
//inputs
input clk;
input [1:0]byteenable;
input reset_n;
input chipselect;
input [2:0]address;
input write;
input [15:0] writedata;
//outputs
output [15:0]data;
output cs;
output rd;
output rs;
output wr;
output reset;
reg [15:0] data_reg;
reg cs_reg;
reg rd_reg;
reg rs_reg;
reg wr_reg;
reg reset_reg;
//signal
wire data_selected, cs_selected, rd_selected,rs_selected,wr_selected,reset_selected;
wire write_to_data, write_to_cs, write_to_rd,write_to_rs,write_to_wr,write_to_reset;
wire valid_write;
//address decode
assign data_selected = !address[2] & !address[1] & !address[0]; //address 000
assign cs_selected = !address[2] & !address[1] & address[0]; //address 001
assign rd_selected = !address[2] & address[1] & !address[0]; //address 010
assign rs_selected = !address[2] & address[1] & address[0]; //address 011
assign wr_selected = address[2] & !address[1] & !address[0]; //address 100
assign reset_selected = address[2] & !address[1] & address[0]; //address 101
assign valid_write = chipselect & write;
assign write_to_data = valid_write & data_selected;
assign write_to_cs = valid_write & cs_selected;
assign write_to_rd = valid_write & rd_selected;
assign write_to_rs = valid_write & rs_selected;
assign write_to_wr = valid_write & wr_selected;
assign write_to_reset = valid_write & reset_selected;
//Write to data Register
always@(posedge clk or negedge reset_n)
begin
if(~reset_n)begin
data_reg[15:0] <= 16'b0000_0000_0000_0000;
end
else begin
if(write_to_data) begin
case(byteenable)
2'b01: data_reg[7:0] <= writedata[7:0];
2'b10: data_reg[15:8] <= writedata[15:8];
default:data_reg[15:0] <= data_reg[15:0];
endcase
end
else begin
data_reg[15:0] <= data_reg[15:0];
end
end
end
//Write to cs Register
always@(posedge clk or negedge reset_n)
begin
if(~reset_n)begin
cs_reg <= 1'b1;
end
else begin
if(write_to_cs) begin
case(byteenable)
2'b01: cs_reg <= writedata[0];
default:cs_reg <= cs_reg;
endcase
end
else begin
cs_reg <= cs_reg;
end
end
end
//Write to rd Register
always@(posedge clk or negedge reset_n)
begin
if(~reset_n)begin
rd_reg <= 1'b0;
end
else begin
if(write_to_rd) begin
case(byteenable)
2'b01:rd_reg <= writedata[0];
default:rd_reg <= rd_reg;
endcase
end
else begin
rd_reg <= rd_reg;
end
end
end
//Write to rs Register
always@(posedge clk or negedge reset_n)
begin
if(~reset_n)begin
rs_reg <= 1'b0;
end
else begin
if(write_to_rs) begin
case(byteenable)
2'b01:rs_reg <= writedata[0];
default:rs_reg<= rs_reg;
endcase
end
else begin
rs_reg<= rs_reg;
end
end
end
//Write to wr Register
always@(posedge clk or negedge reset_n)
begin
if(~reset_n)begin
wr_reg <= 1'b0;
end
else begin
if(write_to_wr) begin
case(byteenable)
2'b01:wr_reg <= writedata[0];
default:wr_reg <= wr_reg;
endcase
end
else begin
wr_reg <= wr_reg;
end
end
end
//Write to reset Register
always@(posedge clk or negedge reset_n)
begin
if(~reset_n)begin
reset_reg <= 1'b0;
end
else begin
if(write_to_reset) begin
case(byteenable)
2'b01:reset_reg <= writedata[0];
default:reset_reg <= reset_reg;
endcase
end
else begin
reset_reg <= reset_reg;
end
end
end
assign data[15:0]=data_reg[15:0];
assign cs=cs_reg;
assign rs=rs_reg;
assign rd=rd_reg;
assign wr=wr_reg;
assign reset=reset_reg;
endmodule |
|