PCIe基礎知識與例程分析----PIO_demo


PCIe基礎知識與例程分析

一、       基礎知識

1.1 關於接口

PCIe2x接口,對比其他系列,該接口包含2對發送與接收接口,

數據部分包含雙向八個接口:

PETp0與PETn0:發送器差動線對,通道0

PETp1與PETn1:發送器差動線對,通道1

PERp0與PERn0:接收器差動線對,通道0

PERp1與PERn1:接收器差動線對,通道1

故鏈路寬度為2,有幾對鏈路差分對鏈路寬度即為多大。

1.2 TLP包

1.2.1 AXI-Stream總線上的數據

在賽靈思7系列FPGA中,使用AXIStream總線進行通信,PCIe的TLP包使用AXI總線傳輸,在AXI總線上數據大端對齊,即高位數據在地址的高位,在傳輸時AXIS總線上的數據形式:

 

圖1.1 3DW_TLP包

 

圖1.2 4DW_TLP包

What’s more,TLP是Transaction Layer Packet事務層包的檢測,關於其詳細內容可查看PICe的物理結構,主要是事務層(Transaction Layer)、數據鏈路層(Data Link Layer)和物理層(Physical Layer)。

事務(處理)層:高層事務源事務源與傳送設備的設備核心,結束於接收設備的設備核心,處理層是組裝出站處理層數據包的起點,也是接收層拆解入站TLP的終點。在發送數據時,處理層根據設備核心的請求構建TLP頭、數據有效載荷和摘要。在發送TLP給數據鏈路層之前,先使用流控制信任和排列規則,也就是查看接收方有沒有足夠的接收信用(空間),排列規則就是對任務進行類似優先級處理,確保數據發送的有效執行。

數據鏈路層:在接收來自事務層的TLP時候,會給其分配一個序列號,並且計算該TLP的鏈路CRC(包含序列號),然后將TLP傳送到物理層。

物理層:進行字節拆分、加擾、編碼和串行處理,並在數據包上添加STP和END控制(K)字符,之后從鏈路的發送端發出數據包。

接收器對數據的處理即為以上的反向操作,但是數據鏈路層計算CRC檢查接受的數據出錯時,接收器的數據鏈路層會發出一個Nack DLLP,通知發送器數據發送錯誤,此時保存在發送器的數據鏈路層重放緩沖區的TLP副本就會再次處理並進行發送。

1.2.2 TLP頭的格式

 

上圖中標准的TLP包中包含TLP頭、TLP數據(DATA)和TLP Digest(摘要)。R表示reserved,保留。

TLP中,根據頭可以確定的事物參數有:事務類型、預期的接受者的地址和ID等、傳送的有效數據負載大小(單位:DW)、順序屬性、緩存一致性屬性、流量類別。

