歡迎您光臨本站 登入註冊首頁

從配置PROM/FLASH讀取用戶數據

admin @ 2014-03-26 , reply:0

概述

前沿   在FPGA設計中,配置PROM(如18V00系列)/FLASH(XCF00系列)主要的功能是存儲FPGA設計,然後在上電之後,自動將設計裝載到FPGA當中。在有……

前沿
    在FPGA設計中,配置PROM(如18V00系列)/FLASH(XCF00系列)主要的功能是存儲FPGA設計,然後在上電之後,自動將設計裝載到FPGA當中。在有些時候,FPGA設計並未全部將配置PROM/FLASH的存儲單元全部佔用,因此,未被佔用的單元就被浪費掉了。
    在某些應用中,用戶需要在片外(FPGA外)存儲自己定義的數據,這個時候就要單獨掛PROM/FLASH晶元到FPGA上,這樣不僅增加了設計難度(用戶需要專門編寫存儲控制介面)、增加成本、增加布板難度、增加FPGA管腳使用數量等,從而給設計者帶來很多不便。如果用戶自定義的數據量不是很大,而且正好可以放到PROM/FLASH的未被佔用的存儲單元中,那麼將極大減輕設計者的負擔,減少成本,增加系統可靠性。
    下面將詳細介紹如何將用戶自定義數據存儲到PROM/FLASH中,以及如何讀取這些數據。

具體實現
 原理
    要想實現將用戶自定義數據寫入PROM/FLASH以及從它們當中讀出來,首先要明確以下幾個問題:

  • FPGA設計數據如何被寫入到PROM/FLASH當中
  • PROM/FLASH中的數據如何被讀到FPGA當中(配置FPGA過程)

    理解了以上兩個問題,我們就能從總體上知道是什麼原理使用戶數據能寫入到PROM/FLASH當中,並被讀出來。看FIG1:(註:以下所有的討論都是認為FPGA的配置模式是主-串模式)
 
    在FIG1中,有幾個關鍵信號:CCLK,CE/,OE_RESET/,INIT/(INIT/在FPGA上)。在主-串模式配置過程中,上電之後,由FPGA的CCLK引腳發出時鐘,驅動PROM/FLASH的CLK,而PROM/FLASH根據CE/、OE_RESET/的狀態來確定是否地址增加(此“地址”是PROM/FLASH內部數據存儲單元的地址)。如果FPGA將所有的設計數據讀取完畢,則停止產生CCLK時鐘。而CE/、OE_RESET/的狀態可能在FPGA配置完畢之後變化,使地址複位。注意,當CCLK產生且PROM/FLASH有數據輸出時,要判斷這些數據是否是設計數據。判斷的方法是通過一個同步欄位來實現的。不同系列的FPGA同步欄位會有不同,比如Virtex系列FPGA同步欄位是AA995566h。在對應FPGA的配置手冊中會找到其同步欄位。
    上述所述過程大概描述了一個FPGA的配置過程。因此,如果要想在FPGA配置成功之後,繼續讀取用戶自定義在PROM/FLASH中的數據,就要在上述過程中做一下變動,而且不影響正常的FPGA配置。
    通過研究PROM/FLASH的手冊,可以知道,當CE/變高后,PROM/FLASH的地址計數器就會複位,而不再因為CLK有脈衝而地址增加。所以,當FPGA配置完畢后,設計者要阻值CE/變高。
    在配置過程中,INIT/變低,表示FPGA接收的數據有CRC校驗錯誤,這時PROM/FLASH的地址計數器會清零。
    當OE_RESET/為低,PROM/FLASH的地址計數器複位。
    Tab1為OE_RESET/和CE/與PROM/FLASH地址的真值表:
 
    通過前面分析幾個信號對PROM/FLASH地址的影響以及FPGA配置過程,可以有如下的方法來實現在成功配置FPGA之後,正確讀取PROM/FLASH中的用戶自定義數據:

  • CE/信號腳在FPGA成功配置后,不能為高,因此將該引腳連接到一USER IO上,這樣當FPGA配置成功后,該USER IO輸出低,這樣CE/就不會變高,從而PROM/FLASH地址就不會複位。在我們一般的應用中,是將FPGA的DONE引腳連接到CE/上,這樣的目的是當FPGA成功配置后,DONE變高,從而CE/變高,這樣PROM/FLASH的地址就複位了。如果我們採用一USER IO連接到CE/上,那麼這個時候,DONE腳就不能在連接到CE/上。DONE腳此時可以只驅動LED就可以了。注意DONE腳的上拉電阻要保留。其實CE/也可以直接接到GND上,但是這樣PROM/FLASH一直在使能,對晶元不好,也增加了功耗。
  • OE_RESET/直接連接到INIT/上,同時INIT/在FPGA成功配置后,要作為一個USER IO使用。這樣一方面保證在FPGA配置過程中如果出現CRC錯誤,可以再重新發起一次配置動作;另一方面當FPGA成功配置后,INIT/成為一個USER IO,可以使該USER IO輸出為高,這樣OE_RESET/為高,PROM/FLASH內部地址不會複位,PROM/FLASH處在輸出使能狀態。

    以上兩個措施保證了在FPGA成功配置后,PROM/FLASH的地址不會清零。但是由於FPGA成功配置后,CCLK就停止產生,所以,儘管PROM/FLASH地址沒有被複位,但是也不會增加。還要想辦法使地址增加。
    在上述條件滿足時,地址增加就要有時鐘輸入到PROM/FLASH的CLK引腳上。由於CCLK的不可控性(儘管BitGen中有一些選項可以影響CCLK的變化。我沒有仔細去研究過),因此需要有一個設計者可控的時鐘信號輸入到PROM/FLASH的CLK引腳上。當FPGA成功配置后,CCLK為3態且有一個弱的到VCCO的上拉,因此將一個USER IO連接到PROM/FLASH的CLK引腳上是可行的。也就是說FPGA的CCLK和一個USER IO同時都連接到PROM/FLASH的CLK引腳上。這樣,設計者就可以在FPGA成功配置后,通過控制USER IO來產生時鐘脈衝,來讀取自定義在PROM/FLASH中的數據。因為數據是串列的,而且PROM/FLASH的地址對設計者來說不可見,因此借鑒FPGA在配置時是如何確定從PROM/FLASH讀出的數據是設計數據的方法:識別同步頭。因此,在生成用戶自定義數據的時候,也要考慮一個有意義的同步頭數據。
    如數據可以按照FIG2來分佈:
 
    如何生成用戶數據並加入到mcs文件中,在後面有描述。

