当前位置:   article > 正文

Vivado18.2 PCIE ip核IO协议详细介绍_vivado pcie

vivado pcie


金手指原理部分不多介绍,网上有很多类似的文章,大家可以自行参考

我们直接上手使用IP核建立部分 

文章目录

  • IP核建立
  • IP核利化代码介绍 
  • PCIE 协议介绍 
  • PCIE 时序图 
  • PCIE 示例代码 介绍
  • 总结  PCIE框图 


使用的是VIVADO 2018.2版本PCIE 的IP核

其他版本大同小异,就连ISE其建立原理也是一样


一、PCIE ip


可以看到有三种不同的IP核,每种IP核支持的协议和功能也是不一样的.

7Series Integrated Block for PCI Express           → 对应的用户接口为 AXI4-Stream 

AXI Memory Mapped To PCI Express                 → 对应的用户接口为AXI4

DMA/Bridge Subsystem for PCI Express(PCIe)  → 对应用户接口为AXI4或者AXI4-stream

二、使用第一个IP核为例


1.IP建立 

Basic 模式的配置是将该模式用来定义IP核的基本参数,包括组建名称,通道数核链路速率.

Device port Type  :             选择终端模式还是Root Port 模式 。

PCle Block Location :         选择PCIe所在quad,该选择会生成特定的引脚和区域约束文件和引脚分配.

Xilinx Development Board: 选择Xilinx开发板来生成开发板专用的约束文件.

Silicon Revision :                选择Silicon版本,有Initial_ES或者GES_and_Porduction.

Number of Lanes :              通道数.

Maximum Link Speed :       最大的链路速率.

AXI Interface Frequency:AXI接口速率,也是用户的时钟速率,推荐使用默认的速率,参考图

特殊说明 : 

 PCle Block Location 选项的底层含义 :  在FPGA内部分了多个GTP,而X轴和Y轴就是找到并且使用哪个GTP的关键,GTP内部又分Channe1,Channe0(通道)

这样也可以选择使用那个通道进行读写.

Vendor ID :        供应商ID,Xilinx默认的Vendor ID 为 10EEH.

Device ID :        设备ID,该属性可以实际的应用被设置为任意值.

Revision ID:       设备或应用的版本号,默认为00h.

Subsystem Vendor ID:  字系统供应商号,默认10EE,默认与Vendor LD相同

Subsystem ID :      字系统号,默认与Device ID 相同

Class Code :       标签页有如下的选项

Base Class :       设备的基本类型

Sub-Class :        类型的进一步的细分类型

Interface :        定义了专用的寄存器级的编程接口,允许不依赖于设备的软软件,与该设备通讯

Class Code Look-up Assistant: 提供了辅助设置Class Code的工具,可以通过设备通用的功能,自动设置Class Code中的参数.(建议选择)

Cardbus Cls Pointer : 用于cardbus系统,并指向cardbus卡的卡片信息结构,如果该字段非零,则必须在正确的位置存在适当的卡片信息结构,默认值是0000_0000h,值范围是0000_0000H-FFFF_FFFFH.

对于学习PCIE操作的来说这页是跳过的,全部默认即可. 这三个值的定义会出现在IP核的利化中来.


用来设置基地址寄存器,BAR0-5为32bit的参数,如果勾选64bit就只可以使用BAR0-4,这个根据板卡上的FPGA芯片资源所定.

BARX Enabled  :               使能该BAR 

Type :                                该BAR为存储还是IO类型

Size :                                 BAR大小

BAR 的大小的设置参考下图 : 

prefetchable :                                            存储空间是否具有预读取的能力

Value :                                                       BARx基地址

Expansion ROM Base Address Register : 扩展的ROM基地址寄存器,按照PCI3.0的总线规范,该BAR的大小不能超过16MB

选择1块Bar 选择当于从PC里面划分了1块Bar出来,每块是128M

标签页用来配置IP的初始化参数,Class Code和Cardbus CIS指针信息

Capability Version    :     定义了PCI-SIG定义的PCIe capability structure的版本号,该值不能更改.

Device Port Type     :     定义了PCI Express 逻辑设备的类型.

Slot Implemented    :     指定与该端口链路连接的槽,只在Root Port模式下使用

Capabilities :                 寄存器:表示Capabilities寄存器的值,不可修改

Max Payload Size :      最大数据负载,(数据会存放在PCIE内部一段时间,这端时间存放的数据多大就在这里设置)

