天天看點

FPGA遠端固件線上更新

FPGA遠端固件線上更新

1.摘要

對最近做的FPGA遠端更新/線上更新做一個總結。一般在代碼開發階段,我們使用JTAG燒寫代碼,但當産品投入到實際使用過程中,難以再用JTAG進行固件更新。是以需要開發遠端/線上更新的功能,即使用産品自帶的通訊接口(如序列槽,以太網接口等)傳輸待更新的固件包,實作固件更新更新的功能。本文所使用的平台是ALTERA公司的cyclone IV E系列産品EP4CE30F23I7,PC通過序列槽将待更新的固件包傳發送到FPGA,FPGA将接收的固件包寫入FPGA的配置 flash:EPCS16中,并以新收到的固件包覆寫原來通過JTAG燒寫的代碼,當晶片重新上電或者進行一次重配置,FPGA便會執行新的固件包。

2.FPGA上電加載過程

目前,大多數FPGA晶片是基于 SRAM 的結構的, 而 SRAM 單元中的資料掉電就會丢失,是以系統上電後,必須要由配置電路将正确的配置資料加載到 SRAM 中,FPGA才能正常運作。EP4CE30F23I7采用EPCS16作為配置晶片,是以我們要做的就是将要更新的固件包燒寫到此EPCS16晶片中。每次晶片上電,配置電路就會加載EPCS16中的固件包,進行一次配置,FPGA還有一個重配置的ip核,也可以在FPGA運作過程中進行重配置。

  FPGA上電後會自動從0位址開始加載鏡像檔案(把一個FPGA工程綜合生成的檔案成為一個鏡像檔案),看别人說的rpd檔案末尾至少留32個位元組的FF,我認為可能是加載到32個連續的FF就會停止加載檔案。

  我的思路是編寫一個工程稱為出廠配置工程,再編寫一個工程稱為應用工程,應用工程是我們正常的編寫的工程,也就是我們需要更新的固件。将出廠配置工程轉換成jic檔案并通過JTAG燒進flash中,但是隻将該檔案燒寫在flash的前幾個扇區,具體幾個扇區由你的出廠配置程式的大小來定,我自己生成的jic檔案占用6個扇區,在生成Jic檔案時可以選擇代碼在flash中的位址的,是以我的出廠配置所占的位址範圍為0x0 ~ 0x5FFFF,占前6個扇區。而我編寫的應用工程則放在從0x60000開始位址的地方,線上燒寫鏡像檔案時,将需要更新的檔案從0x60000位址開始寫就可以了。我們線上燒寫的是rpd檔案,後面具體介紹這幾種檔案。

FPGA遠端固件線上更新

2.1FPGA配置方式

1.JTAG方式

通過JTAG接口,利用Quartus II軟體可以直接對FPGA進行單獨的硬體重新配置。Quartus II軟體在編譯時會自動生成用于JTAG配置的.sof檔案。如果同時使用AS方式和JTAG方式來配置FPGA,JTAG配置方式擁有最高的優先級,此時AS方式将停止,而執行JTAG方式配置。

2.FPGA主動串行(AS)方式

主動串行配置方式(AS)是将配置資料事先存儲在串行配置器件EPCS中,然後在系統上電時Cyclone IV FPGA通過串行接口讀取配置資料(如果是壓縮資料,還會進行解壓縮處理)對内部的SRAM單元進行配置。因為上述配置過程中FPGA控制配置接口,是以通常稱為主動配置方式。在配置期間,Cyclone IV用過串行接口來讀配置資料,來對裡面的SRAM程式設計。串行配置器件的四個接口包括,串行時鐘輸入DCLK,串行資料輸出DATA,低有效的片選信号NCE,串行資料輸入ASDI。本文就是采用這種方式。

3.FPGA被動(Passive)方式

此方法用的較少,不做介紹。

2.2配置晶片EPCS16