Read宏單元實現
    從前面描述,清楚了在硬體上如何改動,使之適合在FPGA配置成功后,能讀取PROM/FLASH中的用戶自定義數據。但是,如何讀取、讀取這個動作如何實現,還是需要專門設計一個模塊才可以。
FIG3是一個標準的讀PROM/FLASH數據的宏單元框圖:
 
    該宏單元實現了在FPGA成功配置后,從PROM/FLASH中讀取用戶自定義數據。各引腳信號說明,見Tab2:

Table2:Read PROM/FLASH宏單元信號描述與功能
信號名 IO
方向
描述
clock 輸入 所有信號的寄存都是在clock的上升沿
reset 輸入 非同步低有效複位信號。該信號將所有邏輯複位到初始狀態。
din/d0 輸入 連接到PROM/FLASH的數據輸出引腳。用戶數據出現在該引腳上。
read 輸入 該信號低有效。該信號指示該宏單元從PROM/FLASH中讀取下一個8bit數據。
next_sync 輸入 該信號低有效。該信號指示該宏單元搜索存儲在PROM/FLASH中的下一個同步欄位。
dout[7:0] 輸出 用戶自定義數據會出現在該匯流排上。該匯流排上是否是有效的用戶數據,由data_ready來指示。當data_ready保持一個時鐘周期的低電平時,表明該匯流排上的數據是有效的。
data_ready 輸出 該信號低有效。當該信號持續一個時鐘周期為低時,就表明dout[7:0]上的數據是有效的用戶自定義數據。
sync 輸出 該信號低有效。當從檢測到從PROM/FLASH中讀出的數據有同步欄位時,該信號變低。
reset_prom 輸出 該信號低有效。當該宏單元被複位時,該信號就會變低。該信號連接到PROM/FLASH的CE/或OE_RESET/上。當該信號為低時,使PROM/FLASH的地址計數器複位。
cclk 輸出 該信號非FPGA引腳上那個CCLK。該信號只是模擬CCLK。