Deivce Capabilities Register :                                      设备功能寄存器的值,不可修改

Buffering Optimized For Bus Mastering Applications : 该选将会告诉远端设备其授权机制专门为总线管理应用而优化过

Performance Level :                                                      选择性能的级别,该选项将会决定接收器和发送器的大小尺寸

Device Capabilities2 Register :                                     显示Device Capabilities2寄存器的值,不可修改

总结 : 个人认为需要修改的部分只有最大负载.

Max Payload Size : 相当于PCIE里面的RAM可以暂存多少数据,然后进行打包,通过金手指发出去

标签页用来设置PCI兼容的中断和MSI中断仿真的参数

Enable INTX  :      使能INTX(PCI兼容中断信号)

Interrupt PIN  :      只支持INTA的中断信号

EnableMSI Capability Structure :  使能MSI功能结构 

64 bit Address Capable :               该选项可以发送64-bit的消息地址

Multiple Message Capable :          选择中断矢量的数据.

Per Vector Masking Capable :       该选项可以指定为每个中断矢量启用掩码功能

如果使用中断 默认即可 无需更改 ! 

PCIE ip核建立完成 

2.IP核利化代码介绍 

代码如下

  1. //----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
  2. pcie_7x_0 your_instance_name (
  3.   .pci_exp_txp(pci_exp_txp),                                                                // 一对传输端的差分 发送
  4.   .pci_exp_txn(pci_exp_txn),                                                                // 一对传输端的差分 发送
  5.   .pci_exp_rxp(pci_exp_rxp),                                                                // 一对传输端的差分 接收
  6.   .pci_exp_rxn(pci_exp_rxn),                                                                // 一对传输端的差分 接收
  7.   
  8.   .pipe_pclk_in(pipe_pclk_in),                                                              // 共享逻辑端口,共享时钟
  9.   .pipe_rxusrclk_in(pipe_rxusrclk_in),                                                      // 共享逻辑端口,共享时钟
  10.   .pipe_rxoutclk_in(pipe_rxoutclk_in),                                                      // 共享逻辑端口,共享时钟
  11.   .pipe_dclk_in(pipe_dclk_in),                                                              // 共享逻辑端口,共享时钟
  12.   .pipe_userclk1_in(pipe_userclk1_in),                                                      // 共享逻辑端口,共享时钟
  13.   .pipe_userclk2_in(pipe_userclk2_in),                                                      // 共享逻辑端口,共享时钟
  14.   .pipe_oobclk_in(pipe_oobclk_in),                                                          // 共享逻辑端口,共享时钟
  15.   .pipe_mmcm_lock_in(pipe_mmcm_lock_in),                                                    // 共享逻辑端口,共享时钟
  16.   .pipe_txoutclk_out(pipe_txoutclk_out),                                                    // 共享逻辑端口,共享时钟
  17.   .pipe_rxoutclk_out(pipe_rxoutclk_out),                                                    // 共享逻辑端口,共享时钟
  18.   .pipe_pclk_sel_out(pipe_pclk_sel_out),                                                    // 共享逻辑端口,共享时钟
  19.   .pipe_gen3_out(pipe_gen3_out),                                                            // 共享逻辑端口,共享时钟
  20.   
  21.   .user_clk_out(user_clk_out),                           //事务、配置、物理层控制和状态接口的操作都参照该时钟,并与上升沿同步
  22.   .user_reset_out(user_reset_out),                       //事务层重置信号,用户逻辑必须使用该信号重置用户逻辑程序
  23.   .user_lnk_up(user_lnk_up),                             //当IP核与之相连的端口准备好 ,并可相互发送数据包时,该信号变为有效位
  24.   .user_app_rdy(user_app_rdy),    //当user_app_rdy信号为非有效位时,将输入信号转换为3态信号输出;当user_app_rdy信号为有效位时,恢复输出信号为输入信号
  25.   .tx_buf_av(tx_buf_av),          //通过监控tx_buf_av信号,用户可以直到Buffer中是否有剩余的空间,从而在NP包阻塞时接收Posted包和Cpl包[5:0]
  26.   .tx_cfg_req(tx_cfg_req),         //传输配置请求,表示IP核准备好传输一个完整的配置包或者其它的内部产生的TLP(事务层的包)
  27.   .tx_err_drop(tx_err_drop),     //表示IP核抛弃了包数据,通常是因为长度不符,或者在连续的时钟周期内没有提供数据
  28.   
  29.   .s_axis_tx_tready(s_axis_tx_tready),                   //表示IP核准备好接收传输数据
  30.   .s_axis_tx_tdata(s_axis_tx_tdata),                     //被传递的包数据[63:0]
  31.   .s_axis_tx_tkeep(s_axis_tx_tkeep),                     //[7 : 0] 传输数据选通
  32.   .s_axis_tx_tlast(s_axis_tx_tlast),                     // 表示传输的最后一帧
  33.   .s_axis_tx_tvalid(s_axis_tx_tvalid),                   //表示用户程序已经在s_axis_tx_tdata上准备好了有效的传输数据
  34.   .s_axis_tx_tuser(s_axis_tx_tuser),                     // input wire [3 : 0] 传输资源中止
  35.   
  36.   .tx_cfg_gnt(tx_cfg_gnt),                               //由用户响应tx_cfg_req信号,表示授权允许IP核传输一个内部产生的TLP包
  37.   
  38.   .m_axis_rx_tdata(m_axis_rx_tdata),                     //接受报的数据,同样只有在m_axis_rx_tvalid信号有效时才有效【63:0】
  39.   .m_axis_rx_tkeep(m_axis_rx_tkeep),           //接收数据选通,当m_axis_rx_tvalid和m_axis_rx_tready同时为有效位时,该信号决定了数据的有效bytes[7:0]
  40.   .m_axis_rx_tlast(m_axis_rx_tlast),                     //接收包的最后一帧
  41.   .m_axis_rx_tvalid(m_axis_rx_tvalid),                 //表示IP核已经将有效数据传输过来,并希望用户接收
  42.   .m_axis_rx_tready(m_axis_rx_tready),     //表示接收端准备就绪,由用户进行设置,当用户程序希望接收数据时,置有效位。m_axis_rx_tvalid和m_axis_rx_tready同时为有效位时,代表一帧数据接收成功。
  43.   .m_axis_rx_tuser(m_axis_rx_tuser),                     // output wire [21 : 0] m_axis_rx_tuser
  44.   
  45.   .rx_np_ok(rx_np_ok),                      //当用户准备好接收Non_Posted请求的TLPs包的时候,置有效位
  46.   .rx_np_req(rx_np_req),                     //请求IP核发送Non-Posted TLPs包
  47.   
  48.   .fc_cpld(fc_cpld),                       //[11:0]信号有效得使用和管理接收端Buffer
  49.   .fc_cplh(fc_cplh),                       //[7:0]信号有效得使用和管理接收端Buffer
  50.   .fc_npd(fc_npd),                         //[11:0]信号有效得使用和管理接收端Buffer
  51.   .fc_nph(fc_nph),                         //[7:0]信号有效得使用和管理接收端Buffer
  52.   .fc_pd(fc_pd),                           //[7:0]信号有效得使用和管理接收端Buffer
  53.   .fc_ph(fc_ph),                         //[7:0]信号有效得使用和管理接收端Buffer
  54.   .fc_sel(fc_sel),                       //[2:0]信号有效得使用和管理接收端Buffer
  55.   
  56.   .cfg_mgmt_do(cfg_mgmt_do),                         //[31:0]32-bit的配置寄存器的状态输出数据
  57.   .cfg_mgmt_rd_wr_done(cfg_mgmt_rd_wr_done),         //表示配置读写完成的信号。该信号为有效位时
  58.   .cfg_status(cfg_status),                           //[15:0]配置空间的头寄存器中的状态寄存器的数据,表示配置的状态
  59.   .cfg_command(cfg_command),                         //[15:0]配置命令,配置空间的头寄存器中的命令寄存器的数据
  60.   .cfg_dstatus(cfg_dstatus),                         //[15:0]表示PCI Express Capability Structure中的设备状态寄存器的值,表示配置设备的状态
  61.   .cfg_dcommand(cfg_dcommand),                       //[15:0]表示PCI Express Capability Structure中的设备命令寄存器的值,表示配置设备的命令
  62.   .cfg_lstatus(cfg_lstatus),                         //[15:0]表示配置连接的状态,PCI Express Capability Structure中的连接状态寄存器的值
  63.   .cfg_lcommand(cfg_lcommand),                       //[15:0]表示配置连接的命令,PCI Express Capability Structure中的连接控制寄存器的值
  64.   .cfg_dcommand2(cfg_dcommand2),                     //[15:0]表示PCI Express Capability Structure中的设备命令寄存器2的值,表示配置设备的命令2
  65.   .cfg_pcie_link_state(cfg_pcie_link_state),         //[2:0]表示PCI Express连接状态000: L0001: PPM L1010: PPM L2/L3 Ready011: PM_PME100: in or transitioning to/from ASPM L0s 101: transitioning to/from PPM L1 110: transition to PPM L2/L3 Ready111: Reserved
  66.   
  67.   .cfg_pmcsr_pme_en(cfg_pmcsr_pme_en),                         //使能电源管理,置位电源控制/状态寄存器
  68.   .cfg_pmcsr_powerstate(cfg_pmcsr_powerstate),                 //[1:0]PMCSR(电源控制状态寄存器)bits (bits 1:0) ,表示电源的状态
  69.   .cfg_pmcsr_pme_status(cfg_pmcsr_pme_status),                 //表示电源管理单元的状态。电源控制/状态寄存器的电源状态位
  70.   .cfg_received_func_lvl_rst(cfg_received_func_lvl_rst),        //该信号在该IP核中不会使用
  71.   .cfg_mgmt_di(cfg_mgmt_di),                                   //[31:0]配置数据输入
  72.   .cfg_mgmt_byte_en(cfg_mgmt_byte_en),                         //[3:0]配置数据的Byte使能
  73.   .cfg_mgmt_dwaddr(cfg_mgmt_dwaddr),                           //[9:0]配置寄存器的地址
  74.   .cfg_mgmt_wr_en(cfg_mgmt_wr_en),                             //配置数据的写使能
  75.   .cfg_mgmt_rd_en(cfg_mgmt_rd_en),                             //配置数据的读使能
  76.   .cfg_mgmt_wr_readonly(cfg_mgmt_wr_readonly),                 //管理读写的ReadOnly模式(只读)
  77.   //err 的全是错误标志位
  78.   .cfg_err_ecrc(cfg_err_ecrc),         //如果ECRC机制没有启动,用户应用可以通过将cfg_err_ecrc信号置有效位来标记一个ECRC错误
  79.   .cfg_err_ur(cfg_err_ur),                                      //数据错误标志
  80.   .cfg_err_cpl_timeout(cfg_err_cpl_timeout),     //果一个请求超时了,用户应用必须将cfg_err_cpl_timeout信号置有效位,这样IP核将会发出一个错误消息到Root模式
  81.   .cfg_err_cpl_unexpect(cfg_err_cpl_unexpect),                                              // input wire cfg_err_cpl_unexpect
  82.   .cfg_err_cpl_abort(cfg_err_cpl_abort),                                                    // input wire cfg_err_cpl_abort
  83.   .cfg_err_posted(cfg_err_posted),                                                          // input wire cfg_err_posted
  84.   .cfg_err_cor(cfg_err_cor),                                                                // input wire cfg_err_cor
  85.   .cfg_err_atomic_egress_blocked(cfg_err_atomic_egress_blocked),                            // input wire cfg_err_atomic_egress_blocked
  86.   .cfg_err_internal_cor(cfg_err_internal_cor),                                              // input wire cfg_err_internal_cor
  87.   .cfg_err_malformed(cfg_err_malformed),                                                    // input wire cfg_err_malformed
  88.   .cfg_err_mc_blocked(cfg_err_mc_blocked),                                                  // input wire cfg_err_mc_blocked
  89.   .cfg_err_poisoned(cfg_err_poisoned),                                                      // input wire cfg_err_poisoned
  90.   .cfg_err_norecovery(cfg_err_norecovery),                                                  // input wire cfg_err_norecovery
  91.   .cfg_err_tlp_cpl_header(cfg_err_tlp_cpl_header),                                          // input wire [47 : 0] cfg_err_tlp_cpl_header
  92.   .cfg_err_cpl_rdy(cfg_err_cpl_rdy),                                                        // output wire cfg_err_cpl_rdy
  93.   .cfg_err_locked(cfg_err_locked),                                                          // input wire cfg_err_locked
  94.   .cfg_err_acs(cfg_err_acs),                                                                // input wire cfg_err_acs
  95.   .cfg_err_internal_uncor(cfg_err_internal_uncor),                                          // input wire cfg_err_internal_uncor
  96.   
  97.   .cfg_trn_pending(cfg_trn_pending),                   //表示用户事务挂起,置位时,设备的状态寄存器的事务挂起bit位也同时置位
  98.   .cfg_pm_halt_aspm_l0s(cfg_pm_halt_aspm_l0s ),            //置位时,阻止IP核进入ASPM L0s(活动电源管理的L0状态
  99.   .cfg_pm_halt_aspm_l1(cfg_pm_halt_aspm_l1),               //置位时,阻止IP核进入ASPM L1s(活动电源管理的L1状态)
  100.   .cfg_pm_force_state_en(cfg_pm_force_state_en),           //强制电源状态转化使能,电源转化为cfg_pm_force_state制定的状态
  101.   .cfg_pm_force_state(cfg_pm_force_state),                 //[1:0]强制电源进行如下的状态00: Move to or stay in L0 01: Move to or stay in PPM L110: Move to or stay in ASPM L0s    11: Move to or stay in ASPM L1(1) (7系列不支持ASPM L1模式)
  102.   .cfg_dsn(cfg_dsn),                                       //[63:0]配置设备的串行端口号
  103.   //中断
  104.   .cfg_interrupt(cfg_interrupt),                             //中断请求信号,用户程序声明该信号来产生一个中断消息
  105.   .cfg_interrupt_rdy(cfg_interrupt_rdy),                 //中断授权(Grant)信号,该信号和之前的cfg_interrupt信号同时为有效位时,表示IP核成功发送一个中断消息
  106.   .cfg_interrupt_assert(cfg_interrupt_assert),           //是否配置老版本的中断机制(PCI总线遗留下来的中断信号)。1:配置;0:不配置
  107.   .cfg_interrupt_di(cfg_interrupt_di),                 //[7:0]配置中断的输入矢量的数量,对于MSI类型的中断,消息数据部分的数据,终端必须给出MSI的中断矢量号
  108.   .cfg_interrupt_do(cfg_interrupt_do),                 //[7:0]MSI capability structure 的Message Data属性最低8bits的值
  109.   .cfg_interrupt_mmenable(cfg_interrupt_mmenable),       //[2:0]配置MSI可以接受的中断矢量数
  110.   .cfg_interrupt_msienable(cfg_interrupt_msienable),     //配置是否启用MSI中断。0:只使用老版本的PCI中断(INTX)或MSI-X;1:只使用MSI中断。
  111.   .cfg_interrupt_msixenable(cfg_interrupt_msixenable), //配置启用MSI-X中断。0:只使用INTX中断或者MSI中断;1:只使用MSI-X中断。
  112.   .cfg_interrupt_msixfm(cfg_interrupt_msixfm),         //配置MSI-X的功能掩码,0:位于掩码位的矢量被掩码;1:所有矢量被掩码
  113.   .cfg_interrupt_stat(cfg_interrupt_stat),                   //配置中断的状态
  114.   .cfg_pciecap_interrupt_msgnum(cfg_pciecap_interrupt_msgnum), //[4:0]配置PCI Express Capabilities 中的中断消息数量属性。该信号只有当MSI中断启用时需要
  115.   .cfg_to_turnoff(cfg_to_turnoff),   //配置关闭电源管理通知,表示接收到了PME_TURN_Off 消息,随后CMM启动轮询,当cfg_turnoff_ok信号为有效位时, CMM发送一个PME_To_Ack的消息给链路另一端的设备
  116.   .cfg_turnoff_ok(cfg_turnoff_ok),                 //配置关闭电源管理完成,用户程序通过置位该信号,来告诉终端已经关闭电源
  117.   .cfg_bus_number(cfg_bus_number),                 //[7:0]配置Bus号,用户必须使用该Bus号来设置TLP请求的Bus Number field。默认为00h. 每当接收到Type 0类型的写配置包时刷新
  118.   .cfg_device_number(cfg_device_number),           //[4:0]配置设备号,用户必须使用该设备号来设置TLP请求的Device Number field
  119.   .cfg_function_number(cfg_function_number),       //[2:0]配置的Function号: 用户必须使用该Function号来设置TLP请求的Function Number field
  120.   .cfg_pm_wake(cfg_pm_wake),                       //配置唤醒电源,置位一个时钟周期,发送PowerManagement Wake Event (PM_PME) Message TLP到链路另一端的设备
  121.   .cfg_pm_send_pme_to(cfg_pm_send_pme_to), //置有效位时,Root Port发送一个Turn Off的消息,而链路的另一端设备如果回复了Turn Off Ack消息, 则cfg_msg_received_pme_to_ack信号置有效位,而cfg_pcie_link_state信号则会指示设备进入L3模式终端将会一直拉低为0
  122.  
  123.   .cfg_ds_bus_number(cfg_ds_bus_number),           //总线编号 
  124.   .cfg_ds_device_number(cfg_ds_device_number),     //设备编号
  125.   .cfg_ds_function_number(cfg_ds_function_number), // 功能编号
  126.   
  127.   .cfg_mgmt_wr_rw1c_as_rw(cfg_mgmt_wr_rw1c_as_rw),                                          // input wire cfg_mgmt_wr_rw1c_as_rw
  128.   .cfg_msg_received(cfg_msg_received),               //表示接收到了一个ERR_COR消息
  129.   .cfg_msg_data(cfg_msg_data),                       //[15:0]消息请求ID,当cfg_msg_received为有效位时有效
  130.   .cfg_bridge_serr_en(cfg_bridge_serr_en),                                                  // output wire cfg_bridge_serr_en
  131.   .cfg_slot_control_electromech_il_ctl_pulse(cfg_slot_control_electromech_il_ctl_pulse),    // output wire cfg_slot_control_electromech_il_ctl_pulse
  132.   .cfg_root_control_syserr_corr_err_en(cfg_root_control_syserr_corr_err_en),                // output wire cfg_root_control_syserr_corr_err_en
  133.   .cfg_root_control_syserr_non_fatal_err_en(cfg_root_control_syserr_non_fatal_err_en),      // output wire cfg_root_control_syserr_non_fatal_err_en
  134.   .cfg_root_control_syserr_fatal_err_en(cfg_root_control_syserr_fatal_err_en),              // output wire cfg_root_control_syserr_fatal_err_en
  135.   .cfg_root_control_pme_int_en(cfg_root_control_pme_int_en),                                // output wire cfg_root_control_pme_int_en
  136.   .cfg_aer_rooterr_corr_err_reporting_en(cfg_aer_rooterr_corr_err_reporting_en),            // output wire cfg_aer_rooterr_corr_err_reporting_en
  137.   .cfg_aer_rooterr_non_fatal_err_reporting_en(cfg_aer_rooterr_non_fatal_err_reporting_en),  // output wire cfg_aer_rooterr_non_fatal_err_reporting_en
  138.   .cfg_aer_rooterr_fatal_err_reporting_en(cfg_aer_rooterr_fatal_err_reporting_en),          // output wire cfg_aer_rooterr_fatal_err_reporting_en
  139.   .cfg_aer_rooterr_corr_err_received(cfg_aer_rooterr_corr_err_received),                    // output wire cfg_aer_rooterr_corr_err_received
  140.   .cfg_aer_rooterr_non_fatal_err_received(cfg_aer_rooterr_non_fatal_err_received),          // output wire cfg_aer_rooterr_non_fatal_err_received
  141.   .cfg_aer_rooterr_fatal_err_received(cfg_aer_rooterr_fatal_err_received),                  // output wire cfg_aer_rooterr_fatal_err_received
  142.   .cfg_msg_received_err_cor(cfg_msg_received_err_cor),                                      // 表示接收到了一个ERR_COR消息
  143.   .cfg_msg_received_err_non_fatal(cfg_msg_received_err_non_fatal),                          // 表示接收到了一个ERR_NONFATAL 消息
  144.   .cfg_msg_received_err_fatal(cfg_msg_received_err_fatal),                                  //接收到了ERR_FATAL消息
  145.   .cfg_msg_received_pm_as_nak(cfg_msg_received_pm_as_nak),                                  //表示接收到了电源管理的PM_AS_NAK消息
  146.   .cfg_msg_received_pm_pme(cfg_msg_received_pm_pme),                        //表示接收到了一个PME信号,表示链路接收到了一个PME事务消息
  147.   .cfg_msg_received_pme_to_ack(cfg_msg_received_pme_to_ack),                                // output wire cfg_msg_received_pme_to_ack
  148.   .cfg_msg_received_assert_int_a(cfg_msg_received_assert_int_a),                            // output wire cfg_msg_received_assert_int_a
  149.   .cfg_msg_received_assert_int_b(cfg_msg_received_assert_int_b),                            // output wire cfg_msg_received_assert_int_b
  150.   .cfg_msg_received_assert_int_c(cfg_msg_received_assert_int_c),                            // output wire cfg_msg_received_assert_int_c
  151.   .cfg_msg_received_assert_int_d(cfg_msg_received_assert_int_d),                            // output wire cfg_msg_received_assert_int_d
  152.   .cfg_msg_received_deassert_int_a(cfg_msg_received_deassert_int_a),                        // output wire cfg_msg_received_deassert_int_a
  153.   .cfg_msg_received_deassert_int_b(cfg_msg_received_deassert_int_b),                        // output wire cfg_msg_received_deassert_int_b
  154.   .cfg_msg_received_deassert_int_c(cfg_msg_received_deassert_int_c),                        // output wire cfg_msg_received_deassert_int_c
  155.   .cfg_msg_received_deassert_int_d(cfg_msg_received_deassert_int_d),                        // output wire cfg_msg_received_deassert_int_d
  156.   .cfg_msg_received_setslotpowerlimit(cfg_msg_received_setslotpowerlimit),                  //表示接收到了设置Slot PowerLimit的消息
  157.   .pl_directed_link_change(pl_directed_link_change),   //[1:0]用来表示端口初始化连接宽度(通道数)或速度的改变00: No change01: Link width10: Link speed11: Link width and speed (level-triggered)
  158.   .pl_directed_link_width(pl_directed_link_width),   //[1:0]表示连接通道模式的变更 00: 1-Lane link01: 2-Lane link 10: 4-Lane link11: 8-Lane link
  159.   .pl_directed_link_speed(pl_directed_link_speed),         //表示连接速度模式的改变。0:表示2.5Gb/s;1:5.0Gb/s
  160.   .pl_directed_link_auton(pl_directed_link_auton),               //表示直接的自主的连接变更
  161.   .pl_upstream_prefer_deemph(pl_upstream_prefer_deemph),   //端口传输的非-预加重电路(De-emphasis),通常用于链路工作在5.0Gb/s时。0:6 dB的短时的预加重电路;1:3 dB长时的预加重电路
  162.   .pl_sel_lnk_rate(pl_sel_lnk_rate),                                       //当前链路的带宽,0:2.5Gb/s;1:5.0Gb/s
  163.   .pl_sel_lnk_width(pl_sel_lnk_width),                           //[1:0]当前链路的宽度 。00:1通道;01:2通道;10:4通道;11:8通道        
  164.   .pl_ltssm_state(pl_ltssm_state),  //[5:0]表示当前的LTSSM(Link Training Status State Machine)的状态(太多了就不介绍了)
  165.   .pl_lane_reversal_mode(pl_lane_reversal_mode),     //[1:0]表示预留的通道。00:没有预留;01:Lanes 1:0预留;10:Lanes 3:0预留;11:Lanes 7:0预留
  166.   .pl_phy_lnk_up(pl_phy_lnk_up),                     //表示物理层的连接状态
  167.   .pl_tx_pm_state(pl_tx_pm_state), //[2:0]Tx的电源管理状态000: TX not in L0s001: TX L0s Entry0010: TX L0s Entry1 011: TX L0s Entry2100: TX L0s Idle101: TX L0s FTS0110: TX L0s FTS1111: TX L0s FTS2
  168.   .pl_rx_pm_state(pl_rx_pm_state), //[1:0]Rx的电源管理状态00: RX Not in L0s01: RX L0s Entry10: RX L0s Idle11: RX L0s FTS
  169.   .pl_link_upcfg_cap(pl_link_upcfg_cap), //表示链路可以在上游配置的能力。只有当user_lnk_up为有效位时该信号才有效
  170.   .pl_link_gen2_cap(pl_link_gen2_cap),     //表示链路是否具有二代(Gen2 5.0Gb/s)的能力
  171.   .pl_link_partner_gen2_supported(pl_link_partner_gen2_supported), //表示链路另一端是否有Gen2的能力,只有当F为有效位时该信号才有效
  172.   .pl_initial_link_width(pl_initial_link_width), //[2:0]表示PCI Express端口已经成功连接的通道数。000:没有通道连接;001:1个通道连接;010:2个通道连接;011:4个通道连接;100:8个通道连接
  173.   .pl_directed_change_done(pl_directed_change_done),       //表示连接模式变更完成
  174.   .pl_received_hot_rst(pl_received_hot_rst),                     //表示接收端收到热重启信号
  175.   .pl_transmit_hot_rst(pl_transmit_hot_rst),                   //表示传输端希望PCI Express端口传送一个带内的热重启信号
  176.   .pl_downstream_deemph_source(pl_downstream_deemph_source),   //使能Root Port模式端口传输的非-预加重
  177.   .cfg_err_aer_headerlog(cfg_err_aer_headerlog),             //[127:0]信号给出包头的日志信息
  178.   .cfg_aer_interrupt_msgnum(cfg_aer_interrupt_msgnum),                                      // input wire [4 : 0] cfg_aer_interrupt_msgnum
  179.   .cfg_err_aer_headerlog_set(cfg_err_aer_headerlog_set),   //信号会一直保持有效位直到Uncorrectable Error Status寄存器对应的first error pointer位被清除
  180.   .cfg_aer_ecrc_check_en(cfg_aer_ecrc_check_en), //表示配置修复(AER)和循环冗余校验(ECRC)的使能
  181.   .cfg_aer_ecrc_gen_en(cfg_aer_ecrc_gen_en), //表示配置修复(AER)和循环冗余(ECRC)校验码的产生。AER使能寄存器和控制寄存器的bit6
  182.   .cfg_vc_tcvc_map(cfg_vc_tcvc_map),     //[6:0]配置VC资源的TC/VC映射,表示TCs1-7对于VC0是否是有效的
  183.   
  184.   .sys_clk(sys_clk),         //参考时钟,可选择的时钟频率为:100、125、250MHz
  185.   .sys_rst_n(sys_rst_n),     //复位
  186.   .pipe_mmcm_rst_n(pipe_mmcm_rst_n),                                                        // input wire pipe_mmcm_rst_n
  187.   .pcie_drp_clk(pcie_drp_clk),                                                              // input wire pcie_drp_clk
  188.   .pcie_drp_en(pcie_drp_en),                                                                // input wire pcie_drp_en
  189.   .pcie_drp_we(pcie_drp_we),                                                                // input wire pcie_drp_we
  190.   .pcie_drp_addr(pcie_drp_addr),                                                            // input wire [8 : 0] pcie_drp_addr
  191.   .pcie_drp_di(pcie_drp_di),                                                                // input wire [15 : 0] pcie_drp_di
  192.   .pcie_drp_do(pcie_drp_do),                                                                // output wire [15 : 0] pcie_drp_do
  193.   .pcie_drp_rdy(pcie_drp_rdy)                                                               // output wire pcie_drp_rdy
  194. );
  195. // INST_TAG_END ------ End INSTANTIATION Template ---------

