天天看點

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

一、軟體與硬體平台

       軟體平台:

              作業系統:Windows 7 64-bit

              開發套件:ISE14.7

       硬體平台:

              FPGA型号:XC6SLX45-CSG324

              QSPI Flash型号:W25Q128BV

二、背景介紹

  在FPGA開發過程中,如果我們把bit檔案下載下傳到FPGA中,那麼當FPGA掉電以後,bit檔案就丢失,再次上電的時候,代碼就不會運作了。如果想掉電以後,代碼還可以運作,那麼必須把編譯好的檔案下載下傳到外部的QSPI Flash中。當檔案下載下傳到外部的QSPI Flash中以後,由于QSPI Flash是一種非易失性存儲器,掉電以後裡面的資料并不會丢失,待重新上電以後,FPGA會自動讀取QSPI Flash中的資料把代碼加載到FPGA内部的RAM中運作。

  由于bit不能直接下載下傳到QSPI Flash中,是以必須先把bit檔案轉化為.mcs檔案或者.bin檔案,然後才能下載下傳到QSPI Flash中。

  本文主要教大家如何把bit檔案轉化為.bin檔案和.mcs檔案,然後下載下傳到外部的QSPI Flash中。同時為了加快上電以後FPGA加載QSPI Flash中mcs檔案的速度,我們可以把bit檔案配置為4線模式(前提是你的硬體必須支援四線模式),并修改加載的時鐘頻率,進而大大加快FPGA的啟動速度。

三、目标任務

       1、把編譯好的bit檔案轉化為.bin檔案

       2、把編譯好的bit檔案轉化為.mcs檔案

       3、把.bin檔案或者.mcs檔案燒錄到外部的QSPI Flash中

       4、修改.bit檔案的模式以及支援的時鐘頻率

四、待測代碼

module led_top
(
    input           I_clk       ,
    input           I_rst_n     ,
    output  [3:0]   O_led_out
);

reg  [31:0]  R_cnt_ls      ;
wire         W_clk_ls      ;
reg          R_clk_ls_reg  ;
reg  [3:0]   R_led_out_reg ;