下面詳細介紹該宏單元是如何被設計以及如何工作的。

  • 時鐘管理
        在這裡主要目的是產生正確的模仿CCLK的cclk。因此,需要有一個時鐘使能,當該時鐘使能有效時,cclk就會產生。而這個時候還要確保從PROM/FLASH中讀出的數據能正確被FPGA所捕獲到。
        在cclk的上升沿,都會有新的數據出現的din/d0上,在cclk的下降沿,一個din數據讀使能信號有效,使數據在系統時鐘clock的上升沿進入移位寄存器和比較模塊。這樣對於FPGA內部的寄存器來說就有足夠的建立和保持時間。
         cclk的產生是通過對clock的分頻來產生的。因為PROM/FLASH有一個對時鐘頻率的要求,因此該cclk最終是多少Hz有PROM/FLASH決定。一般是10MHz。採用SRL16移位的方法,可以產生這個cclk。SRL16移位的長度視clock的頻率而定。通過這種方法產生的cclk,避免了使用DLL和DCM就可以達到產生同步時鐘的目的。FIG4是時鐘管理單元的時序圖:
     
  • 移位寄存器和比較器
         時鐘管理的目的是產生合適頻率且與系統時鐘同步的cclk,而移位寄存器和比較器的目的就是判斷從PROM/FLASH過來的數據,是否有同步欄位,如果發現同步欄位,則sync變低。如果考慮設計更靈活,則可以有幾個同步欄位。如果用戶自定義數據中含有與同步欄位匹配的數據,則仍然會有sync產生,但是,只有data_ready來指示是否是有效的用戶數據。
        該部分的時序圖如FIG5:
     
  • 控制狀態機
        cclk產生了,同步欄位的判斷也實現了,如何控制整個模塊的具體動作就由控制狀態機來實現。控制狀決定有多少數據需要讀取、何時搜索下一個同步欄位、何時讀取下一位元組用戶數據、何時複位PROM/FLASH地址等。圖FIG6為控制狀態機的狀態轉換圖。
     
    FIG7為控制狀態機的時序圖:
     
         通過前面原理性的描述再結合狀態機狀態轉換圖,可以很明確的知道狀態機是如何工作的。在FPGA配置完成以後,狀態機由複位狀態(RESET)進入尋找同步欄位狀態(S1),這個時候cclk是有輸出的,如果沒有發現同步欄位,則一直維持在尋找同步欄位狀態(S1)。當發現同步欄位后,關閉cclk輸出使能,同時進入到等待用戶指令狀態(S2),在該狀態等待用戶指令,即是否開始從PROM/FLASH中讀取數據或尋找同步欄位。如果用戶邏輯使能read信號,則轉到得到數據狀態(S3),這時打開cclk輸出使能;如果想尋找下一個同步欄位,則使能next_sync,進入尋找同步欄位狀態(S1),同時cclk輸出使能。(個人認為這樣設計是非常合理的:即用戶數據用不同的同步欄位分割成不同的數據段,這樣用戶就可以根據實際需要,確定讀哪一段、以及該段應讀多少數據,在用戶邏輯里,如果有必要,應該增加一個已讀數據計數器。但是這個是根據實際需要而定)在得到數據狀態(S3),計數接收到數據。由於數據是以位接收,以位元組送出,故這個狀態存在一個計數器。在該狀態,存在兩個不同的判斷計數器值的語句,根據代碼,思考一下就會明白的。當計數器值滿足條件以後,就進入數據輸出狀態(S4)。在數據輸出狀態(S4)狀態,已經串-並轉換后的數據從dout[7:0]輸出,同時轉到等待用戶指令狀態(S2)。

