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