一種基于CPLD的單片機(jī)與PCI接口設(shè)計(jì)方案
在CPLD內(nèi)設(shè)有13個(gè)8位寄存器用來(lái)保存進(jìn)行一次PCI總線讀寫(xiě)時(shí)所需要的數(shù)據(jù),其中pci_address0~pci_address3是讀寫(xiě)時(shí)的地址數(shù)據(jù);
圖1 簡(jiǎn)化的PCI寫(xiě)操作時(shí)序
pcidatas0~pci_datas3是要往PCI設(shè)備寫(xiě)的數(shù)據(jù);pci_cbe[3~0]保存地址周期時(shí)的總線命令;pci_cbe[7~4]保存數(shù)據(jù)周期時(shí)的字節(jié)使能命令;pci_data0~pci_data3保存從PCI設(shè)備返回的數(shù)據(jù);pci_request是PCI總線讀寫(xiě)操作狀態(tài)寄存器,用于向單片機(jī)返回一些信息。當(dāng)單片機(jī)往pci_cbe寄存器寫(xiě)入一個(gè)字節(jié)的時(shí)候,會(huì)復(fù)位CPLD中的狀態(tài)機(jī),觸發(fā)CPLD進(jìn)行PCI總線的讀寫(xiě)操作;單片機(jī)則通過(guò)查詢pci_request寄存器得知讀寫(xiě)操作完成,再?gòu)膒ci_data寄存器讀出PCI設(shè)備返回的數(shù)據(jù)。
CPLD中狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖如圖2所示。每一個(gè)狀態(tài)對(duì)應(yīng)FRAME與IRD信號(hào)的一種輸出,而其它輸入輸出信號(hào)線可由這兩個(gè)信號(hào)線和pci_cbe的值及TRDY的狀態(tài)決定。當(dāng)FRAME為有效時(shí),AD[31~0]由pci_address驅(qū)動(dòng),而C/BE[3~0]由pci_cbe低4位驅(qū)動(dòng);當(dāng)IRDY有效時(shí),C/BE[3~0]視總線命令,要么由pci_cbe高4位驅(qū)動(dòng),要么設(shè)為高阻態(tài),而AD[31~0]在pci_cbe[0]為“0” (PCI讀命令)時(shí),設(shè)為高阻態(tài),而在pci_cbe[0]為“1” (PCI寫(xiě)命令)時(shí)由pci_datas驅(qū)動(dòng)。另外一方面,一旦TRDY信號(hào)線變?yōu)榈碗娖剑珹D[31~0]線上的數(shù)據(jù)被送入pci_data寄存器,而C/BE[3~0]線上的數(shù)據(jù)被送入pci_request寄存器的低4位。
圖2 狀態(tài)轉(zhuǎn)移圖
考慮到在不正常情況下,PCI設(shè)備不會(huì)對(duì)PCI總線作出響應(yīng),即TRDY不會(huì)有效,為了不使?fàn)顟B(tài)機(jī)陷入狀態(tài)S2的僵持局面,另外增設(shè)了一個(gè)移位計(jì)
PCI總線操作是否正確完成,可查詢pci_request的最高位是否為“1”,而IRDY與FRAME的值可分別查詢pci_request的第4位和第5位。這兩位反映了PCI總線操作所處的狀態(tài),兩位都為“1”時(shí)可以認(rèn)為PCI總線操作已經(jīng)完成。在實(shí)踐中,如果單片機(jī)的速度不是足夠快的話,可以認(rèn)為PCI總線操作總是即時(shí)完成的。
2 PCI設(shè)計(jì)接口實(shí)現(xiàn)
2.1 CPLD VHDL程序設(shè)計(jì)
我們針對(duì)8位單片機(jī)控制PCI以太網(wǎng)卡進(jìn)行了程序設(shè)計(jì),CPLD器件選用Xilinx的XC95216系列。針對(duì)以太網(wǎng)卡的特點(diǎn)在邏輯上進(jìn)行了再次簡(jiǎn)化,最終程序?qū)⑦m配進(jìn)XC95261芯片中,并在實(shí)踐中檢驗(yàn)通過(guò)。
以太網(wǎng)卡僅支持對(duì)配置空間和I/O空間的讀寫(xiě)操作,而且這兩個(gè)空間的地址都可以設(shè)置在0xFF以內(nèi),所以可以只用一個(gè)pci_address0寄存器,其它地址都直接設(shè)為“0”;如果再限制,每次只往網(wǎng)卡寫(xiě)入一個(gè)字節(jié)數(shù)據(jù),則可以只用一個(gè)pci_datas0寄存器,其它數(shù)值在具體操作時(shí)設(shè)成與pci_datas0寄存器的一樣即可。
評(píng)論