FPGA遠端固件線上更新

  如上圖為EPCS系列容量表。EP4CE30F23I7采用EPCS16作為配置晶片,EPCS16共有16Mbit的存儲空間被分成了32個扇區( sector),每個扇區又分成256頁( page),每一頁包含256位元組。EPCS16各扇區的位元組位址如下圖所示:

對EPCS16的具體操作,在講到ASMI IP核時再具體講,我們利用ALTERA官方的IP核來對EPCS16進行擦除、讀、寫的操作。

FPGA遠端固件線上更新

2.3FPGA生成的幾種檔案

1.sof檔案

sof檔案是編譯(分析、綜合、布線、生成、時序)過程中生成的一個檔案,生成的sof檔案是可以直接通過JTAG口下載下傳到FPGA的SRAM中去并直接執行。

2.jic檔案

jic檔案不是在編譯過程中生成的,而是需要使用Quartus II軟體的“Convert Programing File”功能将sof檔案轉換得到的。得到的jic檔案,通過JTAG口可以将jic檔案通過FPGA作為橋接晶片下載下傳到配置晶片中去。

3.pof檔案

pof檔案和sof檔案一樣也是在Assemble過程中生成的,但是pof檔案是不能直接下載下傳到FPGA的SRAM中去的,而是通過ASP端口直接下載下傳到FPGA的配置晶片中去的。配置晶片一般是串行FLASH晶片,在上電的時候FPGA會主動的從配置晶片中讀取資料并燒寫内部的SRAM資料然後執行程式。(在assignments – device – device and pin option, 在configuration 頁籤當中,要勾上Use Configuration device,并選擇好配置晶片。 選擇configuration scheme為Active Serial,編譯就能生成pof檔案)

4.rpd檔案

rpd檔案為包含cyclone系列晶片二進制位流資料和配置資料的二進制檔案的合成檔案。我們生成rpd檔案前,先要生成Pof檔案再用Quartus II軟體的“Convert Programing File”功能将pof檔案轉換成rpd檔案。

我們一般是通過JTAG将Jic檔案燒進EPCS16,線上更新是将rpd檔案通過序列槽/網口等方式燒進EPCS16,當然燒寫的過程是依靠FPGA來完成,我們要寫一段代碼用來接收序列槽/網口資料,将其寫入EPCS16中。jic、rpd檔案生成時,都是占2M位元組,但檔案内實際有效的并沒有那麼大,其中無效的資料都由FF填滿,可以手動删除,但至少保留32個位元組的FF。

3.需要使用到的IP核

主要是“ASMI IP核”和“ Remote Update IP核”,還有PLL IP核。PLL不必多說。另外兩個IP核配置如下圖。

FPGA遠端固件線上更新

  如下面左邊圖所示,選擇要添加的端口。注意“Single byte write”和“Page write”分别表示以“單位元組”寫入或“多位元組”寫入。EPCS16是支援多位元組寫入的,最多可連續寫入256個位元組,我這裡選擇的是單位元組寫入。“Use ‘bulk_erase’ port”和“Use ‘sector_erase’ port”分别表示是以一次性擦除是以扇區和每次隻擦除一個扇區。具體内容可參照“Serial Configuration Devices(EPCS1, EPCS4, EPCS16, EPCS64,and EPCS128) Data Sheet”和“ASMI Parallel Intel® FPGA IP Core User Guide”這兩個文檔,在ALTERA官網可以找到,裡面有具體的讀,寫,擦除的時序圖。

FPGA遠端固件線上更新

  REMOTE IP核配置如下圖,最好将 “Enable reconfig POF checking”選上,這是該IP核的一個功能,當觸發重配置,該功能會校驗指定重配置位址的鏡像檔案是否是有效地,這一點至關重要,後面講實作思路時再具體講為什麼一定要這個功能。

