一種基于CPLD 的單片機與PCI 接口設(shè)計解決方案
摘要:
本文描述了用賽靈思公司的xc95216 系列cpld 芯片實現(xiàn)擴展單片機與計算機pc104 的接口并行通信的方法, 解決了在嵌入式操作系統(tǒng)中單片機與主機總線設(shè)備打交道資源不足的固有缺陷, 把以太網(wǎng)卡的功能集成在一片xc95216 的 cpld 中, 簡化了硬件, 通信實時性強; 并給出用vhdl 編寫的主要源程序。該方案在實踐中檢驗通過。
引 言
8位單片機在嵌入式系統(tǒng)中應(yīng)用廣泛, 然而讓它直接與pci 總線設(shè)備打交道卻有其固有缺陷。8 位單片機只有16 位地址線, 8 位數(shù)據(jù)端口, 而pci 總線2.0 規(guī)范中, 除了有32 位地址數(shù)據(jù)復(fù)用ad[3- 0]外, 還有 frame、irdy、trdy 等重要的信號線。讓單片機有限的i/o 端口來直接控制如此眾多的信號線是不可能的。一種可行的方案就是利用cpld 作為溝通單片機 與pci 設(shè)備間的橋梁, 充分利用cpld 中i/o 資源豐富、用戶可自定制邏輯的優(yōu)勢, 來幫助單片機完成與 pci 設(shè)備間的通信任務(wù)。
1.2 cpld 設(shè)計規(guī)劃
出于對單片機和cpld 處理能力和系統(tǒng)成本的考慮, 下面的規(guī)劃不支持pci 總線的線性突傳輸?shù)刃枰B續(xù)幾個數(shù)據(jù)周期的讀寫方式, 而僅支持一個址周期加一個數(shù)據(jù)周期的讀寫方式。對于大部分應(yīng)用而言, 這種方式已經(jīng)足夠了。圖1 是經(jīng)過簡化后的pci 總線讀寫操作時序。在cpld 內(nèi)設(shè)有13 個8 位寄存器用來保存進行一次pci 總線讀寫時所需要的數(shù)據(jù), 其中pci_address0- pci_address3 是讀寫時的地址數(shù)據(jù); pcidatas0- pci_datas3 是要往pci 設(shè)備寫的數(shù)據(jù); pci_cbe[3- 0]保存地址周期時的總線命令; pci_cbe[7- 4] 保存數(shù)據(jù)周期時的字節(jié)使能命令; pci_data0- pci_data3 保存從pci 設(shè)備返回的數(shù)據(jù); pci_request 是pci 總線讀寫操作狀態(tài)寄存器, 用于向單片機返回一些信息。當(dāng)單片機往pci_cbe 寄存器寫入一個字節(jié)的時候, 會復(fù)位cpld 中的狀態(tài)機, 觸發(fā)cpld 進行pci 總線的讀寫操作; 單片機則通過查詢pci_request 寄存器得知讀寫操作完成, 再從pci_data 寄存器讀出pci 設(shè)備返回的數(shù)據(jù)。
2.2 單片機pci 讀寫c 語言程序設(shè)計
在cpld 在幫助下, 單片機讀寫pci 設(shè)備就變得相當(dāng)簡單。首先, 將pci_cbe 等寄存器都聲明為外部存儲器變量, 并根據(jù)cpld 的設(shè)計指定地址。然后, 傳遞適當(dāng)?shù)膮?shù)給以下兩個讀寫子函數(shù), 即可完成對pci 設(shè)備配置空間、i/o 空間、存儲器空間的讀寫操作。從 pci 設(shè)備的返回數(shù)據(jù)存放在全局變量savedata 中。實際上在寫pci 設(shè)備時, 也可以從pci_data 中得到返回數(shù)據(jù)。這個數(shù)據(jù)必須等于往pci 設(shè)備寫的數(shù)據(jù)。利用這一點可以進行差錯檢驗和故障判斷, 視具體應(yīng)用而定。
3 結(jié)論
用cpld 實現(xiàn)單片機與pci 總線接口的并行通信, 電路結(jié)構(gòu)簡單、體積小, 1 片cpld 芯片足夠, 并且控制方便, 實時性強, 通信效率高。本設(shè)計方法已成功地應(yīng)用于作者開發(fā)的各種數(shù)據(jù)采集系統(tǒng)中, 用作單片機與pc104 之間的并行數(shù)據(jù)通信, 效果非常理想。