基于EPLD技術(shù)的PCI總線(xiàn)接口設計
PCI總線(xiàn)自其問(wèn)世以來(lái),以其諸多優(yōu)點(diǎn),在當今的計算機系統中得到了廣泛應用,已經(jīng)成為計算機設備的標準接口。本文在認真分析PCI總線(xiàn)的接口信號和接口時(shí)序的基礎上,利用EPLD器件設計實(shí)現了PCI總線(xiàn)接口。由于EPLD器件支持在線(xiàn)編程,所以可以根據使用要求將PCI總線(xiàn)接口配置成即插即用和非即插即用兩種形式,這種設計方式結構簡(jiǎn)單、集成度高,具有較高的實(shí)用價(jià)值。
本文引用地址:http://dyxdggzs.com/article/202713.htm1 PCI總線(xiàn)概述
局部總線(xiàn)特別是PCI總線(xiàn)的發(fā)展,打破了PC數據傳送的瓶頸。傳統的PC總線(xiàn)結構不能滿(mǎn)足圖形系統和大型應用程序的要求,所以在此基礎上產(chǎn)生和發(fā)展了局部總線(xiàn)。它將計算機外設從I/O總線(xiàn)上移下來(lái),使它們更靠近系統處理器,從而提高了處理器和外設之間的傳送速度。
從設備的PCI接口至少需要47條信號線(xiàn),而主控設備的PCI接口至少需要49條信號線(xiàn),包括數據/地址復用總線(xiàn)、接口控制線(xiàn)、仲裁、總線(xiàn)命令以及系統線(xiàn)等。
PCI總線(xiàn)在進(jìn)行數據傳輸時(shí),地址節拍、總線(xiàn)命令在C/BE[0..3]上由主機輸出,用于說(shuō)明當前PCI總線(xiàn)周期需要執行的功能。其命令如表1所示。
2 PCI總線(xiàn)協(xié)議和讀寫(xiě)時(shí)序
PCI總線(xiàn)的傳輸機制是成組數據猝發(fā)傳輸,每組數據由一個(gè)地址脈沖和一個(gè)或幾個(gè)數據脈沖組成。一般基本的PCI傳輸由三個(gè)信號控制:
信號由PCI主控設備驅動(dòng),表示總線(xiàn)操作的開(kāi)始和結束;
信號由PCI主控設備驅動(dòng),在讀周期表示主控設備準備接收數據,在寫(xiě)周期表示AD[31..0]上數據有效;
信號由PCI從設備驅動(dòng),在讀周期,表示從設備準備好傳輸數據,在寫(xiě)周期表示從設備準備好接收數據。
當數據有效時(shí),數據源設備需要無(wú)條件地設置XRDY有效,一旦主控設備使有效,中途不能改變狀態(tài),直到信號無(wú)效或數據傳送結束。
PCI是地址/數據復用總線(xiàn),其讀操作的時(shí)序如圖1所示。當進(jìn)行PCI讀傳輸時(shí),首先置低,有效,讀傳輸開(kāi)始,同時(shí)AD[31..0]保持有效地址信號,C/BE[3..0]保持總線(xiàn)命令。如果總線(xiàn)命令為存儲器讀(0110),AD[31..0]地址在從設備地址范圍內,從設備置有效,主控設備驅動(dòng),表明主控設備準備好接收數據。為避免總線(xiàn)沖突,接下來(lái)的一個(gè)周期A(yíng)D[31..0]既不被主控設備驅動(dòng),也不被從設備驅動(dòng)(該周期成為總線(xiàn)轉換周期),此后AD[31..0]上出現數據,C/BE[3..0]變?yōu)樽止澰试S信號,主控設備開(kāi)始檢測信號。如果信號無(wú)效(為高電平),則主控設備自動(dòng)插入等待周期,如果信號有效,則總線(xiàn)開(kāi)始傳輸數據。在最后一個(gè)數據脈沖之后,主控設備將和 置為無(wú)效,表示傳輸結束。
寫(xiě)傳輸時(shí),由于地址均由主控設備提供,因此不存在總線(xiàn)轉換周期。其傳輸過(guò)程與讀周期基本類(lèi)似,只是C/BE[3..0]上的總線(xiàn)命令為存儲器寫(xiě)(0111),具體的傳輸時(shí)序如圖2所示。
3 PCI總線(xiàn)的接口設計方案
根據以上分析,選用ALTER的高速EPLD器件EPM7128S84來(lái)完成PCI總線(xiàn)接口的設計。為簡(jiǎn)化起見(jiàn),選用存儲器作為從設備,其總體結構如圖3所示。
下面將給出用AHDL語(yǔ)言編寫(xiě)的EPLD控制程序以及仿真結果。為簡(jiǎn)單起見(jiàn),設定從設備為非即插即用類(lèi)型的PCI插卡,直接將其地址空間配置為0X50000000~0X5FFFFFFF(或在計算機內不與其他設備沖突的地址),時(shí)鐘周期選用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=!da31da30!da29da28;
if cs1 then
devsel=!sign4;
a[10..0]=ad[10..0];
wr1=!cbe3cbe2cbe1cbe0;
rd1=!cbe3cbe2cbe1!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=wr1frame;
end if;
end if;
end ;
仿真結果如圖4所示。
評論