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:硬体调试和软体调试工程已上传。 

posted @ 2011-10-31 14:58  sunev  阅读(765)  评论(0编辑  收藏  举报