国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于XC6SLX45T平臺(tái)的PCIe數(shù)據(jù)卡設(shè)計(jì)

2017-11-24 11:53:07,,,
關(guān)鍵詞:狀態(tài)機(jī)板卡驅(qū)動(dòng)程序

,,,

(南京南瑞集團(tuán)公司,南京 211100)

基于XC6SLX45T平臺(tái)的PCIe數(shù)據(jù)卡設(shè)計(jì)

朱孟江,王元強(qiáng),聶云杰,洪昊

(南京南瑞集團(tuán)公司,南京 211100)

為提升數(shù)據(jù)傳輸速率、提高數(shù)據(jù)處理靈活性,提出一種基于FPGA的的PCIe數(shù)據(jù)卡設(shè)計(jì)方法。該方案選用Xilinx公司的XC6SLX45T平臺(tái),采用IP核的方式設(shè)計(jì)了一款PCIe數(shù)據(jù)卡。該卡采用DMA傳輸模式,通過DMA讀寫提高傳輸速率,其數(shù)據(jù)傳輸速率可達(dá)到400 Mbps。

FPGA;IP核;PCIe;DMA

引 言

PCI-Express(簡(jiǎn)稱PCIe)總線的出現(xiàn),完全地改變了原本的PCI總線的并行技術(shù),PCIe采用的是新型的串行點(diǎn)對(duì)點(diǎn)技術(shù),改善了PCI總線傳輸速度以及系統(tǒng)帶寬方面的本質(zhì)問題。PCIe總線的提出,彌補(bǔ)了PCI總線的不足之處,PCIe總線將發(fā)展成為取代PCI總線的新型數(shù)據(jù)總線[1]。

目前電力行業(yè)業(yè)務(wù)復(fù)雜、數(shù)據(jù)繁多,根據(jù)電監(jiān)會(huì)5號(hào)令《電力二次系統(tǒng)安全防護(hù)規(guī)定》的要求,各發(fā)電企業(yè)、電網(wǎng)企業(yè)、供電企業(yè)內(nèi)部基于計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的業(yè)務(wù)系統(tǒng)在安全區(qū)I和安全區(qū)II之間以密文的方式進(jìn)行通信。軟件密碼算法不僅消耗硬件CPU資源,且存在較大安全隱患,速度也受硬件資源的限制,這就需要設(shè)計(jì)一款高效、快速的硬件數(shù)據(jù)加密卡。目前市場(chǎng)上數(shù)據(jù)對(duì)稱加解密速度均在400 Mbps左右, SPI、UART等串行接口性能遠(yuǎn)遠(yuǎn)不夠,USB和以太網(wǎng)又不方便集成到服務(wù)器,因此選用Xilinx PCIe解決方案,同時(shí)FPGA在數(shù)據(jù)處理方面也具有很大的靈活性。

本文將以Xilinx公司的Spartan-6為平臺(tái),闡述PCIe IP Core的方案及其優(yōu)化策略,并著重描述其DMA和傳統(tǒng)終端模式,配合上位機(jī)測(cè)試程序進(jìn)行相關(guān)數(shù)據(jù)測(cè)試。該方案具有方便、可集成性、速度快等優(yōu)點(diǎn),已在電力調(diào)度系統(tǒng)中得到廣泛的應(yīng)用。系統(tǒng)集成示意圖如圖1所示。

圖1 系統(tǒng)集成示意圖

1 PCIe原理

1.1 PCIe簡(jiǎn)介

與PCI總線不同,PCIe總線使用端到端的連接方式,在一條PCIe鏈路的兩端只能各連接一個(gè)設(shè)備,這兩個(gè)設(shè)備互為數(shù)據(jù)發(fā)送端和數(shù)據(jù)接收端。PCIe總線除了總線鏈路外,還具有多個(gè)層次,發(fā)送端發(fā)送數(shù)據(jù)時(shí)將通過這些層次,而總線接收端接收數(shù)據(jù)時(shí)也使用這些層次。PCIe總線使用的層次結(jié)構(gòu)與網(wǎng)絡(luò)協(xié)議棧較為類似,由事物層、數(shù)據(jù)鏈路層和物理層組成。PCIe發(fā)送端和接收端中都含有TX(發(fā)送邏輯)和RX(接收邏輯),其結(jié)構(gòu)如圖2 所示。