//////////////////////////////////////////////////////////////////
// 功能:産生1s的時鐘
//////////////////////////////////////////////////////////////////
always @(posedge I_clk or negedge I_rst_n)
begin
    if(!I_rst_n)
        begin
            R_cnt_ls        <= 32\'d0 ; 
            R_clk_ls_reg    <= 1\'b1  ;
        end 
    else if(R_cnt_ls == 32\'d24_999_999)
        begin
            R_cnt_ls        <= 32\'d0          ;
            R_clk_ls_reg    <= ~R_clk_ls_reg  ;  
        end
    else
        R_cnt_ls <= R_cnt_ls + 1\'b1 ;          
end

assign W_clk_ls = R_clk_ls_reg ;

//////////////////////////////////////////////////////////////////
// 功能:對輸出寄存器進行移位産生流水效果
//////////////////////////////////////////////////////////////////
always @(posedge W_clk_ls or negedge I_rst_n)
begin
    if(!I_rst_n) 
        R_led_out_reg <= 4\'b0001 ; 
    else if(R_led_out_reg == 4\'b1000)
        R_led_out_reg <= 4\'b0001 ;
    else    
        R_led_out_reg <= R_led_out_reg << 1 ;             
end

assign O_led_out = ~R_led_out_reg ;

endmodule      

  寫好待測代碼,并添加實體限制檔案綁定好管腳,我的開發闆上的限制檔案如下

NET I_clk LOC = V10 | TNM_NET = sys_clk_pin | IOSTANDARD = "LVCMOS33";
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;

NET I_rst_n           LOC = N4 | IOSTANDARD = "LVCMOS15"; ## SW2 pushbutton

NET O_led_out<0>    LOC = V5 | IOSTANDARD = "LVCMOS33";       ## LED1

NET O_led_out<1>    LOC = R3 | IOSTANDARD = "LVCMOS33";       ## LED2

NET O_led_out<2>    LOC = T3 | IOSTANDARD = "LVCMOS33";       ## LED3

NET O_led_out<3>    LOC = T4 | IOSTANDARD = "LVCMOS33";       ## LED4      

五、任務

一、把.bit檔案轉化為.bin檔案。

  1、編寫好代碼和限制檔案,輕按兩下Generate Programming File成bit

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  2、如果上一步你沒做任何設定的話你的工程目錄下隻會産生一個bit檔案,如果需要産生bin檔案的話,選中Generate Programming File,右鍵選擇Process Properties...

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  3、在彈出的視窗中單擊General Options,并勾選-g Binary選項,并點選最下面的OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  4、Generate Programming File前面變成了“問号”圖示

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  5、重新輕按兩下Generate Programming File,完畢以後工程目錄就生成了.bin檔案

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  在ISE不支援bin檔案下載下傳到QSPI Flash,但是Vivado支援,後續會有Vivado調試教程以及燒錄教程。

二、把.bit檔案轉化為.mcs檔案。

  1、編寫好代碼和限制檔案,輕按兩下Generate Programming File成.bit檔案

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  2、輕按兩下Configure Target Device

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  3、在彈出的視窗中點選OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  4、在彈出的ISE iMPACT中輕按兩下Create PROM File(PROM File Formatter)

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  5、在彈出的PROM File Formatter視窗中選擇Configure Signal FPGA,并點選右邊綠色的箭頭進入Step 2

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  6、然後選擇Storage Device(bits)為外部QSPI Flash的容量,我的QSPI Flash型号是W25Q128BV,容量為128Mbits,是以我選擇128M。接着點選的Add Storage Device,然後點選綠色的箭頭進入Step 3

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  7、點選上圖中的Add Storage Device,然後點選下圖的箭頭進入Step3

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  8、設定Output File Name為.mcs檔案的名字,我設定為和.bit檔案的名字相同(這一項可以随便設定)。設定Output File Location為.bit檔案所在的目錄(這一項也可以随便設定),File Format設定為MCS。

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  9、點選上圖中最下面的OK,彈出以下視窗

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  10、在上圖中直接點選OK,在彈出的新視窗中選擇要轉化的.bit檔案并點選右下角的“打開”

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  11、在彈出的新視窗中選擇NO

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  12、在彈出的新視窗中選擇OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  13、輕按兩下左側的Generate File...,生成.mcs檔案

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  14、生成完畢以後會出現Generate Succeeded字樣

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  15、工程目錄下出現了.mcs檔案

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  16、輕按兩下Boundary Scan

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  17、點選Initialize Chain圖示(這一步一定要保證開發闆處于上電狀态并且Jtag線連接配接正常)

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  18、在彈出的視窗中選擇NO(因為我們馬上要把.mcs燒錄到Flash中,而不是下載下傳.bit檔案,是以選擇NO)

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  19、在新彈出的視窗中選擇OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  20、輕按兩下FPGA上面的那個虛線框包裹起來的圖示

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  21、在彈出的檔案選擇視窗中選擇之前生成好的.mcs檔案,并點選打開

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  22、接着在彈出的新視窗中選擇晶片型号為W25Q128BV,Data Width為1,點選OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  23、選中FPGA上面的FLASH圖示,右鍵在彈出的菜單中單擊Program

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  24、在彈出的新視窗中選擇OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  25、接着就進入了燒錄QSPI Flash的過程,這個過程與下載下傳.bit相比要慢的多,需要耐心等待

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  26、下載下傳成功以後出現Successful字樣

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  27、接着關掉開發闆的電源然後再打開,等一小段時間以後,程式就開始自動運作了。

三、修改bit檔案的配置,加快FPGA加載速度

  可以發現,産生的.mcs檔案隻有3.89M,但是重新上電到程式開始執行卻花費了好幾秒的時間,如果工程十分龐大,則FPGA選型的時候勢必會選擇邏輯資源更多的FPGA,那麼編譯後産生的.mcs檔案會大的多,上電後加載的時間也會更長,是以在實際項目中,往往會修改bit檔案的配置參數來加快上電以後代碼的加載速度。具體步驟如下

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  1、編寫好代碼和限制檔案,輕按兩下Generate Programming File成bit

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  2、選中Generate Programming File,右鍵選擇Process Properties...

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  3、在彈出的視窗中單擊Configuration Options,并設定Configuration Rate為26MHz,設定Set SPI Configuration Bus Width參數為4。并點選最下面的OK

【設計經驗】3、ISE中燒錄QSPI Flash以及配置mcs檔案的加載速度與傳輸位寬

  注意:Configuration Rate這個參數的值不能超過你使用的QSPI Flash晶片手冊中指定的最高的讀頻率,大多數QSPI Flash的晶片手冊會在第一頁說它們支援的頻率高達100M甚至更高,但是其實這個頻率并不是指晶片支援的讀資料頻率,Flash晶片支援的讀資料頻率一定要在晶片手冊電氣特性(Electrical Characteristics)那一節找。如果你選擇的時鐘頻率超過QSPI Flash支援的最高讀取頻率太多,出現的現象就是FPGA根本無法加載QSPI Flash中的鏡像檔案導緻FPGA啟動失敗;如果你選擇的時鐘頻率超過QSPI Flash支援的最高讀取頻率一點點的話,出現的現象就是FPGA加載QSPI Flash中的鏡像檔案大機率失敗。是以一般選擇的Configuration Rate參數值要稍微低于QSPI Flash支援的最高讀頻率。

  舉三個例子:

  Micron公司的N25Q064A支援的最高頻率為108MHz,但支援的讀指令頻率為54MHz,對于這個器件來說Configuration Rate不能選的高于54MHz

  Macronix公司的MX25L25645G支援的最高頻率為133MHz,但支援的讀指令頻率為50MHz,對于這個器件來說Configuration Rate不能選的高于50MHz

  本文使用的Winbond公司的W25Q128BV支援的最高頻率為104MHz,但支援的讀指令頻率為33MHz,對于這個器件來說Configuration Rate不能選的高于33MHz,我們選擇為26MHz

  另外要說明的是Configuration Rate這個值對于不同的FPGA來說,值的範圍不同。我目前使用的XC6SLX45支援的最高頻率僅為26MHz,而XC7K325T支援的最高頻率高達66MHz。

  還有一點要注意的是,Set SPI Configuration Bus Width可以設定為4的前提是你的開發闆上QSPI Flash和FPGA之間四根資料線都是連通的,并且PCB上建議做好四根資料線的蛇形等長。

  4、接着重新生成.bit檔案,然後把.bit檔案按照上文的方法生成.mcs檔案下載下傳到QSPI Flash中,這個過程不在重複。

  5、燒錄完畢以後,重新給開發闆斷電然後再上電,你會發現上電的瞬間,程式就開始運作了,幾乎感覺不到等待的時間。由于XC6SLX45這個器件的資源相較于7系列FPGA來說邏輯資源并不算多,生成的mcs檔案并不算大,是以才這麼快,而對于高端一點的FPGA來說,FPGA編譯後的鏡像檔案能達到十幾兆甚至更大,比如XC7K325t生成的鏡像檔案約為10M左右,是以即使你這麼設定了還是有一點延時的,不過比單線肯定是要快的多。注意,生成的FPGA鏡像檔案大小與FPGA型号有關,與邏輯代碼的多少無關,在同一塊FPGA中,你寫一個流水燈的代碼和調用了幾個FFT,FIR數字濾波器IP核的信号處理代碼生成的FPGA鏡像檔案的大小是相同的。

  至此,整個實驗過程全部完畢。

六、總結

  1、在生成bit檔案的設定中勾選-g Binary選項可以生成bin檔案

  2、在生成mcs檔案之間提前對bit進行速率與位寬的設定可以提高FPGA從Flash加載程式的速度

  3、設定Configuration Rate參數之前一定要閱讀QPSI Flash晶片手冊的電氣特性(Electrical Characteristics)一節,找到支援的最高頻率。