《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > 采用EEPROM對大容量FPGA芯片數(shù)據(jù)實現(xiàn)串行加載

采用EEPROM對大容量FPGA芯片數(shù)據(jù)實現(xiàn)串行加載

2009-03-04
作者:范宏波 李一民 朱紅梅

  摘? 要: 通過對比多種FPGA數(shù)據(jù)加載方式,從可靠性、經(jīng)濟性及PCB設(shè)計等幾個方面說明了串行加載的優(yōu)越性,分析了目前串行加載所面臨的問題。為解決串行加載新面臨的問題,提出了采用EEPROM與9500系列CPLD相結(jié)合實現(xiàn)串行加載的構(gòu)想,并通過實際設(shè)計,成功地實現(xiàn)了該構(gòu)想。

  關(guān)鍵詞: FPGA? CPLD? EEPROM? 并-串轉(zhuǎn)換

?

  自大規(guī)模現(xiàn)場可編程邏輯器件問世以來,先后出現(xiàn)了兩類器件,一類是基于SRAM體系結(jié)構(gòu)的FPGA系列,如XILINX公司的4000系列和最新的Virtex系列;另一類是基于fastFLASH技術(shù)的CPLD器件,如XILINX公司的9500系列和Lattice公司的ispLSxx系列芯片。FPGA具有容量大、設(shè)計資源豐富、片內(nèi)ROM及RAM設(shè)計靈活等特點[1],但是它們需要在每次上電時進行數(shù)據(jù)加載。目前實現(xiàn)加載的方法有以下三種:①采用PROM并行加載;②采用專用SROM串行加載;③采用單片機控制實現(xiàn)加載。第一種方式需要占用較多的FPGA管腳資源,雖然這些管腳在加載完成后可用作一般I/O口,但在加載時不允許這些管腳有其他任何外來信號源;另外數(shù)據(jù)存儲器PROM與FPGA之間的大量固定連線如8位數(shù)據(jù)線以及大量訪問PROM的地址線等,使得PCB設(shè)計不便。但是第一種方式有一個有利的方面,即PROM的容量較大、容易購置、價格低、技術(shù)支持(編程器)較好。第二種方式情況剛好與第一種方式相反,即占用資源少、PCB布板方便,但是容量小、價格較高、兼容性差。第三種方式采用單片機控制,由PROM中讀取并行數(shù)據(jù),然后再串行送出。由于涉及到單片機編程,對于開發(fā)者來說較為不便;另外,如果單片機僅用來實現(xiàn)該任務(wù),較為浪費硬件資源。CPLD的一個最大優(yōu)點是采用計算機專用開發(fā)工具,通過JTAG口直接一次性實現(xiàn)編程數(shù)據(jù)加載,并永久保留,除非進行再次編程(與GAL器件相似)。該類器件比較適合在實驗室內(nèi)進行現(xiàn)場調(diào)試,但是由于其數(shù)據(jù)的加載必須通過計算機,因此對于從事野外作業(yè)者來說會產(chǎn)生不便。

  通過上述比較,并結(jié)合實際工作情況,我們認為采用串行數(shù)據(jù)加載比較方便、可靠(這種可靠性得益于FPGA與SROM之間較少的接口線)。但隨著FPGA規(guī)模的不斷升級,其CONFIG數(shù)據(jù)量越來越大,截止到本文寫作時,CONFIG數(shù)據(jù)量最大已到6MBIT,雖然XILINX公司有相關(guān)的XC17X系列SROM提供使用,但皆為一次性芯片[2]、開發(fā)成本較高、代理商供貨周期長、價格較高,這給FPGA的應(yīng)用及普及帶來很大的障礙。我們曾使用過AT&T公司的ATT17系列電可擦除SROM,但是該類SROM芯片能與XILINX系列FPGA芯片實現(xiàn)接口的種類不多,且容量小。由于種種原因,其價格往往是同樣存儲容量的EEPROM的五、六倍,甚至更高,并且來源困難。那么能不能結(jié)合并行加載與串行加載的優(yōu)點,從而解決大容量FPGA數(shù)據(jù)加載的問題呢?我們在仔細分析了串行加載機制后,認為采用EEPROM作為數(shù)據(jù)存儲器,經(jīng)過可控的并-串轉(zhuǎn)換,應(yīng)該可以實現(xiàn)數(shù)據(jù)加載。下面以XILINX公司Virtex系列XCV100芯片為例,采用ATMEL公司1兆位的AT29C010A進行數(shù)據(jù)存儲,采用XILINX公司9500系列XC95108芯片作為加載控制器件進行設(shè)計。