如何將用戶定義數據加到PROM/FLASH
    前面所述都是已經假定用戶數據已經裝到了PROM/FLASH當中,現在就講述具體怎樣實現數據的裝入。
    首先存在一個名字為Perl的腳本文件,該腳本文件可以使用戶定義數據加到PROM文件中。格式是Intel Object和Hex格式。
    Perl腳本文件可以在參考設計的/Perl_Script目錄中找到。
    Perl腳本文件不支持Motorola EXORmacs和TEKTRONIX TEK兩種文件格式。
    為了詳細解釋這個腳本文件做了什麼以及其如何工作,因此有必要詳細PROM文件的格式。將分3部分來詳細描述PROM文件的格式。

  • 位交換
    很好理解位交換。在Intel Object和Hex格式文件里的數據的順序和數據從PROM/FLASH中讀到FPGA當中后的順序是相反的。也就是說在Intel Object和Hex文件中的MSB是FPGA當中的LSB,Intel Object和Hex文件中的LSB,在FPGA當中是MSB。就是順序顛倒了。
    在Hex文件里,可以使能位交換或者不使能位交換,但是Intel Object文件則無此功能。
    由於數據順序的顛倒,因此,可以有兩種方式來處理位交換:
    1. 用戶數據不作任何變化而附加到PROM配置數據後面。當用戶數據讀到FPGA當中之後,根據實際需要,再決定是否將順序調整過來;
    2. 用戶數據做了位交換后再附加到PROM配置數據後面。這樣用戶數據讀到FPGA當中之後,就不必再做順序調整。
    以上兩種方法都是可取,同時採用第一種方法也不會增加額外的邏輯資源開銷。
    在使用Perl腳本的時候,由於Hex文件有位交換是否使能的功能,因此-swap選項可以on或者off,來打開位交換使能或者關閉。儘管Intel Object無此功能,但是-swap選項也必須說明,儘管此時的說明是不起任何作用的。
  • 記錄、位元組技術、校驗和(不知道Record具體該翻譯成哪個詞,這裡我翻譯成“記錄”)
    當將用戶數據附加到PROM文件後面的時候,需要說明許多數據域。Hex格式文件不需要附加任何數據域,但是Intel Object格式文件要附加開始字串域、位元組計數域、地址域、記錄類型域、校驗和域、以及實際的數據。Perl文件可以自動計算這些域,並將它們加到PROM文件當中。為使腳本文件可以正確計算這些數值,用戶數據需要以每行16位元組排列。
    Tab3到Tab5是可被iMPACT識別的記錄類型:其中
    00:數據記錄
    01:文件記錄結束(指示文件結束)
    04:擴展的線性地址記錄(提供偏移,以便來確定絕對的目的地址)
    校驗和採用2進位和的補碼方式以16進位給出。2進位和包括位元組計數值+地址+記錄類型+數據類型。
    擴展的線性地址記錄定義了一個32位的線性地址。該地址加到後續的數據記錄地址上,得到絕對地址。
     
     
  • PROM大小
    PROM/FLASH是有大小限制的。因此要考慮可裝到PROM/FLASH中的用戶數據的大小。FPGA設計部分所佔的PROM/FLASH的空間可以從對應FPGA的datasheet上查到。FPGA設計+同步欄位+用戶數據,這三者所佔的空間要小於PROM/FLASH的容量。
    註:在參考設計的/Perl_Script目錄下有個readme.txt文件。這個文件里詳細說明了如何使用Perl腳本。

參考設計
在附件的壓縮文件里有參考設計。這裡簡單介紹一下參考設計。FIG9是參考設計的框圖:
 
從PROM/FLASH中讀到的數據在LCD上顯示。LCD的驅動有PicoBlaze實現。

其他實現方法
    前面講的是在主-串模式下從PROM/FLASH中讀用戶數據。當然也可以採用SelectMap模式以并行方式從PROM/FLASH中讀取用戶數據。在設計方法與前述無太大區別,只是採用SelectMap方式后,數據為并行方式,少了串-並轉換以及bit計數。
    在同步欄位問題上,如果用戶數據分為幾個不同部分,可以採用所有同步欄位都相同以及同步欄位不同的方式。兩者各有優缺點。如果同步欄位都相同,就不清楚當前所讀的數據是屬於哪一段;如果同步欄位不同,可以清楚當天所讀數據屬於哪個部分,但是存在同步欄位更新和存儲的問題。很好理解,不再贅述。

說明
    本文檔全部內容完全來自於Xilinx XAPP694文檔。參考設計也完全來自Xilinx的XAPP694.zip。由於時間和個人能力原因,肯定存在翻譯和理解有偏差的地方,歡迎大家指正。有部分地方存在語句不通順及錯別字,也請大家海涵。


[admin via 研發互助社區 ] 從配置PROM/FLASH讀取用戶數據已經有2304次圍觀

http://cocdig.com/docs/show-post-42999.html