3.PCIE 协议介绍 

读 操作 : 读操作的时候不需要写DATA数据 

BYTE0 : +0最前面的字节表示指令(内存读),TC表示实时性(因为PC端发数据下来肯定很多,这个时候就由TC来控制),TD表示单调性表示它含不含有校验,EP表示这个数据是否发出故障,Attr灵活性的问题表示有没有使用一些pci工具.(TC,TD,EP,Attr这些在APP端是用不到的)Length表示要读的数据的个数.

BYTE2 : Requester ID 发起者是谁,Tag序列号发起了很多报文每个报文都有一个独立的序列号,Last BE 和 First BE 表示最后面的四个字节是有效的还是无效的.

BYTE8 : 地址位,读和写地址[31:2] , 后面跟俩00

写操作 : 就是在读的基础上加上数据 BYTE12,即可 

4.PCIE 时序图 

PIO读事务 

接收引擎在第一个TLP包完成接收后,马上将m_axis_rx_tready信号置非有效,在compl_done_o被输出引擎置有效位后(表示第一个TLP包成功完成传输),在接收下一个读事务包.

PIO写事务

只有在wr_busy_o信号被置非有效后(表示上一个写事务成功写入存储空间),下一个写事务才被存储访问单元接收

PC端安装驱动给PCIE板卡发送写和读操作,通过DEBUG抓取信号观看更加直观 

4 : pcie 示例代码 介绍

pipe_clock_i:pcie_7x_0_pipe_clpck && pcie_7x_support_i:pcie_7x_o_support     →   时钟模块 

app:pcie_app_7x        (用户代码部分) ↓  PIO协议 

EP_MEM_inst:PIO_EP_MEM_ACCESS && EP_MEM_inst:EP_MEM                          →  内部调用了BRAM原语,相当于存储器,可以存储每个地址的数据,这样写可以对每个字节进行修改.

EP_RX_inst:PIO_RX_ENGINE                                                                                        →  电脑的每一个TCP包是在这个模块下接收                                                                               

EP_TX_inst:PIO_TX_ENGINE                                                                                         →  开发板的每一个TLP包在这个模块下发送

5 : 总结  PCIE框图 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/700518
推荐阅读
相关标签
  

闽ICP备14008679号