摘? 要: 分析了PCI總線接口信號及時序,,利用ALTERA公司的EPLD器件EPM7128 設計和實現(xiàn)了PCI總線接口。
關鍵詞: PCI總線? 接口? EPLD器件? AHDL語言
?
PCI總線自其問世以來,,以其諸多優(yōu)點,,在當今的計算機系統(tǒng)中得到了廣泛應用,,已經(jīng)成為計算機設備的標準接口。本文在認真分析PCI總線的接口信號和接口時序的基礎上,,利用EPLD器件設計實現(xiàn)了PCI總線接口,。由于EPLD器件支持在線編程,所以可以根據(jù)使用要求將PCI總線接口配置成即插即用和非即插即用兩種形式,,這種設計方式結構簡單,、集成度高,具有較高的實用價值,。
1 PCI總線概述
局部總線特別是PCI總線的發(fā)展,,打破了PC數(shù)據(jù)傳送的瓶頸。傳統(tǒng)的PC總線結構不能滿足圖形系統(tǒng)和大型應用程序的要求,,所以在此基礎上產生和發(fā)展了局部總線,。它將計算機外設從I/O總線上移下來,使它們更靠近系統(tǒng)處理器,,從而提高了處理器和外設之間的傳送速度,。
從設備的PCI接口至少需要47條信號線,而主控設備的PCI接口至少需要49條信號線,,包括數(shù)據(jù)/地址復用總線,、接口控制線、仲裁,、總線命令以及系統(tǒng)線等,。
PCI總線在進行數(shù)據(jù)傳輸時,地址節(jié)拍,、總線命令在C/BE[0..3]上由主機輸出,,用于說明當前PCI總線周期需要執(zhí)行的功能。其命令如表1所示,。
?
2 PCI總線協(xié)議和讀寫時序
PCI總線的傳輸機制是成組數(shù)據(jù)猝發(fā)傳輸,,每組數(shù)據(jù)由一個地址脈沖和一個或幾個數(shù)據(jù)脈沖組成。一般基本的PCI傳輸由三個信號控制:
信號由PCI主控設備驅動,表示總線操作的開始和結束;
信號由PCI主控設備驅動,,在讀周期表示主控設備準備接收數(shù)據(jù),,在寫周期表示AD[31..0]上數(shù)據(jù)有效;
信號由PCI從設備驅動,在讀周期,,表示從設備準備好傳輸數(shù)據(jù),,在寫周期表示從設備準備好接收數(shù)據(jù)。
當數(shù)據(jù)有效時,,數(shù)據(jù)源設備需要無條件地設置XRDY有效,,一旦主控設備使有效,中途不能改變
狀態(tài),,直到
信號無效或數(shù)據(jù)傳送結束,。
PCI是地址/數(shù)據(jù)復用總線,其讀操作的時序如圖1所示,。當進行PCI讀傳輸時,,首先置低,
有效,,讀傳輸開始,,同時AD[31..0]保持有效地址信號,C/BE[3..0]保持總線命令,。如果總線命令為存儲器讀(0110),,AD[31..0]地址在從設備地址范圍內,從設備置
有效,,主控設備驅動
,表明主控設備準備好接收數(shù)據(jù),。為避免總線沖突,接下來的一個周期AD[31..0]既不被主控設備驅動,,也不被從設備驅動(該周期成為總線轉換周期),,此后AD[31..0]上出現(xiàn)數(shù)據(jù),C/BE[3..0]變?yōu)樽止?jié)允許信號,,主控設備開始檢測
信號,。如果
信號無效(為高電平),則主控設備自動插入等待周期,,如果
信號有效,,則總線開始傳輸數(shù)據(jù)。在最后一個數(shù)據(jù)脈沖之后,,主控設備將
和
置為無效,表示傳輸結束,。
??? 寫傳輸時,由于地址均由主控設備提供,,因此不存在總線轉換周期,。其傳輸過程與讀周期基本類似,,只是C/BE[3..0]上的總線命令為存儲器寫(0111),具體的傳輸時序如圖2所示,。
?
?
3 PCI總線的接口設計方案
??? 根據(jù)以上分析,選用ALTER的高速EPLD器件EPM7128S84來完成PCI總線接口的設計,。為簡化起見,,選用存儲器作為從設備,其總體結構如圖3所示,。
?
?
? 下面將給出用AHDL語言編寫的EPLD控制程序以及仿真結果,。為簡單起見,設定從設備為非即插即用類型的PCI插卡,,直接將其地址空間配置為0X50000000~0X5FFFFFFF(或在計算機內不與其他設備沖突的地址),,時鐘周期選用33MHz,具體的程序如下:
SUBDESIGN? pci_if
(
?????? clkin????????? :?? input,;
?????? frame??? ????? :?? input,;
?????? ad[31..0]????? :?? input;
?????? cbe[3..0]????? :?? input,;
?????? irdy????? ???? :?? input,;
?????? trdy?????? ? ? :?? output;
?????? devsel???? ??? :?? output,;
?????? wr??????? ???? :?? output,;
?????? cs??????? ???? :?? output;
?????? a[10..0]???????:?? output,;
)
variable
?????? count[1..0]??? :?? DFF,;
?????? da[31..0]????? :?? DFF;
?????? wr1??????????? :?? node,;
?????? rd1??????????? :?? node,;
?????? sign1????????? :?? node;
?????? sign2???? ???? :?? node,;
???????sign4???? ???? :?? node,;
?????? sign3???? ???? :?? node;
?????? cs1??????????? :?? node,;
begin
????count[1..0].clk=clkin,;
count[1..0].clrn=!frame;
??? sign1=(count[]==3),;
??? if sign1 then count[].d=count[].q,;
??? else
??? count[].d=count[].q+1;
??? end if,;
sign2=(count[]<1)&!frame,;
sign3=(count[]>=2)&(count[]<=3),;
sign4=(count[]>=1)&(count[]<=3);
????da[31..0].clk=sign2&!frame,;?
da[31..0].d=ad[31..0],;
cs1=!da31&da30&!da29&da28;?
if cs1 then?
?????? devsel=!sign4,;
?????? a[10..0]=ad[10..0],;
?????? wr1=!cbe3&cbe2&cbe1&cbe0;
?????? rd1=!cbe3&cbe2&cbe1&!cbe0,;
?????? if rd1&!irdy then
???????????????????? trdy=!sign3,;
??? ????????????? !cs=cs1&!frame;
??? ????? ?????????? wr=rd1&!frame,;
????????????? ?? end if,;
???????????????????? if wr1&!irdy then
???????????????????? trdy=!sign4;
??? ???????????? ??? !cs=cs1&!frame,;
??? ??????????????? ?!wr=wr1&frame,;
???????????????????? end if;
??????? end if,;
end ,;??
仿真結果如圖4所示。
?
參考文獻
1 陳利學.微機總線與接口設計.成都:成都電子科技大學出版社,1998
2 ALTER DATABOOK.ALTER公司,,1998