圖2 PCIe總線物理鏈路

1.2 PCIe IP核

用FPGA實(shí)現(xiàn)PCIe功能,簡(jiǎn)單地說就是完成TLP包的處理,即事物層數(shù)據(jù)協(xié)議的處理。TLP由三部分組成:幀頭、數(shù)據(jù)、Digest段。

TLP幀頭長(zhǎng)為3或者4個(gè)DW,格式和內(nèi)容隨事物類型變化。數(shù)據(jù)段為TLP 幀頭定義下的數(shù)據(jù)段,如果該TLP不攜帶數(shù)據(jù),則該段為空。Digest段(Optional)是基于幀頭、數(shù)據(jù)字段計(jì)算出來的CRC,又稱為ECRC,一般Digest段由IP 核填充,所以PCIe的處理在用戶層表現(xiàn)為處理TLP中幀頭和數(shù)據(jù)段。TLP包中各個(gè)字段含義不再一一解釋,可參照《PCI Express體系結(jié)構(gòu)導(dǎo)讀》一書。TLP格式如圖3所示。

圖3 TLP格式

1.3 PCIe接口空間配置

PCIe通信是靠發(fā)送TLP包完成的,讀寫包里都有地址信息。如果板卡向PC發(fā)送TLP包,例如MWr包,那很好理解,地址信息就是PC的物理地址;如果是MRd包,則PC收到后回復(fù)一個(gè)完成包,板卡從完成包分析出數(shù)據(jù)即得到MRd讀取地址的數(shù)據(jù)。那PC如何讀寫板卡的數(shù)據(jù)呢? PC啟動(dòng)時(shí)BIOS探測(cè)所有的外設(shè)。對(duì)PCIe設(shè)備來說,BIOS檢測(cè)到板卡有多少個(gè)BAR(Base Address Register)空間,每個(gè)空間有多大,然后對(duì)應(yīng)為這些BAR空間的分配地址。對(duì)PC設(shè)備來說,它能“看”到PCIe板卡的空間只有BAR空間,只能訪問這些BAR空間。板卡可以發(fā)送合法的PCIe TLP包,并得到PC端的響應(yīng),但是PC端訪問板卡被局限在BAR空間。本方案PCIe BAR空間僅設(shè)置為BAR0空間,配置如圖4所示。

圖4 BAR0空間設(shè)置

2 程序設(shè)計(jì)

2.1 PCIe設(shè)備驅(qū)動(dòng)

PCIe設(shè)備驅(qū)動(dòng)與PCI一樣,與普通設(shè)備驅(qū)動(dòng)沒有太大差別,具備open、close、ioctl、read、write等接口函數(shù),實(shí)現(xiàn)方式大同小異。與普通字符設(shè)備驅(qū)動(dòng)的區(qū)別主要在probe函數(shù)上,PCIe設(shè)備驅(qū)動(dòng)比普通字符設(shè)備驅(qū)動(dòng)多了一個(gè)probe探測(cè)函數(shù),該函數(shù)主要有如下功能:

◆ 驅(qū)動(dòng)加載時(shí),將PCIe的BAR0空間映射到主機(jī)并為DMA申請(qǐng)內(nèi)存空間;

◆ 為PCIe設(shè)備申請(qǐng)中斷,并分配中斷號(hào);

◆ 初始化驅(qū)動(dòng)讀寫隊(duì)列。

PCIe設(shè)備驅(qū)動(dòng)代碼如下:

static int __devinit fpga_probe(struct pci_dev *pdev, const struct pci_device_id *id){

……

pci_enable_device(pdev);//enable PCIe

pci_set_master(pdev); //設(shè)置成總線主DMA模式

……

PhysicalBase0Addr=pci_resource_start(pdev,BAR_0);

PhysicalBase0len=pci_resource_len(pdev,BAR_0); //將PCIe內(nèi)存空間映射到主機(jī)

fpga_priv.PCI_Base0_Addr=ioremap( PhysicalBase0Addr, PhysicalBase0len);

fpga_priv.dma_buf = pci_alloc_consistent(pdev,PKT_LEN,&fpga_priv.dma_buf_t);

if(fpga_priv.dma_buf==NULL)

return ERROR;

init_waitqueue_head(&fpga_priv.read_wait);//初始化讀隊(duì)列

init_waitqueue_head(&fpga_priv.write_wait); //初始化寫隊(duì)列

fpga_priv.irq = pdev->irq;//為PCIe設(shè)備申請(qǐng)中斷號(hào)

request_irq(fpga_priv.irq, fpga_interrupt,IRQF_SHARED,"FPGA",& fpga_priv);

……

}

