由于PCI總線工作在頻率33 MHz,AVR單片機(jī)工作在16 MHz,它們之間時(shí)鐘不同步,要進(jìn)行有效通信,必須在它們中間設(shè)置數(shù)據(jù)緩沖區(qū),作為雙方交換數(shù)據(jù)的單元。雙口RAM正好解決了這個(gè)問題,它既作為PCI總線的局部空間又作為AVR單片機(jī)的外部擴(kuò)充存儲器,通過交替讀/寫達(dá)到交換數(shù)據(jù)的目的。下面以PLX公司的PCI總線接口芯片PCI9052和IDT公司的雙口RAMIDT7006為例,介紹實(shí)現(xiàn)數(shù)據(jù)交換的方法。
1 PCI9052和IDT7006
1.1 PCI9052簡介
PCI9052是PLX公司為擴(kuò)展適配板卡推出的低價(jià)位PCI總線目標(biāo)接口芯片,低功耗,符合PCI V2.1規(guī)范,它的本地總線(Local Bus)可以通過編程設(shè)置為8/16/32位的復(fù)用或非復(fù)用總線。其主要性能特點(diǎn)如下:
(1)異步操作。PCI9052的Local Bus與PCI總線的時(shí)鐘相互獨(dú)立運(yùn)行,兩總線的異步運(yùn)行方便了高、低速設(shè)備的兼容。Local Bus的時(shí)鐘頻率范圍為0~40 MHz,TTL電平;PCI的時(shí)鐘頻率范圍0~33MHz。
(2)可編程的局部總線配置。PCI9052支持8位、16位或32位Local Bus,它們是復(fù)用或非復(fù)用。PCI9052有4個(gè)字節(jié)允許信號(LBE[3:0]#),26條地址線(LA[27:2])和32位、16位、8位數(shù)據(jù)線(LAD[31:0])。
(3)直接從(目標(biāo))數(shù)據(jù)傳送模式。PCI9052具有雙向FIFO,可用于零等待狀態(tài)突發(fā)操作,支持從PCI總線到Local Bus的存儲器映射空間的突發(fā)傳送和I/O訪問。Local Bus能被設(shè)置成突發(fā)或持續(xù)單周期。
(4)4個(gè)局部片選。PCI9052提供4個(gè)片選,每個(gè)片選的基地址和范圍被E2PROM或主機(jī)編程成唯一的。
(5)5個(gè)局部地址空間。PCI9052提供5個(gè)局部地址空間,每個(gè)局部地址空間的基地址和范圍可以被E2PROM或主機(jī)編程成惟一的。
1.2 IDT7006簡介
IDT7006是美國IDT公司開發(fā)研制的高速16K×8 B雙口靜態(tài)RAM。該雙口RAM提供兩個(gè)獨(dú)立的具有控制、地址和I/O引腳的端口。其主要性能特點(diǎn)如下:可同時(shí)訪問雙端口同一存儲器空間;高速存儲訪問,訪問速度最高可達(dá)到15 ns;低功耗運(yùn)行;雙片選,允許不需要外部邏輯的深度擴(kuò)展;使用級聯(lián)和主從選擇引腳可以擴(kuò)展IDT7006的數(shù)據(jù)總線寬度到16位或更寬;具有硬件仲裁方式、中斷仲裁方式和信號燈仲裁方式,來防止訪問沖突。
2 PCI9052和IDT7006的時(shí)序轉(zhuǎn)換
為將PCI9052的局部信號邏輯轉(zhuǎn)換為雙口RAMIDT7006的讀/寫控制信號邏輯,采用有限狀態(tài)機(jī)的方法來實(shí)現(xiàn)它們之間的邏輯轉(zhuǎn)換。在可編程器件設(shè)計(jì)中,狀態(tài)機(jī)的設(shè)計(jì)方法是應(yīng)用最廣泛的設(shè)計(jì)方法之一,它是一種簡單、結(jié)構(gòu)清晰、設(shè)計(jì)靈活的方法,易于建立、理解和維護(hù),特別應(yīng)用在具有大量狀態(tài)轉(zhuǎn)移和復(fù)雜時(shí)序控制的系統(tǒng)中,更顯其優(yōu)勢。設(shè)計(jì)中用VerilogHDL描述的狀態(tài)機(jī)來實(shí)現(xiàn)接口的時(shí)序轉(zhuǎn)換。
2.1 硬件連接
硬件上采用可編程邏輯器件MAXⅡ(EPM240)來實(shí)現(xiàn)PCI9052和IDT7006的接口電路,PCI9052采取非復(fù)用、8 b局部總線寬度和單周期讀/寫方式,信號連接關(guān)系如圖1所示。
2.2 有限狀態(tài)機(jī)
PCI9052局部總線有4個(gè)基本的狀態(tài):空閑狀態(tài)、地址狀態(tài)、數(shù)據(jù)/等待狀態(tài)和恢復(fù)狀態(tài)。一旦局部總線的主設(shè)備擁有總線并需要開始一個(gè)總線訪問,則進(jìn)入地址狀態(tài),有效,此時(shí)一個(gè)有效的地址出現(xiàn)在地址/數(shù)據(jù)總線上;數(shù)據(jù)傳輸是在數(shù)據(jù)/等待狀態(tài)進(jìn)行的,或者內(nèi)部等待產(chǎn)生器用來在此狀態(tài)插入等待狀態(tài);在最后的數(shù)據(jù)/等待狀態(tài)有效,用來申明最后的數(shù)據(jù)傳輸;在地址/數(shù)據(jù)復(fù)用的模式下,所有數(shù)據(jù)傳輸完畢后,總線會進(jìn)入恢復(fù)狀態(tài);隨后總線回到空閑狀態(tài),等待下一次的總線訪問。
整個(gè)狀態(tài)機(jī)分為外狀態(tài)機(jī)和內(nèi)狀態(tài)機(jī)兩個(gè)大的部分,外狀態(tài)機(jī)識別PCI9052的讀周期和寫周期,并轉(zhuǎn)移到相應(yīng)的內(nèi)部狀態(tài)機(jī),然后內(nèi)部狀態(tài)機(jī)再進(jìn)行讀/寫的內(nèi)部狀態(tài)轉(zhuǎn)移,通過不同的狀態(tài)輸出不同的雙口RAM讀/寫控制等信號,達(dá)到時(shí)序轉(zhuǎn)換的目的。外狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移圖如圖2所示。
內(nèi)狀態(tài)機(jī)中寫狀態(tài)機(jī)有5個(gè)狀態(tài):S0,寫空閑狀態(tài);S1,寫開始;S2,寫等待;S3,單周期寫;S4,寫結(jié)束。具體的狀態(tài)轉(zhuǎn)移圖如圖3所示。
當(dāng)系統(tǒng)復(fù)位后,狀態(tài)機(jī)輸出雙口RAM的片選信號,輸出使能,狀態(tài)機(jī)處于空閑狀態(tài)。
寫操作的狀態(tài)機(jī)轉(zhuǎn)移過程是:當(dāng)狀態(tài)機(jī)處于空閑狀態(tài)時(shí),在每次時(shí)鐘的上升沿采樣到有效和=1,并且如果雙口RAM的片選信號有效,狀態(tài)機(jī)進(jìn)入寫開始狀態(tài),輸出和有效,并將9052的局部有效地址輸出給雙口RAM;當(dāng)采樣到有效時(shí),狀態(tài)機(jī)進(jìn)入寫等待狀態(tài),輸出;當(dāng)采樣到且BUSYL=1、時(shí),狀態(tài)機(jī)進(jìn)入單周期寫狀態(tài),輸出,將有效數(shù)據(jù)輸出到雙口RAM;當(dāng)采樣到無效,狀態(tài)機(jī)進(jìn)入寫結(jié)束狀態(tài),輸出,,;之后如果采樣到有效就進(jìn)入下一次的寫操作循環(huán),如果采樣到無效且無效,狀態(tài)機(jī)回到空閑狀態(tài)。
讀狀態(tài)機(jī)也有5個(gè)狀態(tài):S0,讀空閑狀態(tài);S1,讀開始;S2,讀等待;S3,單周期讀;S4,讀結(jié)束。具體的狀態(tài)轉(zhuǎn)移圖如圖4所示。
讀操作的狀態(tài)機(jī)轉(zhuǎn)移過程是:當(dāng)狀態(tài)機(jī)處于空閑狀態(tài)時(shí),在每次時(shí)鐘的上升沿采樣到有效和=0,并且雙口RAM的片選信號有效的話,狀態(tài)機(jī)進(jìn)入讀開始狀態(tài),輸出和有效,并將9052的局部有效地址輸出給雙口RAM;當(dāng)采樣到有效時(shí),狀態(tài)機(jī)進(jìn)入讀等待狀態(tài),輸出;當(dāng)采樣到且BUSYL=1,時(shí),狀態(tài)機(jī)進(jìn)入單周期讀狀態(tài),輸出,將有效數(shù)據(jù)輸出到PCI9052;當(dāng)采樣到無效,狀態(tài)機(jī)進(jìn)入讀結(jié)束狀態(tài),輸出,,;之后如果采樣到有效就進(jìn)入下一次的讀操作循環(huán),如果采樣到無效且無效,狀態(tài)機(jī)回到空閑狀態(tài)。
2.3 仿真結(jié)果
在ModelsimSE仿真平臺下,實(shí)現(xiàn)了PCI9052讀/寫雙口RAM的讀/寫過程,讀操作仿真波形如圖5所示,寫操作仿真波形如圖6所示。從仿真波形可以看出,該代碼可以實(shí)現(xiàn)將PCI9052的讀/寫控制信號轉(zhuǎn)換成雙口RAM的讀/寫控制信號,完成時(shí)序的匹配。
3 雙口RAM的讀/寫程序
為了達(dá)到用低速模塊處理高速數(shù)據(jù)流的效果,在雙口RAM的程序處理上采用乒乓操作的技巧。乒乓操作的最大特點(diǎn)是通過“輸入數(shù)據(jù)選擇單元”和“輸出數(shù)據(jù)選擇單元”按節(jié)拍、相互配合的切換,將經(jīng)過緩沖的數(shù)據(jù)流沒有停頓地送到“數(shù)據(jù)流運(yùn)算處理模塊”進(jìn)行運(yùn)算與
處理。把乒乓操作模塊當(dāng)作一個(gè)整體,站在這個(gè)模塊的兩端看數(shù)據(jù),輸入數(shù)據(jù)流和輸出數(shù)據(jù)流都是連續(xù)不斷的,沒有任何停頓,因此非常適合對數(shù)據(jù)流進(jìn)行流水線式處理。所以乒乓操作常應(yīng)用于流水線式算法,完成數(shù)據(jù)的無縫緩沖與處理。
設(shè)計(jì)中將雙口RAM分為A,B兩個(gè)部分,各占8 KB空間。通過9052和AVR交替對兩個(gè)存儲器進(jìn)行讀/寫操作到達(dá)交換數(shù)據(jù)的目的。在雙口RAM的仲裁方式選擇上選取中斷和硬件仲裁結(jié)合的方式,中斷仲裁在硬件電路設(shè)計(jì)上比較簡單,只要將雙口RAM兩側(cè)的INT引腳連接到AVR和PCI90 52的中斷引腳上,軟件設(shè)計(jì)上只要編寫雙口RAM操作程序和中斷服務(wù)程序兩部分。具體過程是:
(1)數(shù)據(jù)下行(PCI9052寫,AVR讀)。在首次發(fā)起數(shù)據(jù)傳輸時(shí),通過握手信號告訴AVR本次數(shù)據(jù)傳輸共多少個(gè)字節(jié)。然后發(fā)起本次數(shù)據(jù)傳輸,如果數(shù)據(jù)傳輸長度小于8 KB,9052向雙口RAM的A區(qū)寫入數(shù)據(jù),并在數(shù)據(jù)全部寫完之后對地址3FFFH(右端口信箱)執(zhí)行一個(gè)寫操作,這樣引腳變?yōu)榈碗娖?,觸發(fā)AVR的一個(gè)中斷響應(yīng)程序,該程序就是雙口RAM讀寫程序中的讀函數(shù),該函數(shù)讀取雙口RAM A區(qū)中事先約定長度的數(shù)據(jù),并在操作的最后對地址3FFFH(右端口信箱)執(zhí)行一個(gè)讀操作以恢復(fù)引腳為高電平,隨后退出中斷響應(yīng)程序。
如果數(shù)據(jù)傳輸長度大于8 KB,9052寫完A區(qū)后,立即對地址3FFFH(右端口信箱)執(zhí)行一個(gè)寫操作,這樣引腳變?yōu)榈碗娖剑|發(fā)AVR的中斷響應(yīng)程序,該程序讀取全部A區(qū)的數(shù)據(jù),然后對地址3FFFH(右端口信箱)進(jìn)行一個(gè)讀操作,使恢復(fù)為高電平,之后繼續(xù)讀取B區(qū)的數(shù)據(jù);這時(shí)9052如果在B區(qū)完成了全部數(shù)據(jù)的寫入,則AVR在B區(qū)讀到約定長度的數(shù)據(jù)后結(jié)束本次數(shù)據(jù)傳輸;如果9052在B區(qū)沒有寫完全部數(shù)據(jù),則它查詢是否為高,如果為高則繼續(xù)把剩下的數(shù)據(jù)寫入A區(qū);AVR在讀完全部B區(qū)數(shù)據(jù)后進(jìn)入暫停狀態(tài),直到接到再次中斷信號繼續(xù)讀取A區(qū)數(shù)據(jù);9052在A區(qū)的地址結(jié)束時(shí)繼續(xù)觸發(fā)中斷使得AVR繼續(xù)讀取A區(qū)數(shù)據(jù),A區(qū)沒完接著讀B區(qū),這樣循環(huán)下去,直到完成約定數(shù)據(jù)的全部傳輸。具體的流程如圖7所示。
(2)數(shù)據(jù)上行(PCI9052讀,AVR寫)。雙口RAM讀/寫程序中的寫函數(shù)會將數(shù)據(jù)寫入雙口RAM的A區(qū),并在最后一步對左端口信箱3FFEH地址執(zhí)行一個(gè)寫操作,引腳變?yōu)榈碗娖剑撘_連至PCI9052的局部中斷引腳,通知9052讀取寫入的數(shù)據(jù),9052在讀取數(shù)據(jù)之后會對左端口信箱3FFEH地址執(zhí)行一個(gè)讀操作,這樣引腳恢復(fù)為高電平,使之退出中斷響應(yīng)程序。整個(gè)數(shù)據(jù)傳輸程序流程和下行相似,具體的流程如圖8所示。
4 結(jié)語
高性能雙口RAM可以有效解決上位機(jī)和下位機(jī)之間的復(fù)雜數(shù)據(jù)處理問題,實(shí)現(xiàn)時(shí)序的粘連;乒乓操作是一個(gè)常應(yīng)用于數(shù)據(jù)流控制的處理技巧,是解決高速設(shè)備和低速設(shè)備交換數(shù)據(jù)的常用方法。實(shí)踐證明本文的設(shè)計(jì)方法是解決高低速設(shè)備的傳輸瓶頸問題,提高PCI總線與AVR單片機(jī)之間的數(shù)據(jù)傳輸速度的有效途徑。