TLP數據(DATA:可選字段,0~1024DW,0~4kb。

TLP Digest(摘要):可選,頭中的TD位決定,大小總是一個DW(32bit),用於ECRC和數據中毒。

 

Fmt+Type:組合表示傳輸的TLP packet的類型。

TC:表示流量類別,從流量類別0~流量類別7,即000~111,用於在進行傳輸時進行VC傳輸等級仲裁。

TH:為1時表示當前TLP中含有TPH(沒搞懂什么作用)

TD:是否有TLP摘要,指出該數據包是否含有ECRC字段,又稱為摘要Digest,該字段位寬為32bit,含有端到端CRC(ECRC),ECRC是處理層在創建出站TLP時生成的,並且是根據整個TLP,從頭的第一個字節一直到數據有效負載的最后一個字節(但不包括EP位和type位的bit0,計算ECRC時默認這兩位為1)。

EP:數據負載是否有效,poisoned

AT:地址轉換,有PCIe總線的地址轉換相關(也沒太搞懂)

Attr:屬性,位於字節2的[5:4],位[5]設置是否采用靈活的順序,當設置為1時,對於此TLP使用靈活的順序(Realxed-order),

 

 

 

 

在使用強序模型時,在數據的整個傳送路徑中,PCIe設備在處理相同類型的TLP時,如PCIe設備發送兩個存儲器寫TLP時,后面的寫TLP必須等待前一個存儲器寫TLP完成后才能被處理,幾遍當前報文在傳輸過程中阻塞,后一個報文也必須等待。但是對於不同類型的TLP間可以亂序通過同一條PCIe鏈路。

在使用Realaxed Ordering模型時,后一個寫TLP可以越過前一個存儲器寫TLP提前執行,從而能提高PCIe總線利用率。

Attr的位[1],表示No Snoop Attribute,該位為0時表示當前TLP所傳送的數據在通過FSB時需要和Cache保持一致。

Request ID和Tag在PCIe總線中Request ID和Tag字段合稱為Transaction ID,non-posted類型的報文使用Transaction字段的主要目的是使接收端通過分析報文的Transaction ID,確認文成報文的目的地。

Request ID[15:0],該字段包含生成這個TLP報文的PCIe設備的總線號(Bus Number,[7:0],8bit),設備號(Device Number,[4:0],5bit),功能號(Function Number,[2:0],3bit),對於non-posted類型的請求,目標設備需要使用報文作為回應,在這個完成報文中需要使用源設備Requster ID字段。

在PCIe總線中,所有Non-posted數據請求度需要完成報文進行應答,才能接受一次完整的數據傳遞。一個源設備發送完non-posted數據請求后,如果美玉接收到目標設備返回的完成報文,TLP報文的發送端需要保存這個non-posted數據請求,此時該設備使用的Trasnction ID(Tag字段)不能再次被使用,直到一次數據傳送結束。

PCIe設備發出的每一個non-posted數據請求TLP,在同一個時刻段內Transaction ID必須是唯一的,即在同一時間段內,在當前PCIe總線中不能存在多個存儲器請求TLP,其Transaction ID完全相同。

源設備發送non-posted類型的數據請求后,在沒有獲得全部完成報文之前,不能釋放這個Transaction ID所占用的資源,在同一個PCIe設備發送的TLP中,其Request ID字段是相同的,因此PCIe設備的設計者能管理的資源只有Tag字段。PCIe設備的管理者需要合理管理Tag資源以保證數據傳輸的正確性。

PCIe 設備在發送Non-Posted 數據請求時,需要暫存這些Non-Posted 數據請求。其中Tag 字段的長度決定了發送端能夠暫存多少個同類型的TLP,如果Tag 字段長度為5,發送端能夠暫存32 個報文;如果PCIe 設備使能了Extended Tag 位,Tag 字段可以由8 位組成,此時發送端能夠暫存256 個報文。

 

1.2.3 TLP的路由

TLP的路由指的是TLP通過Switch或者PCIe橋片時采用哪一條路景,最終到達EP或者RC(Root Complex,跟聯合體)的方法,一共有三種:基於地址的路由、基於ID的路由和隱式路由方式。

基於地址路由:存儲器和IO讀寫請求。

基於ID路由:配置讀寫報文、Cpl和CplD報文,該方式使用PCIe總線好進行路由路徑 選擇,在switch或者多端口RC的P2P(PCI to PCI)橋配置空間中,使用PCI總線號進行路由路徑的選擇。

隱式路由:Message報文的傳遞,指的是從下游端口到上游端口進行數據傳遞所使用的的路由方式,或者用於RC向EP發出廣播報文。注意和物理層通信的控制字K字符區分。

 

 

 

1.3 32bit與64bit操作

尋址空間一般指的是CPU對於內存尋址的能力,也就是最多用到多少個內存的問題,數據在RAM中的存放是有規律的,CPU在運算時根據地址尋找數據的過程就是尋址操作,但是如果地址太多就超出了CPU的尋址能力。

CPU的尋址能力以字節為單位,如32位尋址的CPU可以尋址2的32次方大小的地址也就是4Gb,1kb=1024byte,1mb=1024kb,1gb=1024mb。

 

二、PIO例程

2.1 demo簡介

PIO,即Programmed I/O,是一種設備的數據傳輸機制,使用特定的IO執行實現從設備到CPU的數據讀取。

本節介紹基於7 seriesFPGAs Intergrated Block for PCIe Epress V3.3 ip core的設計,基礎內容可以參看上文。

7 series FPGAs Integrated Block for PCI Express core在PIO_demo中被使用,整個demo中分為兩個部分,第一部分7 seriesFPGAs Intergrated Block for PCIe Epress V3.3 ip core的設置與例化部分,第二部分為應用部分。

 

       在整個demo中,PCIe ip core用於從電氣接口接收和發送數據,然后將接收到的數據通過AXI_Stream總線發送到應用程序部分進行拆包處理,應用程序部分對AXI_Stream總線上的數據的TLP頭進行解析,根據解析出來的指令進行相應的操作。對於non_posted類型的數據,經過應用程序處理后通過AXI_Stream總線發送到PCIe ip core,然后將數據通過差動發送器發出到上位機。

2.1 ip core的設置與例化

       新建工程,在ip 列表中選擇7 seriesFPGAs Intergrated Block for PCIe Epress V3.3 ip core,對於幾個參數需要說明:

       Mode:選為basic,基本操作。

       Lane Width:需要參照接口上含有幾對收發差分對。

       Maxium Link Speed和AXI Interface Frequency,通過參照IP的技術手冊,Page:17,

 

       對於7030-2系列,接口的鏈路寬度為2,連接速度為5.0GT/s時,AXI總線寬度建議選擇64bit,AXI總線接口時鍾125Mhz。對於其他型號,參考上圖。

       關於Vender ID(供應商標識):根據IP技術手冊介紹:該ID的作用是標識設備或應用程序的供應商,由PC特殊興趣小組進行分配,以確保每一個標識都是唯一的,默認值為10EE,為Xilinx的供應商ID。

關於Device ID(設備ID):應用程序的唯一標識,默認值取決於所選配置的<link speed><link width>,鏈路速度與鏈路寬度,前兩位為固定的70,對於7030-2系列設置為7022。

Reference:

       Vender ID:Identifies the manufacturer of the device or application. Valid identifiers are assigned by the PCI Special Interest Group to guarantee that each identifier is unique. The default value, 10EEh, is the Vendor ID for Xilinx. Enter a vendor identification number here. FFFFh is reserved.

Device IDA unique identifier for the application; the default value, which depends on the configuration selected, is 70<link speed><link width>h. This field can be any value;change this value for the application.

2.2 ip core的應用部分 

 

上位機傳輸的TLP包先到PCIe ip core,之后進行解析,解析的部分為PIO_RX_ENGINE,解析時完全按照AX_Stream協議解析。發送模塊為PIO_TX_ENGINE,存儲模塊為EP_MEM_ACCESS,控制模塊為PIO_TO_CTRL。

 

2.2.1 EP_MEM_ACCESS

2.1.1 內容分析

用bram源語一共調用了4塊ram,相當於一塊存儲器,在進行操作時將其視為內存,可以對其進行字節讀寫與修改。

4塊RAM分別為:

ep_io_mem:IO

存儲器事務請求可能使用3DW TLP頭格式來攜帶32bit地址,或用4DW TLP頭格式來攜帶64bit地址,IO事務請求限定使用3DW TLP頭格式來攜帶32bit地址。

系統存儲器映射能力的大小是設備能夠生成的地址范圍,PCIe能夠尋址32bit或64bit存儲器地址空間,雖然多數系統只使用16bit(64kb),但系統IO映射的大小限定在32bit(4GB)。

 

ep_mem32:

對於32bit存儲器請求,頭中只包含32bit地址,這些TLP的目標設備將駐留在低4GB存儲器。(注:地址的低兩位bit1:0總為0,表示起始地址總線總是DW校准的)

ep_mem64:

       對於64bit存儲器請求,頭中包含有64bit的地址,這些TLP的目標設備將駐留在高於4GB的存儲器范圍內。(注:地址的低兩位bit1:0總為0,表示起始地址總線總是DW校准的)

 

ep_mem_erom:

擴展rom,其中包含代碼映像,代碼映像中又包含設備驅動程序的副本,包含了一個允許在啟動期間使用設備的設備驅動程序。

2.2 框架分析

對於內存的操作有內存讀取和數據寫入。

內存讀取

接收到的讀取地址為11bit,其中高兩位的作用是選擇讀取操作的RAM類型,根據讀取地址信號的高兩位進行正確選擇讀取出的數據。

將讀取的地址線[8:0]同時連接到四個ram的讀地址線,然后通過了型判斷使能對應的RAM讀取使能信號。

將讀取得到的數據取出來,根據字節使能對數據進行處理,將處理好的數據送到輸出數據端口。

數據寫入

——與數據讀取類似,只不過多了一個wr_en信號。

根據指令的類型確定是操作IO、MEM32、MEM64還是EROM,然后使能寫入RAM的讀使能的信號將該地址的數據讀出。

狀態機部分:首先是在空閑狀態,在wr_en==1之后進入WAIT狀態,該狀態的作用是延時一個時鍾,之后進入READ狀態寄存預讀取的數據,之后進入WRITE狀態,根據字節使能確定要操作的字節,同時將write_en置一,將數據在下一個時鍾周期寫入到對應的RAM中。

 

2.2.2 PIO_RX_ENGINE

接收部分,由兩部分構成,一分為操作空間的解析,另一部分為操作指令的解析。

2.1 操作空間

PCIe IP Core解碼收到的內存或IO請求的地址,首先需要注意的是在IP core例化構建時並未使能64bit地址,所以64bit內存讀取並未使用。

此外,在技術文檔有以下說明:(page of 64)

In Endpoint configuration, the core decodes incoming Memory and I/O TLP request addresses to determine which Base Address Register (BAR) in the core Type0 configuration space is being targeted, and indicates the decoded base address on m_axis_rx_tuser[9:2](rx_bar_hit[7:0]). For each received Memory or I/O TLP, a minimum of one bit and a maximum of two (adjacent) bits are set to 1b. If the received TLP targets a 32-bit Memory or I/O BAR, only one bit is asserted. If the received TLP targets a 64-bit Memory BAR, two adjacent bits are asserted. If the core receives a TLP that is not decoded by one of the BARs (that is, a misdirected TLP), then the core drops it without notification and it automatically generates an Unsupported Request message. Even if the core is configured for a 64-bit BAR, the system might not always allocate a 64-bit address,in which case only onerxbar_hit[7:0] signal is asserted. Overlapping BAR apertures are not allowed.

即在進行端點配置時,ip core解碼收到的內存或者IO請求的地址,根據地址決定type0配置空間中的基地址寄存器(BAR)被選中,解碼的基地址m_axis_rx_tuser[9:2]決定使用哪一個基地址寄存器。對於每一個接收到的內存/IO TLP,m_axis_rx_tuser[9:2]最少有一個、最多有一個bit置為1,具體是一個還是兩個取決於操作類型,如果是32bit的內存操作或者是內存IO尋址空間,則需要設置一個bit為1,這意味需要與具體使用的BAR對應。如果是64bit的內存操作,則需要將對應的兩個bit置一。

在PIO例程中32bit內存操作時,將m_axis_rx_tuser[2]置一,對EROM進行操作時,將m_axis_rx_tuser[8]置一。

 

 

 

 

assign    io_bar_hit_n = 1'b1;   //不進行IO操作

assign    mem32_bar_hit_n = ~(m_axis_rx_tuser[2]);  //p36

assign    mem64_bar_hit_n = 1'b1;   // 在基地址操作空間0,在ip core中設置未使用64bit操作

assign    erom_bar_hit_n  = ~(m_axis_rx_tuser[8]);  //Expansion ROM擴展ROM地址

 

  always @*

  begin

    case ({io_bar_hit_n, mem32_bar_hit_n, mem64_bar_hit_n, erom_bar_hit_n})

 

      4'b0111 : begin //不成立的。因為操作空間只有bar0,

        region_select <= #TCQ 2'b00;    // Select IO region

      end // 4'b0111

 

      4'b1011 : begin

        region_select <= #TCQ 2'b01;    // Select Mem32 region

      end // 4'b1011

 

      4'b1101 : begin  //不成立的,因為ipcore中bar0未使能64bit操作

        region_select <= #TCQ 2'b10;    // Select Mem64 region

      end // 4'b1101

 

      4'b1110 : begin  //Expansion ROM

        region_select <= #TCQ 2'b11;    // Select EROM region

      end // 4'b1110

     

      default : begin

        region_select <= #TCQ 2'b00;    // Error selection will select IO region

      end // default

 

2.2操作指令解析

為了及時接收到來的TLP packet,定義兩個寄存器,一個寄存器表示數據包的開始(sop,start of packet),是一個脈沖信號,當數據

2.2.1 解析

對於操作指令的解析由一個case語句分析TLP頭中的Fmt+Type位完成,從而確定指令類型:

(1)、localparam PIO_RX_MEM_RD32_FMT_TYPE = 7'b00_00000;//儲器讀請求;TLP頭大小為3個雙字,不帶數據。

(2)、localparam PIO_RX_MEM_WR32_FMT_TYPE = 7'b10_00000;//存儲器寫請求;TLP頭大小為3個雙字,帶數據。

(3)、localparam PIO_RX_MEM_RD64_FMT_TYPE = 7'b01_00000;//儲器讀請求;TLP頭大小為4個雙字,不帶數據。

(4)、localparam PIO_RX_MEM_WR64_FMT_TYPE = 7'b11_00000;//存儲器寫請求;TLP頭大小為4個雙字,帶數據。

(5)、 localparam PIO_RX_IO_RD32_FMT_TYPE  = 7'b00_00010;//IO讀請求;TLP頭大小為3個雙字,不帶數據

(6)、localparam PIO_RX_IO_WR32_FMT_TYPE  = 7'b10_00010;//IO寫請求;TLP頭大小為3個雙字,帶數據

2.2.2 操作

(一)、指令的深入操作:

       解析出操作指令后將跳轉到對應的指令執行狀態,接下來將逐一講解各個指令的執行:

(1)、為了表示一個TLP數據包的開始,首先需要一個sop(start of packet),該信號在發送方valid信號有效時且未進行數據傳輸時表示開始接收數據,在他從0變為1時已經接收到了數據,接收到數據之后需要將ready拉低,

(2)、在開始接收數據之后,什么時候數據進入?就是在接收方的ready信號有效時,使用一個信號in_packet_q表示正在進行數據傳輸。該信號滯后於傳輸數據一個周期,因為接收方的ready信號為1時才將其在下一個時鍾周期置一,但是他是和傳輸的數據有效時間長度是一樣的,因為他在發送方的tlast信號為1的下一個時鍾上升沿拉高,在數據結束的下一個時鍾周期結束。

       即假設數據傳輸的周期個數為:n,那么in_packet_q的為高周期個數為:n。

(二)、空閑狀態:

       將ready拉高等待數據傳輸的到來,當數據到來時if(sop),根據Fmt+Type對指令執行區分,關閉接收ready,並跳轉到對應的狀態處理函數。

case (m_axis_rx_tdata[30:24])  //根據數據包類型進行數據包分析

1、  PIO_RX_MEM_RD32_FMT_TYPE

接收到一個32位的存儲器讀請求,將TLP類型保存(有用),保存要讀取的數據長度,PIO傳輸的長度為1DW,即32bit,然后判斷要請求的數據是不是一個DW,是的話就將屬性也寄存起來,然后跳轉到處理函數。

2、  PIO_RX_MEM_WR32_FMT_TYPE

存儲器寫請求;TLP頭大小為3個雙字,帶數據。該指令不需要回傳一個數據包,只需要保存數據包的類型與長度,然后根據長度判斷是不是一個DW,是的話就保存字節使能位,然后跳轉到處理函數。

3、  PIO_RX_MEM_RD64_FMT_TYPE

存儲器讀請求;TLP頭大小為4個雙字,不帶數據。第一個數據為低32位地址,第二個數據為高32位地址。

4、  PIO_RX_MEM_WR64_FMT_TYPE

存儲器寫請求;TLP頭大小為4個雙字,帶數據,

5、  PIO_RX_IO_RD32_FMT_TYPE

IO讀請求;TLP頭大小為3個雙字,不帶數據,寄存屬性,跳轉到處理函數。

6、  PIO_RX_IO_WR32_FMT_TYPE

IO寫請求;TLP頭大小為3個雙字,帶數據。

 

處理函數

       注意,這部分函數是在上一個函數的下一個時鍾周期執行的,上一個時鍾周期已經將接收方的ready信號拉低了,本次再次拉低有點多余或許有別的考慮…..在發送方的valid信號有效時進行指令處理操作,為什么tvalid不為零?沒太搞懂,

Update:一次完整的數據傳輸完成之后tvalid才失效。Maybe

(1)、PIO_RX_MEM_RD32_DW1DW2

在發送方的Tvalid有效時,將接收方的ready信號拉低,將請求的地址提取出來,前兩位是要讀取的內存區域,讀取地址的低兩位是0,因為地址是DW對齊的。

32bit內存讀取請求需要有返回的數據,是non_posted類型的執行,所以設置請求讀完畢信號標志和請求完成等待數據標志。

之后跳轉到等待狀態等待數據返回完畢(是使用了一個compl_done信號)。

(2)、PIO_RX_MEM_WR32_DW1DW2

       接收到的是內存寫入數據信號指令,32bit的,將數據寄存器來,同時使能數據寫入內存,提取操作地址,等待數據接收完成,在寫入完成時候返回到空閑IDLE狀態(使用了一個wr_busy信號)。

(3)、PIO_RX_MEM_RD64_FMT_TYPE

存儲器讀請求;TLP頭大小為4個雙字,不帶數據。但是一次傳輸就64bit,那么還需要第二次傳輸,提取出地址數據,並設置指令讀取完成和等待數據信號,在狀態機PIO_RX_MEM_RD64_DW1DW2中。

(4)、PIO_RX_MEM_WR64_FMT_TYPE

       存儲器寫請求;TLP頭大小為4個雙字,帶數據。與上類似,在第二傳輸中獲取寫入地址,並等待數據寫入完成,同樣使用的是wr_busy信號。

(5)、PIO_RX_IO_RD32_FMT_TYPE

IO讀請求;TLP頭大小為3個雙字,不帶數據,跳轉到PIO_RX_MEM_RD32_DW1DW2內存讀取狀態。

(6)、PIO_RX_IO_WR32_FMT_TYPE

IO寫請求;TLP頭大小為3個雙字,帶數據。寄存屬性,然后跳轉到PIO_RX_IO_WR_DW1DW2,從數據中提取出操作地址,之后等待IO寫入完成。此外,IO寫請求時non-posted類型,還需要返回完成指令,但是不帶數據,所以需要將req_compl=1,req_compl_wd=0。

 

2.2.3 PIO_TX_ENGINE

對於讀取和IO類別的信號需要返回數據,將數據在TX發送引擎組包后,通過AXI-Stream總線發送到PCIe ip core,ip core再將TLP通過處理后發到上位機。

3.1 信號分析

幾個重要信號,首先是output類型的tx_src_dsc,全名是source discontinue,Discontinuing Transmisson of Transaction by Source,發送源中斷,在使用手冊page of 52中說明,AXI-Stream接口允許使用tx_src_dsc發送源中觀,可以在幀開始第一個周期后的任意時刻,包括置位talst信號時聲明源中斷,,進而終止TLP的傳輸,但是在該demo中,tx_src_dsc設置為0,因為傳輸一次完成(32bit data,個人理解),此外,s_axis_tx_valid和s_axis_tx_tready必須與tx_src_dsc一起斷言(assert),以終止TP傳輸。

reg [11:0] byte_count;字節計數器,傳輸32bit數據,一個DW即可完成,此外,在BE字段中不可有間斷的1,所以有根據rd_be計算傳輸多少字節。

根據完成包的類型,如果當前完成報文為存儲器讀完成TLP,TLP格式為:

 

 

 

Tmt、Type、TC、TD、EP、Attr、Length、completer_id與接收引擎中解包出的數據一致。

Status字段保存當前完成報文的完成狀態,表示當前TLP是否正確的將數據發送給數據請求端(3’b 000,正常結束),還是在數據傳遞過程中出現錯誤(3’b 001,不支持的數據請求),還是要求發送請求方重試(3’b010),還是數據夭折(3’b100)。

Byte count:記錄源設備還需要從目標設備中獲取多少字節的數據,本demo中置一即可,一次就over了。

Lower address:如果當前完成報文為存儲器讀完成TLP,該字段存放TLP中第一個數據所對應的的地址。

其他見上文。

3.2 狀態機分析

復位之后將AXI信號復位,忙與忙完成寄存器清零。Else,判斷是否需要發送完成包,需要的話就將忙標志置一,狀態機:

(1)、PIO_TX_RST_STATE

空閑狀態,如果忙標志為1,AXI總線初始化,接收方准備好之后進入下一狀態。

(2)、PIO_TX_CPLD_QW1_FIRST

對數據進行組TLP包,然后進入下一狀態。

(3)、PIO_TX_CPLD_QW1_TEMP

TLP頭已組包好,將valid置一,開始發送,之后進入下一狀態。

(4)、PIO_TX_CPLD_QW1

發送完頭之后該發送數據了,對數據組包,傳輸一次完成,將tlast置一。同時根據是否有數據設置tkeep字節使能。下一時鍾周期數據發送到ip core,回到空閑狀態。

 

 

2.2.4 PIO_TO_CTRL

熱插拔管理模塊,主要是四個信號

 

 

 

Cfg_to_turnoff:由PCIe ip core發出,通知已經收到PME_TURN_OFF信號的輸出,CMM開始輪詢傳入的cfg_turnoff_ok輸入,當cfg_turnoff_ok有效時,CMM向上游設備發送PME_TURN_OFF信號。

Cfg_turnoff_ok:通過聲明該信號通知用戶應用程序端點可斷電。

Compel_done:返回包操作完成。

Req_compl:TLP頭解析完成。

根據是否有TLP頭解析完成信號判斷傳輸懸浮狀態。沒有的話根據cfg_to_turnoff進行設置。(該部分位於說明書31page)

三、       關於狀態機編碼:

使用二進制編碼

優點

需要的觸發器個數少。

缺點

(1)、狀態譯碼需要額外的組合邏輯

(2)、對狀態譯碼時需要增加額外的組合邏輯,從而在定時路徑上增加了額外延遲。

(3)、不適用於工程設計變更

(4)、有時狀態觸發器和其他邏輯合在一起,是的特定狀態的推導變得困難。

使用杜熱碼

優點

(1)、狀態編碼的組合邏輯較少

(2)、狀態信息用單個觸發器表示,具有良好的定時裕量,對狀態譯碼的定時器路徑中不需要額外的組合邏輯。

(3)、適用於工程設計變更:

——狀態信息得以保持,即綜合后的所有觸發器都將會被保留。

——狀態變量易於讀取,方便使用,修改某一狀態的方程容易。

——

缺點

       需要的觸發器個數多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM