FPGA讀寫Flash模組 Verilog程式設計
採用黑金Spartan6的開發板,板內的硬體電路設計如圖
電路嚴格按照datasheet的規定連線。
按照上圖 控制FLASH晶片僅需要控制QSPI_MIS0、QSPI_MIS1、QSPI_MIS2、QSPI_MIS3以及QSPI_CS、QSPI_CLK
按照程式實現的功能需要
1. 讀Manufacturer / Device ID (90h):先發送命令字90(1001 0000),再發送24位的地址(全0),然後接收2個byte的資料(第一個資料是Manufacturor:FEh,第二個是裝置的Device ID:17h)。資料在時鐘的上升沿取樣。
2.寫使能(06):傳送命令字06(0000 0110),資料都在時鐘的上升沿取樣。
3.寫不使能(04):傳送命令字04(0000 0100),資料都在時鐘的上升沿取樣。
4.Sector擦除(20):先發送命令字20(0010 0000),再發送24位的地址。資料都在時鐘的上升沿取樣。
5.讀狀態暫存器1 (05):先發送命令字05(0000 0101),然後接收16位的暫存器資料。資料都在時鐘的上升沿取樣。
6. Page程式設計(02):先發送命令字02(0000 0010),再發送24位的地址,然後寫入256個程式設計的資料(資料的數量可以自己修改, 但不能超過256個)。資料都在時鐘的上升沿取樣。
7. 資料讀(03):先發送命令字03(0000 0011),再發送24位的地址,然後接收資料。資料在時鐘的上升沿取樣。
根據時序圖只需要用到IO0、IO1傳送命令,命令都是8個二進位制數,需要8個clk。
頂層的電路設計圖FLASH_TEST
flash_test內部採用flash_spi模組實現資料的傳輸
flash_spi使用狀態機控制邏輯。cmd_type[3:0]為自定義編碼,用於區分不同的操作。
接收flash的資料的程式,接收read_num個數的byte資料。
需要設計的控制標誌有:
開始讀寫標誌 datacome
bit的計數標誌 cntb
byte計數標誌 read_cnt
資料輸出有效標誌 myvaild
結束標誌 read_finish
*****通過移位操作接收資料*****
mydata <= {mydata[6:0],flash_out};
完成上述後,我們就完成了flash的控制器,下面用小例子來使用我們的控制器。
通過簡易的狀態機完成狀態的跳轉,下面的操作完全按照協議即可。
i=0:讀FLASH的Device ID;
4'd0 :
if( Done_Sig ) begin
flash_cmd <= 8'h00;
i <= i + 1'b1; cmd_type <= 4'b0000;
end else begin flash_cmd <= 8'h90;
flash_addr <= 24'd0;
cmd_type <= 4'b1000;
end
i=1:傳送FLASH寫使能命令;
4'd1:
if( Done_Sig ) begin
flash_cmd <= 8'h00;
i <= i + 1'b1;
cmd_type <= 4'b0000;
end
else begin
flash_cmd <= 8'h06;
cmd_type <= 4'b1001;
end
其餘同理。 i=2:傳送Sector擦除命令,擦除從地址0開始的4KB的資料; i=3:等待100個clock; i=4:讀狀態暫存器的資料,等待Busy標誌位為0;
i=5:傳送FLASH寫不使能命令; i=6:讀狀態暫存器的資料,等待Busy標誌位為0; i=7:傳送FLASH寫使能命令; i=8:等待100個clock; i=9:傳送FLASH程式設計命令,從地址0開始寫入256個數據(0~255); i=10:等待100個clock; i=11:讀狀態暫存器的資料,等待Busy標誌位為0; i=12:傳送FLASH寫不使能命令; i=13:讀狀態暫存器的資料,等待Busy標誌位為0; i=14:傳送FLASH讀命令,讀取256個數據; i=15:結束;
flash_cmd 傳輸控制字
flash_addr 24位傳輸地址
cmd_type為自定義編碼的操作程式碼
之後根據協議控制flash進行相應的讀寫操作