基于CPLD的單片機PCI接口設計
出處:mike_le 發(fā)布于:2007-09-21 16:47:52
1 PCI接口設計原理
1.1 PCI總線協(xié)議簡介
PCI總線上信號線雖多,但并不是每個信號都要用到。實際上PCI設備也并不會支持所有的信號線,比如錯誤信號PERR與SERR在網(wǎng)卡中就不支持。我們可以針對具體的應用選擇支持其中部分信號線,還有一些信號線可以直接連電源或接地。下面簡單介紹一下常用信號線的功能。
AD[31~0]:地址數(shù)據(jù)多路復用信號。在FRAME有效的個周期為地址,在IRDY與TRDY同時有效的時候為數(shù)據(jù)。
C/BE[3~0]:總線命令與字節(jié)使能控制信號。在地址其中傳輸?shù)氖强偩€命令;在數(shù)據(jù)期內(nèi)是字節(jié)使能控制信號,表示AD[31~0]中那些字節(jié)是有效數(shù)據(jù)。表1是總線命令編碼的說明。
PCI總線上所有的數(shù)據(jù)傳輸基本上都由以下三條信號線控制。
FRAME:幀周期信號。由主設備驅(qū)動,表示訪問的開始和持續(xù)時間,F(xiàn)RAME有效時(0為有效,下同),表示數(shù)據(jù)傳輸進行中,失效后,為數(shù)據(jù)傳輸一個周期。
IRD:主設備準備好信號。由主設備驅(qū)動,表示主設備已經(jīng)準備好進行數(shù)據(jù)傳輸。
TRDY:從設備準備好信號。由從主設備驅(qū)動,表示從設備已經(jīng)準備好進行數(shù)據(jù)傳輸。當IRDY與TRDY同時有效時,數(shù)據(jù)傳輸才會真正發(fā)生。
另外,還有IDSEL信號用來在配置空間讀寫期間作為片選信號。對于只有一個PCI從設備的情況,它總可以接高電平。IDSEL信號由從設備驅(qū)動,表示該設備已成為當前訪問的從設備,可以不理會。
在PCI總線上進行讀寫操作時,PCI總線上的各種信號除了RST、IRQ、IRQC、IRQ之外,只有時鐘的下降沿信號會發(fā)生變化,而在時鐘上升沿信號必須保持穩(wěn)定。
1.2 CPLD設計規(guī)劃
出于對單片機和CPLD處理能力和系統(tǒng)成本的考慮,下面的規(guī)劃不支持PCI總線的線性突傳輸?shù)刃枰B續(xù)幾個數(shù)據(jù)周期的讀寫方式,而僅支持一個址周期加一個數(shù)據(jù)周期的讀寫方式。對于大部分應用而言,這種方式已經(jīng)足夠了。 在CPLD內(nèi)設有13個8位寄存器用來保存進行PCI總線讀寫時所需要的數(shù)據(jù),其中pci_address0~pci_address3是讀寫時的地址數(shù)據(jù);pcidatas0~pci_datas3是要往PCI設備寫的數(shù)據(jù);pci_cbe[3~0]保存[NextPage]本文相關DataSheet:MAX7000 EPM7128
地址周期時的總線命令,PCI_cbe[7~4]保存數(shù)據(jù)周期時的字節(jié)使能命令;pci_data0~pci_data3保存從PCI設備返回的數(shù)據(jù);pci_request是PCI總線讀寫操作狀態(tài)寄存器,用于向單片機返回一些信息。當單片機往pci_cbe寄存器寫入一個字節(jié)的時候,會復位CPLD中的狀態(tài)機,觸發(fā)CPLD進行PCI總線的讀寫操作;單片機則通過查詢pci_request寄存器得知讀寫操作完成,再從pci_data寄存器讀出PCI設備返回的數(shù)據(jù)。
CPLD中狀態(tài)機的狀態(tài)轉(zhuǎn)移圖如圖3所示。每一個狀態(tài)對應FRAME與IRD信號的一種輸出,而其它輸入輸出信號線可由這兩個信號線和pci_cbe的值及TRDY的狀態(tài)決定。當FRAME為有效時,AD[31~0]由pci_address驅(qū)動,而C/BE[3~0]由pci_cbe低4位驅(qū)動;當IRDY有效時,C/BE[3~0]視總線命令,要么由pci_cbe高4位驅(qū)動,要么設為高阻態(tài),而AD[31~0]在pci_cbe[0]為“0”時,(PCI讀命令)設為高阻態(tài),而在pci_
PCI總線操作是否正確完成,可查詢pci_request的位是否為“1”,而IRDY與FRAME的值可分別查詢pci_request的第4位和第5位。這兩位反映了PCI總線操作所處的狀態(tài),兩位都為“1”時可以認為PCI總線操作已經(jīng)完成。在實踐中,如果單片機的速度不是足夠快的話,可以認為PCI總線操作總是即時完成的。這幾位的實現(xiàn)可參考源程序。
2 PCI設計接口實現(xiàn)
2.1 CPLD ABEL HDL程序設計
我們針對8位單片機控制PCI以太網(wǎng)卡進行了程序設計,CPLD器件選用ALTERA的MAX7000系列。針對以太網(wǎng)卡的特點在邏輯上進行了再次簡化,張程序?qū)⑦m配進EPM7128芯片中,并在實踐中檢驗通過。
以太網(wǎng)卡僅支持對配置空間和I/O空間的讀寫操作,而且這兩個空間的地址都可以設置在0xFF以內(nèi),所以可以只用一個pci_address0寄存器,其它地址都直接設為“0”;如果再限制,每次只往網(wǎng)卡寫入一個字節(jié)數(shù)據(jù),則可以只用一個pci_datas0寄存器,其它數(shù)值在具體操作時設成與pci_datas0寄存器的一樣即可。
以下是ABEL HDL主要源碼。其中16dmux是4~16位譯碼器,用于地址譯碼,選通CPLD內(nèi)的寄存器;8dffe是8位的DFFE;abelcounter是8位移位計數(shù)器;mylatch8與mylatch1分別為8位與1位鎖存器,而mylatchc是帶清零1位鎖存器;其它以“my”開始的變量都是三態(tài)緩沖器,以“out”開始的變量是三態(tài)節(jié)點,以“e”開始的變量是普通節(jié)點。這此在程序中不再聲明。
SUBDESIGN abelpci
(
P2[7..3] : INPUT;
READ0 : INPUT
WRITE0 : INPUT;
P0[7..0] : BIDIR;
CLK : INPUT;
TRDY0 : INPUT;
AD[31..] : BIDIR;
CBE[3..0] : BIDIR;
IRDY0 : OUTPUT;
FRAME0 : OUTPUT;
)
VARIABLE
decoder : 16dmux;
mycounter : abelcounter;
pci_c[NextPage]本文相關DataSheet:MAX7000 EPM7128
be : 8DFFE;
PCI_address0 : 8DFFE;
pci_datas0 : 8DFFE;
pci_request[6..0] : mylatch1;
pci_request7 : mylatchc;
pci_data0 : mylatch8;
pci_data1 : mylatch8;
pci_data2 : mylatch8;
pci_data3 : mylatch8;
ss : MACHINE OF BITS (FRAME0,IRDY0)
WITH STATES(s0 = B"11",
s1=B"01");
s2=B"10";
S3=B"11");
BEGIN
decoder.(d,c,b,a)=P2[6..3];
enareg[]=decoder.q[];
pci_che.ena=enareg[0]&p2[7];
pci_cbe.d[]=p0[];
pci_cbe.clk=!WRITE0;
pci_address0.ena=enareg[1]&p2[7]l
pci_address0.d[]=P0[];
pci_datas0.ena=enareg[9]&P2[7];
pci_datas0.d[]=P0[];
pci_datas0.clk=!WRITE0;
pci_data0.gate=!TRDY0;
pci_data0.data[]=AD[7..0];
pci_data1.gate=!TRDY0;
pci_data1.data[]=AD[15..8];
pci_data2.gate=!TRDY0;
pci_data2.data[]=AD[23..16];
pci_data3.gate=!TRDY0;
pci_data3.data[]=AD[31..24];
pci_request[3..0].gate=!TRDY0;
pci_request7.gate=!TRDY0;
pci_request7.aclr=P2[7]&!WRITE0;
pci_request[3..0].data=CBE[];
pci_request[4].data=IRDY0;
pci_request[5].data=FRAME0;
pci_request[6].data=Vcc;
pci_request7.data=Vcc;
eread=P2[7]&!READ0 & WRITE0;
my_P0_data0[].in=pci_data0.q[];
my_P0_data0[].oe=enareg[5]&eread;
my_P0_data1[].in=pci_data1.q[];
my_P0_data1[].oe=enareg[6]&eread;
my_P0_data2[].in=pci_data2.q[];
my_P0_data2[].oe=enareg[7]&eread;
my_P0_data3[].in=pci_data3.q[];
my_P0_data3[].oe=enareg[8]&eread;
my_P0_request[6..0].in=pci_request[6..0].q;
my_P0_request[7].in=pci_request7.q;
my_P0_request[].oe=enareg[13]&eread;
out_P0[]=my_P0_data0[];
out_P0[]=my_P0_data1[];
out_P0[]=my_P0_data2[];
out_P0[]=my_P0_data3[];
out_P0[]=my_P0_request[];
P0[]=out_P0[];
enclr=enareg[0]&P2[7]&!WRITE0;
mycounter.clock=CLK;
mycounter.cnt_en=!IRDY0;
mycounter.aclr=!FRAME0;
mycounter.sset=!TRDY0;
ss.clk=!CLK;
ss.reset=enclr;
ss.ena=Vcc;
CASE ss IS
WHEN s0 => ss="s1";
WHEN s1 => ss="s2";
WHEN s2 => IF mycounter.cout THEN ss =s3;ELSE ss="s2";
END IF;
WHENf s3 => ss="s3";
END CASE;
my_AD_address[7..0].in=in=pci_[NextPage]本文相關DataSheet:MAX7000 EPM7128
address0;
my_AD_address[31..8].in=GND;
my_AD_address[31..0].oe=!FRAME0;
my_CBE_c[].in=PCI_cbe.d[3..0];
my_CBE_c[].oe=!FRAME0;
my_AD_data[31..0].in=pci_datas0.q[8..1];
my_AD_data[31..0].oe=pci_cbe_[0]&FRAME0;
my_CBE_be[].in=pci_cbe.d[7..4];
my_CBE_be[].oe=FRAME0;
out_AD[]=my_AD_address[];
out_AD[]=my_AD_data[];
AD[]=out_AD[];
out_CBE[]=my_CBE_c[];
out_CBE[]=my_CBE_be[];
CBE[]=out_CBE[];
END;
2.2 單片機PCI讀寫C語言程序設計
&nb
實際上在寫PCI設備時,也可以從pci_data中得到返回數(shù)據(jù)。這個數(shù)據(jù)必須等于往PCI設備寫的數(shù)據(jù),原因參見ABEL HDL設計部分。利用這一點可以進行差錯檢驗和故障判斷,視具體應用而定。
bdate unigned char request;
sbit IRDY0=request^4;
sbit FRAME0=request^5;
sbit VALID="request"^7;
void readpci(unsigned char addr,unsigned char cbe){
pci_address0=addr;
pci_cbe=cbe;
request=pci_request;
while(!IRDY0 & FRAME0)) request="pci"_request;
savedata0=pci_data0;
savedata1=pci_data1;
savedata2=pci_data2;
savedata3=pci_data3;
if(!VALID)printf("Data read is invalid! ");
}
void writepci(uchar addr,uchar value0,uchar cbe){
data uchar temp;
pci_address0=addr;
pci_datas0=value0;
pci_cbe=cbe;
request=pci_request;
while(!(IRDY0 & FRAME0)) request="pci"_request;
if(!VALID)printf("Data write is invalid!");
}[NextPage]本文相關DataSheet:MAX7000 EPM7128地址周期時的總線命令,PCI_cbe[7~4]保存數(shù)據(jù)周期時的字節(jié)使能命令;pci_data0~pci_data3保存從PCI設備返回的數(shù)據(jù);pci_request是PCI總線讀寫操作狀態(tài)寄存器,用于向單片機返回一些信息。當單片機往pci_cbe寄存器寫入一個字節(jié)的時候,會復位CPLD中的狀態(tài)機,觸發(fā)CPLD進行PCI總線的讀寫操作;單片機則通過查詢pci_request寄存器得知讀寫操作完成,再從pci_data寄存器讀出PCI設備返回的數(shù)據(jù)。
CPLD中狀態(tài)機的狀態(tài)轉(zhuǎn)移圖如圖3所示。每一個狀態(tài)對應FRAME與IRD信號的一種輸出,而其它輸入輸出信號線可由這兩個信號線和pci_cbe的值及TRDY的狀態(tài)決定。當FRAME為有效時,AD[31~0]由pci_address驅(qū)動,而C/BE[3~0]由pci_cbe低4位驅(qū)動;當IRDY有效時,C/BE[3~0]視總線命令,要么由pci_cbe高4位驅(qū)動,要么設為高阻態(tài),而AD[31~0]在pci_cbe[0]為“0”時,(PCI讀命令)設為高阻態(tài),而在pci_
PCI總線操作是否正確完成,可查詢pci_request的位是否為“1”,而IRDY與FRAME的值可分別查詢pci_request的第4位和第5位。這兩位反映了PCI總線操作所處的狀態(tài),兩位都為“1”時可以認為PCI總線操作已經(jīng)完成。在實踐中,如果單片機的速度不是足夠快的話,可以認為PCI總線操作總是即時完成的。這幾位的實現(xiàn)可參考源程序。
2 PCI設計接口實現(xiàn)
2.1 CPLD ABEL HDL程序設計
我們針對8位單片機控制PCI以太網(wǎng)卡進行了程序設計,CPLD器件選用ALTERA的MAX7000系列。針對以太網(wǎng)卡的特點在邏輯上進行了再次簡化,張程序?qū)⑦m配進EPM7128芯片中,并在實踐中檢驗通過。
以太網(wǎng)卡僅支持對配置空間和I/O空間的讀寫操作,而且這兩個空間的地址都可以設置在0xFF以內(nèi),所以可以只用一個pci_address0寄存器,其它地址都直接設為“0”;如果再限制,每次只往網(wǎng)卡寫入一個字節(jié)數(shù)據(jù),則可以只用一個pci_datas0寄存器,其它數(shù)值在具體操作時設成與pci_datas0寄存器的一樣即可。
以下是ABEL HDL主要源碼。其中16dmux是4~16位譯碼器,用于地址譯碼,選通CPLD內(nèi)的寄存器;8dffe是8位的DFFE;abelcounter是8位移位計數(shù)器;mylatch8與mylatch1分別為8位與1位鎖存器,而mylatchc是帶清零1位鎖存器;其它以“my”開始的變量都是三態(tài)緩沖器,以“out”開始的變量是三態(tài)節(jié)點,以“e”開始的變量是普通節(jié)點。這此在程序中不再聲明。
SUBDESIGN abelpci
(
P2[7..3] : INPUT;
READ0 : INPUT
WRITE0 : INPUT;
P0[7..0] : BIDIR;
CLK : INPUT;
TRDY0 : INPUT;
AD[31..] : BIDIR;
CBE[3..0] : BIDIR;
IRDY0 : OUTPUT;
FRAME0 : OUTPUT;
)
VARIABLE
decoder : 16dmux;
mycounter : abelcounter;
pci_c
信息www.dzzl.cn
參考文獻:
[1]. PCI datasheet http://m.58mhw.cn/datasheet/PCI_1201469.html.
[2]. 2.0 datasheet http://m.58mhw.cn/datasheet/2.0_1758666.html.
[3]. FRAME datasheet http://m.58mhw.cn/datasheet/FRAME_2528858.html.
[4]. CPLD datasheet http://m.58mhw.cn/datasheet/CPLD_1136600.html.
[5]. DataSheet datasheet http://m.58mhw.cn/datasheet/DataSheet_1091991.html.
[6]. MAX7000 datasheet http://m.58mhw.cn/datasheet/MAX7000_1018713.html.
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識介紹2025/8/29 16:58:56
- SQL核心知識點總結(jié)2025/8/11 16:51:36
- 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
- 基于PID控制和重復控制的復合控制策略2025/7/29 16:58:24
- 什么是樹莓派?一文快速了解樹莓派基礎知識2025/6/18 16:30:52









