一、軟體與硬體平台
軟體平台:
作業系統: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

2、如果上一步你沒做任何設定的話你的工程目錄下隻會産生一個bit檔案,如果需要産生bin檔案的話,選中Generate Programming File,右鍵選擇Process Properties...
3、在彈出的視窗中單擊General Options,并勾選-g Binary選項,并點選最下面的OK
4、Generate Programming File前面變成了“問号”圖示
5、重新輕按兩下Generate Programming File,完畢以後工程目錄就生成了.bin檔案
在ISE不支援bin檔案下載下傳到QSPI Flash,但是Vivado支援,後續會有Vivado調試教程以及燒錄教程。
二、把.bit檔案轉化為.mcs檔案。
1、編寫好代碼和限制檔案,輕按兩下Generate Programming File成.bit檔案
2、輕按兩下Configure Target Device
3、在彈出的視窗中點選OK
4、在彈出的ISE iMPACT中輕按兩下Create PROM File(PROM File Formatter)
5、在彈出的PROM File Formatter視窗中選擇Configure Signal FPGA,并點選右邊綠色的箭頭進入Step 2
6、然後選擇Storage Device(bits)為外部QSPI Flash的容量,我的QSPI Flash型号是W25Q128BV,容量為128Mbits,是以我選擇128M。接着點選的Add Storage Device,然後點選綠色的箭頭進入Step 3
7、點選上圖中的Add Storage Device,然後點選下圖的箭頭進入Step3
8、設定Output File Name為.mcs檔案的名字,我設定為和.bit檔案的名字相同(這一項可以随便設定)。設定Output File Location為.bit檔案所在的目錄(這一項也可以随便設定),File Format設定為MCS。
9、點選上圖中最下面的OK,彈出以下視窗
10、在上圖中直接點選OK,在彈出的新視窗中選擇要轉化的.bit檔案并點選右下角的“打開”
11、在彈出的新視窗中選擇NO
12、在彈出的新視窗中選擇OK
13、輕按兩下左側的Generate File...,生成.mcs檔案
14、生成完畢以後會出現Generate Succeeded字樣
15、工程目錄下出現了.mcs檔案
16、輕按兩下Boundary Scan
17、點選Initialize Chain圖示(這一步一定要保證開發闆處于上電狀态并且Jtag線連接配接正常)
18、在彈出的視窗中選擇NO(因為我們馬上要把.mcs燒錄到Flash中,而不是下載下傳.bit檔案,是以選擇NO)
19、在新彈出的視窗中選擇OK
20、輕按兩下FPGA上面的那個虛線框包裹起來的圖示
21、在彈出的檔案選擇視窗中選擇之前生成好的.mcs檔案,并點選打開
22、接着在彈出的新視窗中選擇晶片型号為W25Q128BV,Data Width為1,點選OK
23、選中FPGA上面的FLASH圖示,右鍵在彈出的菜單中單擊Program
24、在彈出的新視窗中選擇OK
25、接着就進入了燒錄QSPI Flash的過程,這個過程與下載下傳.bit相比要慢的多,需要耐心等待
26、下載下傳成功以後出現Successful字樣
27、接着關掉開發闆的電源然後再打開,等一小段時間以後,程式就開始自動運作了。
三、修改bit檔案的配置,加快FPGA加載速度
可以發現,産生的.mcs檔案隻有3.89M,但是重新上電到程式開始執行卻花費了好幾秒的時間,如果工程十分龐大,則FPGA選型的時候勢必會選擇邏輯資源更多的FPGA,那麼編譯後産生的.mcs檔案會大的多,上電後加載的時間也會更長,是以在實際項目中,往往會修改bit檔案的配置參數來加快上電以後代碼的加載速度。具體步驟如下
1、編寫好代碼和限制檔案,輕按兩下Generate Programming File成bit
2、選中Generate Programming File,右鍵選擇Process Properties...
3、在彈出的視窗中單擊Configuration Options,并設定Configuration Rate為26MHz,設定Set SPI Configuration Bus Width參數為4。并點選最下面的OK
注意: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)一節,找到支援的最高頻率。