<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > PCI總線協(xié)議的FPGA實現(xiàn)及驅(qū)動設計

          PCI總線協(xié)議的FPGA實現(xiàn)及驅(qū)動設計

          作者: 時間:2012-04-14 來源:網(wǎng)絡 收藏

            圖3中,狀態(tài)轉(zhuǎn)移條件信號a、b、c定義如下:a代表配置空間訪問條件,b代表I/O空間或內(nèi)存空間訪問條件,c代表總線傳輸開始條件。這三個條件的實現(xiàn)由后面的命令譯碼模塊給出。
            
           ?。桑模蹋攀窍到y(tǒng)的缺省狀態(tài),表示總線當前空閑。通常,設備處在IDLE狀態(tài)時,要檢測來自PCI總線和后級設備的信號,以便設備作出合適的響應。設備處于S_DATA狀態(tài)時完成第一次數(shù)據(jù)傳輸,直接無條件跳到BACKOFF狀態(tài)。設備在BACKOFF狀態(tài)時進行多個數(shù)據(jù)傳輸,直至主設備斷開訪問。需要注意的是:任何對I/O空間、配置空間以及內(nèi)存空間的突發(fā)傳輸?shù)牡刂烦^了設備映射地址的范圍時,從設備要在此狀態(tài)建立STOP信號,斷開訪問。當幀信號無效或主設備終止傳輸時,設備回到初始的IDLE狀態(tài)。BUS_BUSY狀態(tài)時總線忙,表示總線正在被其它設備使用。有兩條轉(zhuǎn)移路徑,若總線仍然被占用,則停留在BUS_BUSY狀態(tài),否則返回空閑狀態(tài)IDLE。
            
           ?。玻?地址譯碼和命令譯碼模塊
            
            地址譯碼模塊主要檢測PCI地址與本PCI卡的基地址是否匹配,可以通過AD[31:00]信號線上的值與設置的基地址作比較判斷。如果PCI地址落在設置的基地址范圍內(nèi),則PCI卡響應當前的總線操作。
            
            命令譯碼模塊指示PCI卡響應不同的總線命令,通過檢測C/BE[3:0]#信號線上的值,與表1列出的總線命令作比較,完成命令譯碼。
            
           ?。?Windows9x系統(tǒng)下驅(qū)動程序的設計
            
            對PCI設備而言,驅(qū)動程序提供了獲?。校茫煽ǖ呐渲每臻g信息、勾掛PCI中斷、總線數(shù)據(jù)傳輸?shù)裙δ?。本文介紹使用Numega公司的VtoolsD軟件進行驅(qū)動設計的方法。
            
           ?。常?尋找PCI卡并讀取配置空間信息
            
            配置空間包含了系統(tǒng)初始化PCI設備所必需的信息,首先需要遍歷整個硬件樹結構來尋找指定的PCI設備。對于每一個設備,比較其廠商號(Vendor ID)和設備編號Device ID,如果與設計的PCI卡的信息匹配,則讀取它的配置空間信息。
            
           ?。常?I/O方式下的讀寫操作
            
           ?。桑戏绞较碌淖x寫比較簡單。在得到PCI設備基地址信息后,通過C++語言中的端口讀寫函數(shù)inpd和outpd即可完成。舉例如下:
            
           ?。裕澹恚穑剑撸椋睿穑洌ǎ纾拢幔螅澹粒洌洌颍澹螅螅澹螅?;// Temp中得到讀出的數(shù)據(jù)
            
           ?。撸铮酰簦穑洌ǎ纾拢幔螅澹粒洌洌颍澹螅螅澹螈煟模幔簦幔?; //向基地址寫入數(shù)據(jù)
            
            其中,gBaseAddresses為基地址值,Data為寫操作時的數(shù)據(jù)。
            
           ?。常?內(nèi)存方式下的讀寫
            
            對于內(nèi)存方式下的讀寫,一個重要問題就是地址的映射。因為硬件設備讀寫的是物理內(nèi)存,但應用程序讀寫的是虛擬地址,所以存在著將物理內(nèi)存地址映射到用戶程序線性地址的問題。
            
            映射功能通過調(diào)用VtoolsD軟件的標準庫函數(shù)完成。根據(jù)給定的物理地址和所要求的空間大小,在系統(tǒng)內(nèi)存中分配相應空間。首先,用PageReserve函數(shù)分配當前保留頁的線性地址空間,再利用PageCommitPhys函數(shù)的服務對開始的線性地址空間分配相應的物理地址空間。程序如下:
            
           ?。眨蹋希危?nPages=_NPAGES_(PhysAddressSizeInBytes);
            
           ?。蹋椋睿澹幔颍剑校幔纾澹遥澹螅澹颍觯澹ǎ校遥撸樱伲樱裕牛廷煟睿校幔纾澹螈煟校遥撸疲桑兀牛模?;
            
           ?。校幔纾澹茫铮恚恚椋簦校瑁螅ǎ校粒牵牛危眨停ǎ蹋椋睿澹幔颍?,nPagesPAGENUM (PhysAddress),PC_INCR | PC_WRITEABLE | PC_USER);
            
           ?。蹋椋睿校幔纾澹蹋铮悖耄ǎ校粒牵牛危眨停ǎ蹋椋睿澹幔颍?,nPages0);
            
            其中,PhysAddress為給定的物理地址,SizeInBytes為需要的空間大小。
            
            建立了物理RAM到系統(tǒng)內(nèi)存的映射后,就可以利用C++語言中的文件操作基類CFile類完成數(shù)據(jù)的讀寫。首先使用CFile類的成員函數(shù)Open打開文件,為保證數(shù)據(jù)讀寫的準確無誤,必須使用二進制方式打開;接下來使用Read和Write成員函數(shù)進行文件讀寫;完畢后用Close成員函數(shù)關閉文件。
            
            3.4 中斷的勾掛和處理
            
            首先在ON_DEVICE_INIT函數(shù)中完成中斷的初始化。即通過前面讀取的PCI設備的中斷號,使用VPICD_Virtualize_IRQ函數(shù)進行中斷勾掛,并調(diào)用VPICD_Physically_Unmask函數(shù)開中斷。
            
           ?。遥裕茫桑遥眩龋幔睿洌欤澹剑郑校桑茫模撸郑椋颍簦酰幔欤椋澹撸桑遥眩ǎΓ桑遥眩洌澹螅悖?;

           ?。郑校桑茫模撸校瑁螅椋悖幔欤欤撸眨睿恚幔螅耄ǎ遥裕茫桑遥眩龋幔睿洌欤澹?;
            然后在RTCInt_Handler函數(shù)中進行中斷處理,可以進行各種操作,例如向應用程序發(fā)送自定義的消息來通知中斷的發(fā)生。
            
           ?。常?與應用程序的通信
            
            一般地,應用程序通過CreateFile函數(shù)調(diào)用VxD驅(qū)動程序,得到一個VxD的文件句柄。使用如下的語句可以打開一個名為mydriver.VXD的文件,得到的句柄保存在hVxD中。
            
           ?。瑁郑模剑茫颍澹幔簦澹疲椋欤澹ā澹埽埽埽埽埽埽恚洌颍椋觯澹颍郑兀摹澧煟?,0,0,CREATE-NEW,FILE-FLAG-DELETE-ON-CLOSE,0);
            
            通過句柄hVxD和DeviceIoControl函數(shù)就可以與驅(qū)動程序進行數(shù)據(jù)傳輸。
            
            本文采用ALTERA公司的FLEX6000系列芯片,型號為EPF6016TC144-3,實現(xiàn)了簡化的從設備模式PCI協(xié)議,并在Windows9x系統(tǒng)下實現(xiàn)驅(qū)動程序的設計。整個系統(tǒng)工作良好。資源占用情況如下:可用I/O引腳113根,占用51根,占用率45%;可用邏輯單元數(shù)1320個,占用151個,占用率11%。
            
            簡化的PCI協(xié)議的實現(xiàn)占用較少的邏輯資源,可以靈活方便地進行功能添加和改進,同時可以在同一塊芯片中集成其他用戶模塊,實現(xiàn)不同功能,以降低成本。目前,本系統(tǒng)已經(jīng)應用在數(shù)據(jù)采集和處理、圖像處理等方面。


          上一頁 1 2 3 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();