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框图
Vivado18.2 PCIE ip核IO协议详细介绍相关推荐
- 【ZYNQ】IP核_VDMA的详细介绍
VDMA的特点总结: 1.AXI VDMA核心支持为32位地址空间寻址最多32个帧缓冲区,为32位以上地址空间寻址多达8个帧缓冲: 2.AXI VDMA核心支持可选的数据重新调整引擎(DRE).DRE ...
- 7系列PCIe IP核用户手册(中文)
7系列PCIe IP核用户手册(中文) 前言 前言 文档的目录如下 下载链接 参考文献 前言 你好! 这是本人阅读和使用Xilinx PCIe IP核时,参照英文版的用户手册所做的笔记,内容很全,并加 ...
- Xilinx PCIE IP核接口介绍
1.1 Xilinx PCIE IP核接口介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Xilinx PCIE IP核接口介绍: 5)结束语. 1.1.2 本节引 ...
- 【转】运输层TCP协议详细介绍
[转]运输层TCP协议详细介绍 TCP是TCP/IP协议族中非常复杂的一个协议.它具有以下特点: 1:面向连接的运输层协议.在使用TCP协议之前,首先需要建立TCP连接.传送数据完毕后,必须释放已经建 ...
- 基于 xilinx vivado 的PCIE ip核设置与例程代码详解
1.概述 本文是用于总结PCIE ip例程的学习成果.主要是从ip的设置,ip核的例程代码构成及其来源两方面介绍pcie的使用情况. 2.参考文档 <pg054-7series-pcie> ...
- VIVADO 自定义封装ip核(超详细)
版本:vivado 2018.3 vivado 自定义封装ip核,可以将ip核封装成带AXI总线,也可将ip核封装成不带AXI总线. 本次设计介绍,如何将当前工程封装成ip核(不带AXI总线) 目录 ...
- CentOS 6.9配置网卡IP/网关/DNS命令详细介绍及一些常用网络配置命令(转)
一.IP 即时生效(重启后失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 route add default gw 19 ...
- HTTP协议详细介绍~超详细
下面是对HTTP的详细介绍,HTTP协议是应用最广泛的网络协议. 希望可以帮助到有需要的小伙伴 文章目录 HTTP是什么 HTTP协议历史与标准 HTTP请求与响应消息 HTTP的基本原理 基于HTT ...
- Ethernet/IP和cip协议的介绍与分析
一. CIP协议簇介绍 CIP 协议族是由 ODVA .CI 等机构联合推出的应用层协议标准, 又称为控制与信息协议, 它为采用不同物理层和数据链路层的各层网络提供了统一的应用层协议标准, 使得各层网 ...
最新文章
- 通达信指标能用c语言编写吗_翔博精选指标看长做短,引用周线数据(通达信公式 副图 源码 测试图)...
- python subplot_气象编程 | 一个简单的风数据处理和分析案例(Python版)
- 了解CMS(Concurrent Mark-Sweep)垃圾回收器
- React Native 加载多类型布局的实现——分类列表SectionList的封装
- 鸿蒙系统能不能用了,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可
!【手机吧】_百度贴吧...
- J2ME游戏中的图片处理
- 【CSS】CSS 的优先级总结
- codeforces 85D. Sum of Medians
- android自定义键盘遮挡,Android软键盘遮挡的四种完美解决方案
- 常见计算机蓝屏代码,老司机教你常见电脑蓝屏代码大全
- 雕刻机可以制作PCB
- falcon-agent模块代码里执行sys.CmdOutBytes命令导致的问题
- 如何删除 R 中的异常值
- ATT CK 阶段之 Initial Access --Drive-by Compromise
- 小米、华为、一加、OPPO接连入场,电视的魅力在哪里?
- 路由守卫 AJAX,vue路由导航守卫和请求拦截以及基于node的token认证的方法
- react antd的关于图标两个小问题
- 细数社交巨无霸Facebook与美国媒体的“爱恨情仇”
- IDEA 快捷键的使用,提高写代码的速度。
- 【AMT 20周年】董事长孔祥云致客户、股东、员工的一封信