1. 程式人生 > >FPGA讀寫Flash模組 Verilog程式設計

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進行相應的讀寫操作