2.2 DMA驅(qū)動(dòng)程序

圖5 DMA操作流程

DMA(Direct Memory Access,直接內(nèi)存訪問)不需要處理器的干預(yù),處理器只需將讀/寫數(shù)據(jù)首地址和數(shù)據(jù)長(zhǎng)度告訴DMA控制器,啟動(dòng)DMA讀/寫即可[2]。本設(shè)計(jì)在FPGA內(nèi)部設(shè)置了DMA讀寫寄存器和DMA地址寄存器,其操作過程如圖5所示。

DMA程序?qū)崿F(xiàn)如下[3]:

int DMA_operation (int len, int i){

int val;

PCIe_InitiatorReset();

//對(duì)FPGA軟復(fù)位

TLP_cnt = (len%TLP_SIZE) ? (len/TLP_SIZE+1) : len/TLP_SIZE;

TLP_cnt += 1;

//計(jì)算PCIe傳輸TLP包大小

PCIe_WriteReg(DMA_LEN_REG, len);

//設(shè)置DMA數(shù)據(jù)長(zhǎng)度,地址為默認(rèn)地址

PCIe_WriteReg(RDMATLPC, TLP_cnt);

//設(shè)置TLP傳輸包數(shù)

PCIe_WriteReg(BUFCONTROL1, 0x101);

//使能DMA讀/寫操作

PCIe_WriteReg(DMACR, 0x10000);

do {

val = PCIe_ReadReg(BUFSTATE1);

} while(val==0x0);

//等待DMA完成

PCIe_WriteReg(BUFCONTROL1, 0);

//disable讀/寫操作

return 0;

}

2.3 FPGA中斷狀態(tài)機(jī)設(shè)計(jì)

