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


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

我们直接上手使用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核利化代码介绍 

代码如下

//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
pcie_7x_0 your_instance_name (
  .pci_exp_txp(pci_exp_txp),                                                                // 一对传输端的差分 发送
  .pci_exp_txn(pci_exp_txn),                                                                // 一对传输端的差分 发送
  .pci_exp_rxp(pci_exp_rxp),                                                                // 一对传输端的差分 接收
  .pci_exp_rxn(pci_exp_rxn),                                                                // 一对传输端的差分 接收
  
  .pipe_pclk_in(pipe_pclk_in),                                                              // 共享逻辑端口,共享时钟
  .pipe_rxusrclk_in(pipe_rxusrclk_in),                                                      // 共享逻辑端口,共享时钟
  .pipe_rxoutclk_in(pipe_rxoutclk_in),                                                      // 共享逻辑端口,共享时钟
  .pipe_dclk_in(pipe_dclk_in),                                                              // 共享逻辑端口,共享时钟
  .pipe_userclk1_in(pipe_userclk1_in),                                                      // 共享逻辑端口,共享时钟
  .pipe_userclk2_in(pipe_userclk2_in),                                                      // 共享逻辑端口,共享时钟
  .pipe_oobclk_in(pipe_oobclk_in),                                                          // 共享逻辑端口,共享时钟
  .pipe_mmcm_lock_in(pipe_mmcm_lock_in),                                                    // 共享逻辑端口,共享时钟
  .pipe_txoutclk_out(pipe_txoutclk_out),                                                    // 共享逻辑端口,共享时钟
  .pipe_rxoutclk_out(pipe_rxoutclk_out),                                                    // 共享逻辑端口,共享时钟
  .pipe_pclk_sel_out(pipe_pclk_sel_out),                                                    // 共享逻辑端口,共享时钟
  .pipe_gen3_out(pipe_gen3_out),                                                            // 共享逻辑端口,共享时钟
  
  .user_clk_out(user_clk_out),                           //事务、配置、物理层控制和状态接口的操作都参照该时钟,并与上升沿同步
  .user_reset_out(user_reset_out),                       //事务层重置信号,用户逻辑必须使用该信号重置用户逻辑程序
  .user_lnk_up(user_lnk_up),                             //当IP核与之相连的端口准备好 ,并可相互发送数据包时,该信号变为有效位
  .user_app_rdy(user_app_rdy),                           //当user_app_rdy信号为非有效位时,将输入信号转换为3态信号输出;当user_app_rdy信号为有效位时,恢复输出信号为输入信号
  .tx_buf_av(tx_buf_av),                                 //通过监控tx_buf_av信号,用户可以直到Buffer中是否有剩余的空间,从而在NP包阻塞时接收Posted包和Cpl包[5:0]
  .tx_cfg_req(tx_cfg_req),                               //传输配置请求,表示IP核准备好传输一个完整的配置包或者其它的内部产生的TLP(事务层的包)
  .tx_err_drop(tx_err_drop),                             //表示IP核抛弃了包数据,通常是因为长度不符,或者在连续的时钟周期内没有提供数据
  
  .s_axis_tx_tready(s_axis_tx_tready),                   //表示IP核准备好接收传输数据
  .s_axis_tx_tdata(s_axis_tx_tdata),                     //被传递的包数据[63:0]
  .s_axis_tx_tkeep(s_axis_tx_tkeep),                     //[7 : 0] 传输数据选通
  .s_axis_tx_tlast(s_axis_tx_tlast),                     // 表示传输的最后一帧
  .s_axis_tx_tvalid(s_axis_tx_tvalid),                   //表示用户程序已经在s_axis_tx_tdata上准备好了有效的传输数据
  .s_axis_tx_tuser(s_axis_tx_tuser),                     // input wire [3 : 0] 传输资源中止
  
  .tx_cfg_gnt(tx_cfg_gnt),                               //由用户响应tx_cfg_req信号,表示授权允许IP核传输一个内部产生的TLP包
  
  .m_axis_rx_tdata(m_axis_rx_tdata),                     //接受报的数据,同样只有在m_axis_rx_tvalid信号有效时才有效【63:0】
  .m_axis_rx_tkeep(m_axis_rx_tkeep),                     //接收数据选通,当m_axis_rx_tvalid和m_axis_rx_tready同时为有效位时,该信号决定了数据的有效bytes[7:0]
  .m_axis_rx_tlast(m_axis_rx_tlast),                     //接收包的最后一帧
  .m_axis_rx_tvalid(m_axis_rx_tvalid),                   //表示IP核已经将有效数据传输过来,并希望用户接收
  .m_axis_rx_tready(m_axis_rx_tready),                   //表示接收端准备就绪,由用户进行设置,当用户程序希望接收数据时,置有效位。m_axis_rx_tvalid和m_axis_rx_tready同时为有效位时,代表一帧数据接收成功。
  .m_axis_rx_tuser(m_axis_rx_tuser),                     // output wire [21 : 0] m_axis_rx_tuser
  
  .rx_np_ok(rx_np_ok),                                   //当用户准备好接收Non_Posted请求的TLPs包的时候,置有效位
  .rx_np_req(rx_np_req),                                 //请求IP核发送Non-Posted TLPs包
  
  .fc_cpld(fc_cpld),                                     //[11:0]信号有效得使用和管理接收端Buffer
  .fc_cplh(fc_cplh),                                     //[7:0]信号有效得使用和管理接收端Buffer
  .fc_npd(fc_npd),                                       //[11:0]信号有效得使用和管理接收端Buffer
  .fc_nph(fc_nph),                                       //[7:0]信号有效得使用和管理接收端Buffer
  .fc_pd(fc_pd),                                         //[7:0]信号有效得使用和管理接收端Buffer
  .fc_ph(fc_ph),                                         //[7:0]信号有效得使用和管理接收端Buffer
  .fc_sel(fc_sel),                                       //[2:0]信号有效得使用和管理接收端Buffer
  
  .cfg_mgmt_do(cfg_mgmt_do),                             //[31:0]32-bit的配置寄存器的状态输出数据
  .cfg_mgmt_rd_wr_done(cfg_mgmt_rd_wr_done),             //表示配置读写完成的信号。该信号为有效位时
  .cfg_status(cfg_status),                               //[15:0]配置空间的头寄存器中的状态寄存器的数据,表示配置的状态
  .cfg_command(cfg_command),                             //[15:0]配置命令,配置空间的头寄存器中的命令寄存器的数据
  .cfg_dstatus(cfg_dstatus),                             //[15:0]表示PCI Express Capability Structure中的设备状态寄存器的值,表示配置设备的状态
  .cfg_dcommand(cfg_dcommand),                           //[15:0]表示PCI Express Capability Structure中的设备命令寄存器的值,表示配置设备的命令
  .cfg_lstatus(cfg_lstatus),                             //[15:0]表示配置连接的状态,PCI Express Capability Structure中的连接状态寄存器的值
  .cfg_lcommand(cfg_lcommand),                           //[15:0]表示配置连接的命令,PCI Express Capability Structure中的连接控制寄存器的值
  .cfg_dcommand2(cfg_dcommand2),                         //[15:0]表示PCI Express Capability Structure中的设备命令寄存器2的值,表示配置设备的命令2
  .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
  
  .cfg_pmcsr_pme_en(cfg_pmcsr_pme_en),                          //使能电源管理,置位电源控制/状态寄存器
  .cfg_pmcsr_powerstate(cfg_pmcsr_powerstate),                  //[1:0]PMCSR(电源控制状态寄存器)bits (bits 1:0) ,表示电源的状态
  .cfg_pmcsr_pme_status(cfg_pmcsr_pme_status),                  //表示电源管理单元的状态。电源控制/状态寄存器的电源状态位
  .cfg_received_func_lvl_rst(cfg_received_func_lvl_rst),        //该信号在该IP核中不会使用
  .cfg_mgmt_di(cfg_mgmt_di),                                    //[31:0]配置数据输入
  .cfg_mgmt_byte_en(cfg_mgmt_byte_en),                          //[3:0]配置数据的Byte使能
  .cfg_mgmt_dwaddr(cfg_mgmt_dwaddr),                            //[9:0]配置寄存器的地址
  .cfg_mgmt_wr_en(cfg_mgmt_wr_en),                              //配置数据的写使能
  .cfg_mgmt_rd_en(cfg_mgmt_rd_en),                              //配置数据的读使能
  .cfg_mgmt_wr_readonly(cfg_mgmt_wr_readonly),                  //管理读写的ReadOnly模式(只读)
  //err 的全是错误标志位
  .cfg_err_ecrc(cfg_err_ecrc),                                  //如果ECRC机制没有启动,用户应用可以通过将cfg_err_ecrc信号置有效位来标记一个ECRC错误
  .cfg_err_ur(cfg_err_ur),                                      //数据错误标志
  .cfg_err_cpl_timeout(cfg_err_cpl_timeout),                    //果一个请求超时了,用户应用必须将cfg_err_cpl_timeout信号置有效位,这样IP核将会发出一个错误消息到Root模式
  .cfg_err_cpl_unexpect(cfg_err_cpl_unexpect),                                              // input wire cfg_err_cpl_unexpect
  .cfg_err_cpl_abort(cfg_err_cpl_abort),                                                    // input wire cfg_err_cpl_abort
  .cfg_err_posted(cfg_err_posted),                                                          // input wire cfg_err_posted
  .cfg_err_cor(cfg_err_cor),                                                                // input wire cfg_err_cor
  .cfg_err_atomic_egress_blocked(cfg_err_atomic_egress_blocked),                            // input wire cfg_err_atomic_egress_blocked
  .cfg_err_internal_cor(cfg_err_internal_cor),                                              // input wire cfg_err_internal_cor
  .cfg_err_malformed(cfg_err_malformed),                                                    // input wire cfg_err_malformed
  .cfg_err_mc_blocked(cfg_err_mc_blocked),                                                  // input wire cfg_err_mc_blocked
  .cfg_err_poisoned(cfg_err_poisoned),                                                      // input wire cfg_err_poisoned
  .cfg_err_norecovery(cfg_err_norecovery),                                                  // input wire cfg_err_norecovery
  .cfg_err_tlp_cpl_header(cfg_err_tlp_cpl_header),                                          // input wire [47 : 0] cfg_err_tlp_cpl_header
  .cfg_err_cpl_rdy(cfg_err_cpl_rdy),                                                        // output wire cfg_err_cpl_rdy
  .cfg_err_locked(cfg_err_locked),                                                          // input wire cfg_err_locked
  .cfg_err_acs(cfg_err_acs),                                                                // input wire cfg_err_acs
  .cfg_err_internal_uncor(cfg_err_internal_uncor),                                          // input wire cfg_err_internal_uncor
  
  .cfg_trn_pending(cfg_trn_pending),                         //表示用户事务挂起,置位时,设备的状态寄存器的事务挂起bit位也同时置位
  .cfg_pm_halt_aspm_l0s(cfg_pm_halt_aspm_l0s ),              //置位时,阻止IP核进入ASPM L0s(活动电源管理的L0状态
  .cfg_pm_halt_aspm_l1(cfg_pm_halt_aspm_l1),                 //置位时,阻止IP核进入ASPM L1s(活动电源管理的L1状态)
  .cfg_pm_force_state_en(cfg_pm_force_state_en),             //强制电源状态转化使能,电源转化为cfg_pm_force_state制定的状态
  .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模式)
  .cfg_dsn(cfg_dsn),                                         //[63:0]配置设备的串行端口号
  //中断
  .cfg_interrupt(cfg_interrupt),                             //中断请求信号,用户程序声明该信号来产生一个中断消息
  .cfg_interrupt_rdy(cfg_interrupt_rdy),                     //中断授权(Grant)信号,该信号和之前的cfg_interrupt信号同时为有效位时,表示IP核成功发送一个中断消息
  .cfg_interrupt_assert(cfg_interrupt_assert),               //是否配置老版本的中断机制(PCI总线遗留下来的中断信号)。1:配置;0:不配置
  .cfg_interrupt_di(cfg_interrupt_di),                       //[7:0]配置中断的输入矢量的数量,对于MSI类型的中断,消息数据部分的数据,终端必须给出MSI的中断矢量号
  .cfg_interrupt_do(cfg_interrupt_do),                       //[7:0]MSI capability structure 的Message Data属性最低8bits的值
  .cfg_interrupt_mmenable(cfg_interrupt_mmenable),           //[2:0]配置MSI可以接受的中断矢量数
  .cfg_interrupt_msienable(cfg_interrupt_msienable),         //配置是否启用MSI中断。0:只使用老版本的PCI中断(INTX)或MSI-X;1:只使用MSI中断。
  .cfg_interrupt_msixenable(cfg_interrupt_msixenable),       //配置启用MSI-X中断。0:只使用INTX中断或者MSI中断;1:只使用MSI-X中断。
  .cfg_interrupt_msixfm(cfg_interrupt_msixfm),               //配置MSI-X的功能掩码,0:位于掩码位的矢量被掩码;1:所有矢量被掩码
  .cfg_interrupt_stat(cfg_interrupt_stat),                   //配置中断的状态
  .cfg_pciecap_interrupt_msgnum(cfg_pciecap_interrupt_msgnum), //[4:0]配置PCI Express Capabilities 中的中断消息数量属性。该信号只有当MSI中断启用时需要
  .cfg_to_turnoff(cfg_to_turnoff),                             //配置关闭电源管理通知,表示接收到了PME_TURN_Off 消息,随后CMM启动轮询,当cfg_turnoff_ok信号为有效位时, CMM发送一个PME_To_Ack的消息给链路另一端的设备
  .cfg_turnoff_ok(cfg_turnoff_ok),                             //配置关闭电源管理完成,用户程序通过置位该信号,来告诉终端已经关闭电源
  .cfg_bus_number(cfg_bus_number),                             //[7:0]配置Bus号,用户必须使用该Bus号来设置TLP请求的Bus Number field。默认为00h. 每当接收到Type 0类型的写配置包时刷新
  .cfg_device_number(cfg_device_number),                       //[4:0]配置设备号,用户必须使用该设备号来设置TLP请求的Device Number field
  .cfg_function_number(cfg_function_number),                   //[2:0]配置的Function号: 用户必须使用该Function号来设置TLP请求的Function Number field
  .cfg_pm_wake(cfg_pm_wake),                                   //配置唤醒电源,置位一个时钟周期,发送PowerManagement Wake Event (PM_PME) Message TLP到链路另一端的设备
  .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
 
  .cfg_ds_bus_number(cfg_ds_bus_number),           //总线编号 
  .cfg_ds_device_number(cfg_ds_device_number),     //设备编号
  .cfg_ds_function_number(cfg_ds_function_number), // 功能编号
  
  .cfg_mgmt_wr_rw1c_as_rw(cfg_mgmt_wr_rw1c_as_rw),                                          // input wire cfg_mgmt_wr_rw1c_as_rw
  .cfg_msg_received(cfg_msg_received),                                                      //表示接收到了一个ERR_COR消息
  .cfg_msg_data(cfg_msg_data),                                                              //[15:0]消息请求ID,当cfg_msg_received为有效位时有效
  .cfg_bridge_serr_en(cfg_bridge_serr_en),                                                  // output wire cfg_bridge_serr_en
  .cfg_slot_control_electromech_il_ctl_pulse(cfg_slot_control_electromech_il_ctl_pulse),    // output wire cfg_slot_control_electromech_il_ctl_pulse
  .cfg_root_control_syserr_corr_err_en(cfg_root_control_syserr_corr_err_en),                // output wire cfg_root_control_syserr_corr_err_en
  .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
  .cfg_root_control_syserr_fatal_err_en(cfg_root_control_syserr_fatal_err_en),              // output wire cfg_root_control_syserr_fatal_err_en
  .cfg_root_control_pme_int_en(cfg_root_control_pme_int_en),                                // output wire cfg_root_control_pme_int_en
  .cfg_aer_rooterr_corr_err_reporting_en(cfg_aer_rooterr_corr_err_reporting_en),            // output wire cfg_aer_rooterr_corr_err_reporting_en
  .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
  .cfg_aer_rooterr_fatal_err_reporting_en(cfg_aer_rooterr_fatal_err_reporting_en),          // output wire cfg_aer_rooterr_fatal_err_reporting_en
  .cfg_aer_rooterr_corr_err_received(cfg_aer_rooterr_corr_err_received),                    // output wire cfg_aer_rooterr_corr_err_received
  .cfg_aer_rooterr_non_fatal_err_received(cfg_aer_rooterr_non_fatal_err_received),          // output wire cfg_aer_rooterr_non_fatal_err_received
  .cfg_aer_rooterr_fatal_err_received(cfg_aer_rooterr_fatal_err_received),                  // output wire cfg_aer_rooterr_fatal_err_received
  .cfg_msg_received_err_cor(cfg_msg_received_err_cor),                                      // 表示接收到了一个ERR_COR消息
  .cfg_msg_received_err_non_fatal(cfg_msg_received_err_non_fatal),                          // 表示接收到了一个ERR_NONFATAL 消息
  .cfg_msg_received_err_fatal(cfg_msg_received_err_fatal),                                  //接收到了ERR_FATAL消息
  .cfg_msg_received_pm_as_nak(cfg_msg_received_pm_as_nak),                                  //表示接收到了电源管理的PM_AS_NAK消息
  .cfg_msg_received_pm_pme(cfg_msg_received_pm_pme),                                        //表示接收到了一个PME信号,表示链路接收到了一个PME事务消息
  .cfg_msg_received_pme_to_ack(cfg_msg_received_pme_to_ack),                                // output wire cfg_msg_received_pme_to_ack
  .cfg_msg_received_assert_int_a(cfg_msg_received_assert_int_a),                            // output wire cfg_msg_received_assert_int_a
  .cfg_msg_received_assert_int_b(cfg_msg_received_assert_int_b),                            // output wire cfg_msg_received_assert_int_b
  .cfg_msg_received_assert_int_c(cfg_msg_received_assert_int_c),                            // output wire cfg_msg_received_assert_int_c
  .cfg_msg_received_assert_int_d(cfg_msg_received_assert_int_d),                            // output wire cfg_msg_received_assert_int_d
  .cfg_msg_received_deassert_int_a(cfg_msg_received_deassert_int_a),                        // output wire cfg_msg_received_deassert_int_a
  .cfg_msg_received_deassert_int_b(cfg_msg_received_deassert_int_b),                        // output wire cfg_msg_received_deassert_int_b
  .cfg_msg_received_deassert_int_c(cfg_msg_received_deassert_int_c),                        // output wire cfg_msg_received_deassert_int_c
  .cfg_msg_received_deassert_int_d(cfg_msg_received_deassert_int_d),                        // output wire cfg_msg_received_deassert_int_d
  .cfg_msg_received_setslotpowerlimit(cfg_msg_received_setslotpowerlimit),                  //表示接收到了设置Slot PowerLimit的消息
  .pl_directed_link_change(pl_directed_link_change),                                        //[1:0]用来表示端口初始化连接宽度(通道数)或速度的改变00: No change01: Link width10: Link speed11: Link width and speed (level-triggered)
  .pl_directed_link_width(pl_directed_link_width),                                          //[1:0]表示连接通道模式的变更 00: 1-Lane link01: 2-Lane link 10: 4-Lane link11: 8-Lane link
  .pl_directed_link_speed(pl_directed_link_speed),                                          //表示连接速度模式的改变。0:表示2.5Gb/s;1:5.0Gb/s
  .pl_directed_link_auton(pl_directed_link_auton),                                          //表示直接的自主的连接变更
  .pl_upstream_prefer_deemph(pl_upstream_prefer_deemph),                                    //端口传输的非-预加重电路(De-emphasis),通常用于链路工作在5.0Gb/s时。0:6 dB的短时的预加重电路;1:3 dB长时的预加重电路
  .pl_sel_lnk_rate(pl_sel_lnk_rate),                                                        //当前链路的带宽,0:2.5Gb/s;1:5.0Gb/s
  .pl_sel_lnk_width(pl_sel_lnk_width),                                                      //[1:0]当前链路的宽度 。00:1通道;01:2通道;10:4通道;11:8通道        
  .pl_ltssm_state(pl_ltssm_state),                                                          //[5:0]表示当前的LTSSM(Link Training Status State Machine)的状态(太多了就不介绍了)
  .pl_lane_reversal_mode(pl_lane_reversal_mode),                                            //[1:0]表示预留的通道。00:没有预留;01:Lanes 1:0预留;10:Lanes 3:0预留;11:Lanes 7:0预留
  .pl_phy_lnk_up(pl_phy_lnk_up),                                                            //表示物理层的连接状态
  .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
  .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
  .pl_link_upcfg_cap(pl_link_upcfg_cap),                                                    //表示链路可以在上游配置的能力。只有当user_lnk_up为有效位时该信号才有效
  .pl_link_gen2_cap(pl_link_gen2_cap),                                                      //表示链路是否具有二代(Gen2 5.0Gb/s)的能力
  .pl_link_partner_gen2_supported(pl_link_partner_gen2_supported),                          //表示链路另一端是否有Gen2的能力,只有当F为有效位时该信号才有效
  .pl_initial_link_width(pl_initial_link_width),                                            //[2:0]表示PCI Express端口已经成功连接的通道数。000:没有通道连接;001:1个通道连接;010:2个通道连接;011:4个通道连接;100:8个通道连接
  .pl_directed_change_done(pl_directed_change_done),                                        //表示连接模式变更完成
  .pl_received_hot_rst(pl_received_hot_rst),                                                //表示接收端收到热重启信号
  .pl_transmit_hot_rst(pl_transmit_hot_rst),                                                //表示传输端希望PCI Express端口传送一个带内的热重启信号
  .pl_downstream_deemph_source(pl_downstream_deemph_source),                                //使能Root Port模式端口传输的非-预加重
  .cfg_err_aer_headerlog(cfg_err_aer_headerlog),                                            //[127:0]信号给出包头的日志信息
  .cfg_aer_interrupt_msgnum(cfg_aer_interrupt_msgnum),                                      // input wire [4 : 0] cfg_aer_interrupt_msgnum
  .cfg_err_aer_headerlog_set(cfg_err_aer_headerlog_set),                                    //信号会一直保持有效位直到Uncorrectable Error Status寄存器对应的first error pointer位被清除
  .cfg_aer_ecrc_check_en(cfg_aer_ecrc_check_en),                                            //表示配置修复(AER)和循环冗余校验(ECRC)的使能
  .cfg_aer_ecrc_gen_en(cfg_aer_ecrc_gen_en),                                                //表示配置修复(AER)和循环冗余(ECRC)校验码的产生。AER使能寄存器和控制寄存器的bit6
  .cfg_vc_tcvc_map(cfg_vc_tcvc_map),                                                        //[6:0]配置VC资源的TC/VC映射,表示TCs1-7对于VC0是否是有效的
  
  .sys_clk(sys_clk),                                                                        //参考时钟,可选择的时钟频率为:100、125、250MHz
  .sys_rst_n(sys_rst_n),                                                                    //复位
  .pipe_mmcm_rst_n(pipe_mmcm_rst_n),                                                        // input wire pipe_mmcm_rst_n
  .pcie_drp_clk(pcie_drp_clk),                                                              // input wire pcie_drp_clk
  .pcie_drp_en(pcie_drp_en),                                                                // input wire pcie_drp_en
  .pcie_drp_we(pcie_drp_we),                                                                // input wire pcie_drp_we
  .pcie_drp_addr(pcie_drp_addr),                                                            // input wire [8 : 0] pcie_drp_addr
  .pcie_drp_di(pcie_drp_di),                                                                // input wire [15 : 0] pcie_drp_di
  .pcie_drp_do(pcie_drp_do),                                                                // output wire [15 : 0] pcie_drp_do
  .pcie_drp_rdy(pcie_drp_rdy)                                                               // output wire pcie_drp_rdy
);
// 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框图 

  • 31
    点赞
  • 245
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Vivado DMA PCIe IP是一种基于Vivado设计套件的模块,用于配置DMA(直接存储器访问)和PCIe(外设组件互联标准)功能。通过配置Vivado DMA PCIe IP,可以实现高速数据传输和通信。 配置Vivado DMA PCIe IP的过程如下: 1. 在Vivado设计套件中创建一个新的工程,并选择适当的目标设备。 2. 在IP Integrator视图中,右键单击设计文件夹,选择"Add IP"选项。 3. 在IP库浏览器中,搜索并选择Vivado DMA PCIe IP。 4. 在上一个步骤选择的IP上右键单击,选择"Generate"选项来生成IP的实例。 5. 根据需求,对生成的IP实例进行配置。可以配置的选项包括DMA通道数、数据宽度、中断控制等。 6. 配置完成后,连接IP的输入和输出端口到其他模块。 7. 在设计页面上实并保存设计。 8. 在合成和实现阶段,Vivado会生成相应的逻辑实现和约束文件。 9. 使用生成的比特流文件进行FPGA的编程加载。 10. 通过PCIe接口,将FPGA与计算机或其他设备连接起来。 通过以上步骤,就可以完成Vivado DMA PCIe IP的配置。配置完成后,可以利用该IP实现高速数据传输和通信,也可以根据需求进行相应的修改和优化。使用Vivado DMA PCIe IP可以提高系统的性能和灵活性,使得FPGA设备更好地与计算机和外设进行交互。 ### 回答2: Vivado是Xilinx公司推出的一种用于集成电路设计与开发的综合工具,DMA(Direct Memory Access)指的是直接内存访问技术,而PCIe(Peripheral Component Interconnect Express)是一种计算机总线技术。Vivado DMA PCIe IP配置是指在Vivado环境下,对DMA PCIe IP进行相应的设置和配置。 在Vivado中配置DMA PCIe IP,首先需要创建一个新的工程,并选择适当的目标设备。然后,在Block Design界面中添加DMA IPPCIe IP。在DMA IP配置中,根据具体需求选择DMA通道数、数据宽度、内存地址等参数,并设置数据传输模式(如循环模式、指定长度模式等)。在PCIe IP配置中,设置相应的PCIE GEN版本、通道数、数据传输模式等。此外,还需设置DMA和PCIe之间的连接,并配置中断和异常处理机制。 配置完DMA PCIe IP后,需要进行综合、可编程逻辑器件(FPGA)编译、实现、生成比特流,并将其下载到目标设备上。接下来,可以进行功能验证和性能测试,以确保DMA PCIe IP的正确性和稳定性。 总结起来,Vivado DMA PCIe IP配置的过程包括创建工程、添加DMA和PCIe IP、设置相关参数、连接IP、综合、编译、实现和验证。这样配置后,可以实现通过DMA和PCIe进行高速数据传输的功能,从而满足特定应用的需求。 ### 回答3: Vivado DMA PCIe IP是Xilinx Vivado设计套件中的一个IP,用于在FPGA和计算机之间实现高速数据传输的DMA(直接内存访问)芯片。通过使用Vivado DMA PCIe IP,我们可以简化和加速FPGA与计算机之间的数据传输过程。 要配置Vivado DMA PCIe IP,我们可以按照以下步骤进行操作: 1. 打开Vivado设计套件并创建一个新的工程。 2. 在工程中添加一个DMA子系统。 3. 将DMA IP添加到DMA子系统中。 4. 配置DMA IP的参数,如传输通道数、数据宽度、时钟频率等。 5. 连接DMA IP与FPGA设计中的其他模块,如片内存储器、外部存储器等。 6. 在DMA IP中设置传输模式,例如循环模式、单次传输模式等。 7. 配置DMA IP的中断控制器和内存映射寄存器,以便与计算机系统进行通信。 8. 生成DMA IP的比特流文件,并将其下载到FPGA开发板中。 9. 在计算机中编写相应的驱动程序,以实现与FPGA之间的数据传输。 10. 在FPGA设计中使用DMA IP进行数据传输和处理。 通过以上步骤,我们就可以成功配置Vivado DMA PCIe IP。配置完成后,我们可以通过DMA IP在FPGA和计算机之间实现高速数据传输,提高数据传输的效率和速度。这对于需要大量数据处理和传输的应用程序,如图像处理、音视频编解码等来说非常有用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小五头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值