1 原理設(shè)計

  原理性Master Serial模式串行加載時序如圖1所示。在該加載模式中,比較重要的幾個信號為/INIT、CCLK、DATAIN、DONE。/INIT表示FPGA芯片上電時或者當(dāng)/PROGRAM信號為低時FPGA內(nèi)部數(shù)據(jù)初始化過程,并作為外送信號給數(shù)據(jù)加載控制器件作為復(fù)位之用。當(dāng)/INIT信號躍為高電平時,CCLK開始啟動。加載數(shù)據(jù)DATAIN在CCLK的上升沿打入,與通用串行通訊相類似,加載數(shù)據(jù)流也有開始位與結(jié)束位,且以數(shù)據(jù)幀的方式接收。一旦發(fā)生錯誤,FPGA立即停止接收數(shù)據(jù),并將/INIT信號置為低電平,因此該信號又稱為錯誤指示信號。當(dāng)數(shù)據(jù)全部接受并驗證無誤后,FPGA將DONE信號置為“1”[3]。

?

?

  在分析了FPGA加載數(shù)據(jù)流特性后,可以得出這樣一個結(jié)論:保證CCLK與DATAIN之間的嚴格同步與連續(xù)性,就可以實現(xiàn)加載?;诖私Y(jié)論,在生成加載數(shù)據(jù)格式時,產(chǎn)生單片SROM串行格式,對于XILINX公司的FPGA系列,該格式為.MCS文件格式;然后用ALL07編程器以INTEL HEX數(shù)據(jù)格式將其寫入EEPROM中。余下的工作是在CCLK、/INIT、DATAIN的控制下完成并-串轉(zhuǎn)換。該控制過程采用一片CPLD之95系列XC95108芯片來承擔(dān),在設(shè)計容量上采用一片XC9536即可完成,之所以采用XC95108是因為其尚需要完成其他任務(wù)。其原理框圖如圖2所示。

?

2 并-串轉(zhuǎn)換時序設(shè)計

  在時序設(shè)計上,關(guān)鍵在于要保持DATAIN加載數(shù)據(jù)的連續(xù)性、DATAIN與CCLK加載時鐘的同步性以及EEPROM訪問地址的復(fù)位問題。對于復(fù)位問題,采用上電時FPGA產(chǎn)生的/INIT信號對95108內(nèi)部的EEPROM地址發(fā)生器復(fù)位。這樣做的原因是/INIT與FPGA之CCLK時鐘產(chǎn)生有著同步關(guān)系,但同時也默認上電加載是一次成功;在考慮串行DATAIN數(shù)據(jù)的連續(xù)性時,采用兩組移位寄存器,設(shè)定它們?yōu)镽_shiftA和R_shiftB,當(dāng)R_shiftA在進行移位操作時,R_shiftB由EEPROM中讀入八位并行數(shù)據(jù),反之亦然;為保持DATAIN與CCLK時鐘的同步性,所有上述操作都以CCLK為同步時鐘,值得注意的是,由于DATAIN串行數(shù)據(jù)是在CCLK的上升沿打入FPGA,因此我們給予XC95108芯片設(shè)計的運轉(zhuǎn)時鐘是經(jīng)過反相的CCLK時鐘,這樣就保證了CCLK與DATAIN的時間關(guān)系。

  以下是為該加載設(shè)計的VHDL硬件編程語言設(shè)計程序[4][5],其中的計數(shù)器及移位寄存器模塊用F2.1I設(shè)計軟件之LogicBlox模塊產(chǎn)生。整個程序經(jīng)F2.1I開發(fā)軟件仿真、編譯成功后,經(jīng)JTAG編程電纜寫入XC95108芯片。加電后便加載成功,經(jīng)多次加電實驗,成功率為100%。

  雖然該程序是針對XCV100芯片及AT29C010A EEPROM設(shè)計的,但對于其他FPGA及EEPROM芯片同樣適用,不同的是針對不同容量的EEPROM,應(yīng)改變其地址計數(shù)器的位數(shù)。

  library IEEE;

  use IEEE.std_logic_1164.all;

  use ieee.std_logic_arith.all;

  use ieee.std_logic_unsigned.all;

  entity v10sload is