FPGA遠端固件線上更新

  前面提到過ASMI IP核主要實作讀寫配置存儲器EPCS16,這個IP核就是用來擦除,寫,讀EPCS16,我們通過這個ip核,不用再管對EPCS16擦除,寫,讀的時序,EPCS16的擦除,寫,讀時序也并不複雜,完全可以直接寫,在EPCS16手冊裡有詳細的時序圖,但推薦使用asmi ip核,因為要使用remote update ip核的“pof_error”功能,必須要使用asmi Ip核。在“Remote Update Intel® FPGA IP User Guide”手冊裡有詳細介紹。

  這裡再簡單交代一下配置remote ip 核代碼的流程。

  remote ip核發起重配置需要一段代碼來實作,主要内容就是指定重配置位址,然後發起重配置。

4.功能實作思路

一個完整的遠端系統更新應該包括兩個工程檔案。一個出廠配置工程,一個應用工程。兩個工程分别在EPCS16中所占的儲存空間是 0x0 ~ 0x5FFFF,0x60000 ~ 0x1FFFFF。FPGA一上電,就會加載0位址處的配置檔案,配置電路。這個時候FPGA跑的就是出廠配置工程。

  出廠配置工程的代碼邏輯:

  1.第一步執行發起重配置,将0x60000位址後的代碼配置到FPGA中。這個時候就需要用到pof_error校驗的功能,在發起重配置的congfig信号發出之前,檢驗一下指定位址的配置檔案是否完整可用。若證明可用,才發起重配置。若不可用就不發起重配置。因為如果重配置失敗,這時候FPGA内部機制決定會繼續發起重配置,但是配置檔案是不完整的,就會一直發起在重配置,就死掉了。實測證明,隻要勾選了pof_error校驗的功能,不管自己是否手動判斷pof_error,重配置時都會進行校驗,如果重配置失敗,就不會再發起重配置,目前FPGA依然是目前配置的電路,還可以正常工作,這時候就可以繼續燒寫新的配置檔案。那麼為什麼第一步就要發起重配置,因為我們采用的是出廠配置工程+應用工程的結構。這樣做的原因是為了應對在更新過程中發生斷電,若斷電,那麼配置檔案就會不完整,就死掉了。但采用這種方法,更新過程中,出廠配置工程始終沒有被修改,因為我們更新的配置檔案是從0x60000開始的,至少可以保證還可以再次更新。那麼既然應用工程在0x60000位址處,而一上電配置的電路又是出廠配置檔案,那麼出廠配置檔案裡第一步就應該進行重配置。這一步重配置若成功,則FPGA裡配置的電路就是我們的應用工程了。若失敗,則到出廠配置工程第二步。

2.第二步接受序列槽/網口之類的資料,并将資料寫到EPCS16裡。資料燒寫完成,再發起重配置,配置應用工程到FPGA裡。如果這個時候配置又失敗了,那麼繼續燒寫資料到EPCS16裡,直到資料燒寫無誤,燒寫資料可以采用一些校驗手段,一幀一幀的收收據,寫到EPCS16裡。

上面是情況是指應用工程所在位址配置檔案是無效的。當應用工程本就是正常使用的,隻是目前需要更新新的程式了。那麼一上電,還是會先配置出廠配置工程,配置完成又配置成應用工程。最後在FPGA裡跑的電路是應用工程,那麼就要求在應用工程也需要有接受序列槽/網口資料,燒寫EPCS16的功能,幾乎需要将出廠配置工程裡的功能都要加到應用工程裡。但應用工程裡不再需要重配置功能了,應用工程在沒有收到更新的請求時,正常跑應用電路,在收到應用更新請求時,更新應用工程。

5.小結

本文主要描述了線上更新裡用到的兩個IP核和我書寫該代碼時的方法邏輯。至于序列槽/網口接收資料,接收資料過程中防止收錯資料、漏收資料的校驗方法,燒寫擦除EPCS16,沒有過多介紹。

注意

1.本文提到的兩個IP 核工作頻率限制在20M以内。

2.EPCS16在寫之前要先擦除,否則可能寫入失敗。

繼續閱讀