PCIe可以發(fā)出兩種中斷,一種是虛擬INTx信號(hào)線的,另一種是MSI的。過去PCI板卡發(fā)送中斷通過拉低INTx(INTA#、INTB#、INTC#、INTD#)來申請(qǐng)中斷,PC檢測(cè)到INTx的中斷,就跳轉(zhuǎn)執(zhí)行INTx對(duì)應(yīng)的中斷驅(qū)動(dòng)程序。MSI是基于消息機(jī)制的,PC啟動(dòng)后為PCIe板卡分配一個(gè)或多個(gè)消息地址,板卡發(fā)送中斷只需要向?qū)?yīng)的地址內(nèi)發(fā)送消息,消息內(nèi)容中包含消息號(hào),每個(gè)消息號(hào)對(duì)應(yīng)在PC 端的某一地址。需要注意的是,Windows XP是不支持MSI的,到了WinNT和Win7才支持,因此本方案采取INTx傳統(tǒng)中斷方式。

中斷程序采用狀態(tài)機(jī)控制,正常情況下處于等待狀態(tài),當(dāng)用戶應(yīng)用程序提交中斷申請(qǐng)時(shí),將request信號(hào)傳遞給狀態(tài)機(jī),觸發(fā)中斷;當(dāng)PC收到PCIe中斷時(shí),必須在中斷服務(wù)程序給FPGA一個(gè)確認(rèn)信號(hào),并在讀/寫完成之后清除該確認(rèn)信號(hào),以便FPGA可以進(jìn)入下一次中斷請(qǐng)求。

用戶中斷請(qǐng)求信號(hào)intr_req,當(dāng)讀/寫完成時(shí),提交中斷請(qǐng)求,如下:

assign intr_req = ((rd_done=1'b1) || (wr_done==1'b1)) ? 1'b1 : 1'b0;

intr_req信號(hào)傳遞到中斷程序狀態(tài)機(jī),如下:

always @(posedge clk ) begin

case (crypt_intr_state)/*狀態(tài)機(jī)狀態(tài)*/

`BMD_INTR_CRYPT_RST : begin

if(intr_req )//用戶應(yīng)用的中斷請(qǐng)求

next_crypt_intr_state = `BMD_INTR_CRYPT_ACT0;

end

`BMD_INTR_CRYPT_ACT0 : begin

……

end

`BMD_INTR_CRYPT_ACT1 : begin

if (cfg_interrupt_ack)//等待PC確認(rèn)收到中斷請(qǐng)求

next_crypt_intr_state = `BMD_INTR_CRYPT_ACT2;

end

`BMD_INTR_CRYPT_ACT2 : begin

……

end

`BMD_INTR_CRYPT_DUN : begin

//等待PC清除確認(rèn)標(biāo)志,否則不能進(jìn)入下一中斷

if((!cfg_interrupt_ack)||(timeout_cnt == TIMEOUT))

next_crypt_intr_state = `BMD_INTR_CRYPT_RST;

end

default:

next_crypt_intr_state = `BMD_INTR_CRYPT_RST;

endcase

end

整個(gè)狀態(tài)機(jī)操作如下:

① 在BMD_INTR_CRYPT_ACT0狀態(tài)下,用戶應(yīng)用將cfg_interrupt_n和cfg_interrupt_assert_n置為有效,從而將中斷置為有效。

② 然后,核將cfg_interrupt_rdy_n置為有效,表示已接受中斷請(qǐng)求。在BMD_INTR_CRYPT_ACT1狀態(tài),用戶應(yīng)用將cfg_interrupt_n置為無效;此時(shí)如果PCI命令寄存器中的中斷禁用位設(shè)置為 0,則核發(fā)出將中斷置為有效的消息。

③ 在BMD_INTR_CRYPT_ACT2狀態(tài),用戶應(yīng)用一旦確定中斷請(qǐng)求已被接收,就會(huì)將cfg_interrupt_n置為有效,同時(shí)將 cfg_interrupt_assert_n置為無效,從而將中斷置為無效。必須通過 cfg_interrupt_di[7:0]來指示相應(yīng)的中斷。

④ 核將cfg_interrupt_rdy_n置為有效,表示已接收中斷的無效置位。在BMD_INTR_CRYPT_DUN,用戶應(yīng)用將cfg_interrupt_n置為無效,而核發(fā)出將中斷置為無效的消息。

以一次數(shù)據(jù)寫為例,其信號(hào)時(shí)序仿真如圖6所示。

圖6 傳統(tǒng)中斷時(shí)序圖

通過對(duì)IP Core的中斷配置接口操作,PC就會(huì)接到相關(guān)中斷信息,使主機(jī)進(jìn)入中斷服務(wù)程序進(jìn)行處理。本設(shè)計(jì)采用狀態(tài)機(jī)的方式產(chǎn)生中斷信號(hào),在FPGA內(nèi)部設(shè)計(jì)中斷寄存器,正常情況下FPGA中斷處于等待狀態(tài),當(dāng)FPGA處理完數(shù)據(jù)后將中斷寄存器置位,要求PC去讀數(shù)據(jù),此時(shí)狀態(tài)機(jī)處于中斷程序狀態(tài),當(dāng)PC接收到中斷并進(jìn)入到中斷服務(wù)程序時(shí),清除該中斷寄存器,狀態(tài)機(jī)再次恢復(fù)到等待狀態(tài),可以進(jìn)行下一次中斷。

3 實(shí)驗(yàn)測(cè)試

實(shí)驗(yàn)主機(jī)為DELL臺(tái)式機(jī),CPU為奔騰D處理器,主頻2.80 GHz,內(nèi)存2 GB,操作系統(tǒng)為Ubuntu9.10,內(nèi)核版本2.6.31。

測(cè)試方法1如下:

將PCIe卡插到臺(tái)式機(jī)主板插槽,在Linux下加載PCIe卡驅(qū)動(dòng)程序;系統(tǒng)產(chǎn)生2048字節(jié)隨機(jī)數(shù),向PCIe卡中寫入隨機(jī)數(shù),卡接收到隨機(jī)數(shù)并緩存到FPGA的雙口RAM中進(jìn)行存儲(chǔ);從PCIe卡的雙口RAM讀數(shù)據(jù),數(shù)據(jù)長(zhǎng)度與寫入保持一致;將讀出數(shù)據(jù)與寫入數(shù)據(jù)進(jìn)行比對(duì),若一致,則讀寫正確,否則錯(cuò)誤。

數(shù)據(jù)正確性驗(yàn)證測(cè)試如圖7所示。

圖7 數(shù)據(jù)正確性驗(yàn)證測(cè)試

測(cè)試方法2如下:

將PCIe卡插到臺(tái)式機(jī)主板插槽,在Linux下加載PCIe卡驅(qū)動(dòng)程序;系統(tǒng)產(chǎn)生2 048字節(jié)隨機(jī)數(shù);系統(tǒng)計(jì)時(shí),向PCIe卡中寫入隨機(jī)數(shù),卡接收到隨機(jī)數(shù)并緩存到FPGA的雙口RAM中進(jìn)行存儲(chǔ);從PCIe卡的雙口RAM讀數(shù)據(jù),數(shù)據(jù)長(zhǎng)度與寫入保持一致;循環(huán)上兩步10萬次,待結(jié)束計(jì)算所用時(shí)間;根據(jù)時(shí)間與所寫數(shù)據(jù)量,計(jì)算PCIe卡讀寫速度。

PCIe卡傳輸速度測(cè)試如圖8所示。由于傳輸速度測(cè)試采用雙向先寫后讀方式,因此實(shí)際單向讀或?qū)懙乃俣葢?yīng)為實(shí)測(cè)速度的兩倍左右,遠(yuǎn)大于400 Mbps。

結(jié) 語

[1] 李木國(guó),黃影,劉于之.基于FPGA的PCIe總線接口的DMA傳輸設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2013,21(1):233-235.

[2] 王曉慶,周曉波,趙強(qiáng).PCIE高速數(shù)據(jù)采集系統(tǒng)的驅(qū)動(dòng)及上位機(jī)軟件開發(fā)[J].計(jì)算機(jī)應(yīng)用與軟件,2013(9):331-333.

[3] 李晃,鞏峰,陳彥化.基于PCIE驅(qū)動(dòng)程序的數(shù)據(jù)傳輸卡DMA傳輸[J].電子科技,2014,27(1):117-120.

朱孟江、王元強(qiáng)、聶云杰、洪昊,主要研究方向?yàn)殡娏ο到y(tǒng)信息安全設(shè)計(jì)開發(fā)。

DesignofPCIeDataCardBasedonXC6SLX45TPlatform

ZhuMengjiang,WangYuanqiang,NieYunjie,HongHao

(NARI Group Corporation,Nanjing 211100,China)

To improve the transmission rate and the flexibility of data processing,a design method of PCIe data card based on FPGA is proposed in the paper.The scheme adopts the way of IP core on Xilinx XC6SLX45T platform.The card transmission mode uses the DMA mode,which can enhance the transmission speed,which is as high as 400 Mbps.

FPGA;IP Core;PCIe;DMA

TP336

A

2017-08-07)

圖8 PCIe卡傳輸速度測(cè)試

猜你喜歡
狀態(tài)機(jī)板卡驅(qū)動(dòng)程序
基于有限狀態(tài)機(jī)的交會(huì)對(duì)接飛行任務(wù)規(guī)劃方法
基于PCI9054的多總線通信板卡的研制
基于FPGA的多通道模擬量采集/輸出PCI板卡的研制
一種基于光纖數(shù)據(jù)傳輸?shù)亩喟蹇ㄜ浖绦驘龑懠夹g(shù)
一種通用模擬量及開關(guān)量信號(hào)采集板卡的設(shè)計(jì)
FPGA設(shè)計(jì)中狀態(tài)機(jī)安全性研究
基于反熔絲FPGA的有限狀態(tài)機(jī)加固設(shè)計(jì)
基于VHDL的一個(gè)簡(jiǎn)單Mealy狀態(tài)機(jī)
驅(qū)動(dòng)程序更新與推薦
驅(qū)動(dòng)程序更新與推薦
404 Not Found

404 Not Found


nginx
巴南区| 阳城县| 竹溪县| 马尔康县| 施甸县| 都昌县| 大连市| 阳西县| 新巴尔虎左旗| 紫云| 定远县| 隆昌县| 吐鲁番市| 舒城县| 钟祥市| 嘉禾县| 桓台县| 巩义市| 漯河市| 红原县| 大渡口区| 建始县| 新密市| 山阴县| 新龙县| 宁化县| 二手房| 鲜城| 石狮市| 德钦县| 东城区| 广饶县| 东兰县| 海门市| 夹江县| 潼关县| 兴城市| 大余县| 柘荣县| 汾阳市| 手游|