?????? port (

?????? pDATA: in STD_LOGIC_VECTOR(7 downto 0);

?????? pADDRESS:inout STD_LOGIC_VECTOR(16

????????????????????????????????????????????downto 0);

????? ???? CCLKIN: in STD_LOGIC;

 ??????? ?RESET:in STD_LOGIC;

?????????? DATAIN:out STD_LOGIC

????????????? );

  end v10sload;

  architecture v10sload_arch of v10sload is

  signal:loadin,CE,nCE,CCLK8,nRESET,nCCLK,aDATAIN,

????????????? bDATAIN:std_logic;

  signal clkenable,CCLK:std_logic;

  signal ppDATA:std_logic_vector(7 downto 0);

  component clk_div8

????????????? PORT(

??? CLOCK,ASYNC_CTRL: IN std_logic;

??? CLK_OUT: OUT std_logic);

end component;

component R_shift8

  PORT(

???  D_IN: IN std_logic_vector(7 DOWNTO 0);

???  LOAD: IN std_logic;

???  CLK_EN: IN std_logic;

???  CLOCK: IN std_logic;

???  LS_OUT: OUT std_logic);

end component;

component BUFG

  port(I:in std_logic; O:out std_logic);

end component;

begin

??? -------------------------------????

--data-loading function statements here

nRESET<=not RESET;

init_data:process(RESET)

begin

  if(RESET='0') then

????ppDATA<=″00000000″;

????else ppDATA<=pDATA;

end if;

end process init_data;

L0:BUFG???? port map(I=>CCLKIN,O=>CCLK);

nCCLK<=not CCLK;

L1:counter17? portmap

????(CLOCK=>CCLK8,ASYNC_CTRL=>nRESET,

?????Q_OUT=>pADDRESS);

L2:clk_div8? portmap

?  (CLOCK=>nCCLK,ASYNC_CTRL=>nRESET,

????CLK_OUT=>CCLK8);

nCE<=not pADDRESS(0);

CE<=pADDRESS(0);

clkenable<='1';

L3:R_shift8??? portmap

??? (D_IN=>ppDATA,LOAD=>nCE,CLK_EN=>

????????????? ??? clkenable,CLOCK=>nCCLK,

??? LS_OUT=>aDATAIN);

L4:R_shift8??? portmap

????(D_IN=>ppDATA,LOAD=>CE,CLK_EN=>

????clkenable,CLOCK=>nCCLK,

??? LS_OUT=>bDATAIN);

process(aDATAIN,bDATAIN,CE)

begin

  if(CE='1') then DATAIN<=aDATAIN;

  else DATAIN<=bDATAIN;

end if;

end process;

end v10sload_arch;

?

參考文獻

1 XILINX 公司DATABOOK,1999:54~56

2 XILINX公司網(wǎng)站www.xilinx.com

3 王小軍.VHDL 簡明教程.北京:清華大學(xué)出版社,1997

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。