DIY_DE2之FLASH调试
DIY_DE2中使用了1片8MB的并行FLASH存储器,FLASH的操作方式可分为硬体调试和软体调试。
调试环境:Quartus II 9.0 + NIOS II 9.0
1、硬体调试
根据FLASH的datasheet按操作方式分别进行操作,
如擦除操作:
module flash_erase(
CLOCK_50,
FLASH_D,
FLASH_A,
FLASH_WE,
FLASH_CE,
FLASH_OE,
FLASH_RST,
LED
);
input CLOCK_50;
//output [7:0] oDATA;
inout [7:0] FLASH_D;
output [21:0] FLASH_A;
output FLASH_WE,FLASH_CE,FLASH_OE,FLASH_RST,LED;
//reg [7:0] oDATA;
reg [21:0] FLASH_A;
reg [10:0] i;
reg [7:0] data_out;
reg FLASH_WE,FLASH_CE,FLASH_OE,FLASH_RST;
wire [7:0] LED;
initial
begin
FLASH_CE <= 0;
FLASH_RST <= 1;
FLASH_WE <= 1;
FLASH_OE <= 1;
data_out <= 8'hzz;
end
assign FLASH_D = data_out;
assign LED = FLASH_D;
always@(posedge CLOCK_50)
begin
if(i < 29)
i <= i + 1'b1;
if(i <= 1) // the first cycle
begin
FLASH_A <= 22'hAAA;
// data_out <= 8'hAA;
end
if(i <= 2)
FLASH_WE <= 0;
if(i <= 3)
data_out <= 8'hAA;
if(i <= 4)
FLASH_WE <= 1;
// if(i <= 5)
// data_out <= 8'hzz;
if(i <= 6) // the second cycle
begin
FLASH_A <= 22'h555;
// data_out <= 8'h55;
end
if(i <= 7)
FLASH_WE <= 0;
if(i <= 8)
data_out <= 8'h55;
if(i <= 9)
FLASH_WE <= 1;
// if(i <= 10)
// data_out <= 8'hzz;
if(i <= 11) // the third cycle
begin
FLASH_A <= 22'hAAA;
// data_out <= 8'hA0;
end
if(i <= 12)
FLASH_WE <= 0;
if(i <= 13)
data_out <= 8'h80;
if(i <= 14)
FLASH_WE <= 1;
if(i <= 15) // the forth cycle
begin
FLASH_A <= 22'hAAA;
// data_out <= 8'hAA;
end
if(i <= 16)
FLASH_WE <= 0;
if(i <= 17)
data_out <= 8'hAA;
if(i <= 18)
FLASH_WE <= 1;
// if(i <= 5)
// data_out <= 8'hzz;
if(i <= 19) // the fifth cycle
begin
FLASH_A <= 22'h555;
// data_out <= 8'h55;
end
if(i <= 20)
FLASH_WE <= 0;
if(i <= 21)
data_out <= 8'h55;
if(i <= 22)
FLASH_WE <= 1;
if(i <= 23)
begin
FLASH_A[21:16] <= 6'h000000;//Sector SA0
// FLASH_A <= 22'h200000;
// FLASH_A <= 22'hAAA;
// data_out <= 8'h55;
end
if(i <= 24)
FLASH_WE <= 0;
if(i <= 25)
data_out <= 8'h30;
if(i <= 26)
FLASH_WE <= 1;
/* if(i <= 27)
FLASH_OE <= 0;
if(i <= 28)
begin
FLASH_OE <= 1;
oDATA <= FLASH_D;
end
*/
end
endmodule
读写操作:
module flash_write(
CLOCK_50,
FLASH_D,
FLASH_A,
FLASH_WE,
FLASH_CE,
FLASH_OE,
FLASH_RESET,
LED
);
input CLOCK_50;
inout [7:0] FLASH_D;
output [21:0] FLASH_A;
output FLASH_WE,FLASH_CE,FLASH_OE,FLASH_RESET;
output LED;
reg [7:0] oDATA;
reg [21:0] FLASH_A;
reg [10:0] i;
reg [7:0] data_out;
reg FLASH_WE,FLASH_CE,FLASH_OE,FLASH_RESET;
wire [7:0] LED;
initial
begin
FLASH_CE = 0;
FLASH_RESET = 1;
FLASH_WE = 1;
FLASH_OE = 1;
data_out = 8'hzz;
end
assign FLASH_D = data_out;
assign LED = oDATA;
always@(posedge CLOCK_50)
begin
if(i < 941)
begin
i <= i + 1'b1;
if(i == 1) //program command 1
begin
FLASH_A <= 22'hAAA;
end
if(i == 2)
FLASH_WE <= 0;
if(i == 3)
data_out <= 8'hAA;
if(i == 4)
FLASH_WE <= 1;
// if(i == 5)
// data_out <= 8'hzz;
if(i == 6) //program command 2
begin
FLASH_A <= 22'h555;
end
if(i == 7)
FLASH_WE <= 0;
if(i == 8)
data_out <= 8'h55;
if(i == 9)
FLASH_WE <= 1;
// if(i == 10)
// data_out <= 8'hzz;
if(i == 11) //program command 3
begin
FLASH_A <= 22'hAAA;
end
if(i == 12)
FLASH_WE <= 0;
if(i == 13)
data_out <= 8'hA0;
if(i == 14)
FLASH_WE <= 1;
if(i == 15) //write the first byte
begin
FLASH_A <= 22'h00001;
end
if(i == 16)
FLASH_WE <= 0;
if(i == 17)
data_out <= 8'h66;
if(i == 18)
FLASH_WE <= 1;
/*
if(i == 19) //program command 1
begin
FLASH_A <= 22'hAAA;
end
if(i == 20)
FLASH_WE <= 0;
if(i == 21)
data_out <= 8'hAA;
if(i == 22)
FLASH_WE <= 1;
// if(i == 5)
// data_out <= 8'hzz;
if(i == 23) //program command 2
begin
FLASH_A <= 22'h555;
end
if(i == 24)
FLASH_WE <= 0;
if(i == 25)
data_out <= 8'h55;
if(i == 26)
FLASH_WE <= 1;
// if(i == 10)
if(i == 27) //program command 3
begin
FLASH_A <= 22'hAAA;
end
if(i == 28)
FLASH_WE <= 0;
if(i == 29)
data_out <= 8'hA0;
if(i == 30)
FLASH_WE <= 1;
if(i == 31) //write the second byte
begin
FLASH_A <= 22'h200002;
end
if(i == 32)
FLASH_WE <= 0;
if(i == 33)
data_out <= 8'hBB;
if(i == 34)
FLASH_WE <= 1;
if(i == 35)
data_out <= 8'hzz;
*/
if(i == 36) //read the first byte
FLASH_A <= 22'h1;
if(i == 37)
FLASH_OE <= 0;
if(i == 38)
begin
FLASH_OE <= 1;
oDATA <= FLASH_D;
end
/*
if(i == 338) //read the second byte
FLASH_A <= 22'h4;
if(i == 339)
FLASH_OE <= 0;
if(i == 340)
begin
FLASH_OE <= 1;
oDATA <= FLASH_D;
end
if(i == 638) //read the third byte
FLASH_A <= 22'h5;
if(i == 639)
FLASH_OE <= 0;
if(i == 640)
begin
FLASH_OE <= 1;
oDATA <= FLASH_D;
end
if(i == 938) //read the forth byte
FLASH_A <= 22'h1;
if(i == 939)
FLASH_OE <= 0;
if(i == 940)
begin
FLASH_OE <= 1;
oDATA <= FLASH_D;
end
*/
end
end
endmodule
通过上述操作完成对FLASH的基本操作。
2、软体调试
这部分也可以借助NIOS II软核系统对FLASH进行测试,有两种方法:
一、用软核对FLASH进行擦除、读写操作
这种方法经过实际调试,总会出现错误提示:
二、将软核程序固化在FLASH中
将软核程序固化在FLASH中,重新上电,如果系统能正常启动,且程序运行正常,则FLASH部分调试成功。
烧写FLASH方法:
在烧写FLASH的界面中直接添加下载.sof选项,同时将配置文件和FLASH文件烧写到相应存储器里。如下图所示。
如果烧写FLASH之前,没有下载配置文件.sof,则会出现下面的错误。
如果烧写FLASH之前,下载的是配置文件.pof或者是.jic,则会出现下面的错误。
遇到的问题:
1、虚焊,虚焊导致管脚接触不良,这也是最为重要的原因;
PS:硬体调试和软体调试工程已上传。