Xilinx中的xapp1052的详细解释

xapp1052是xilinx官方给出的一个有关dma数据传输的样例,用于pc端和fpga端之间的dma数据传输。首先需要说的是,xapp1052并不是一个完整的dma数据传输的终端硬件设计,这在下面会有详细解释。
首先说一下xapp1052模块的组成结构:顶层模块是xilinx_pci_exp_ep,在顶层模块中包含pci_exp_64b_app和bmd_design两个模块,其中pci_exp_64b_app就是我们要介绍的重点,而bmd_design则是实现pcie协议的底层模块。
下面就详细说一下pci_exp_64b_app的模块结构:
pci_exp_64b_app
|
|__bmd
|
|__bmd_ep
| |
| |__bmd_ep_mem_access
| | |_bmd_ep_mem
| |
| |__bmd_rx_engine
| |__bmd_tx_engine
| |__bmd_intr_ctrl
|
| |__bmd_gen2
| |__bmd_rd_throttle
|
|__bmd_to_ctrl
|__bmd_cfg_ctrl
1,bmd_rx_engine的设计:这个模块的作用就是接受来自pc的tlp包(trn_rd[63:0]),并根据不同的情况对包进行拆解,首先根据trn_rd[62:56]位判断包的类型,如果是32位地址读请求(bmd_mem_rd32_fmt_type),那么就转到32位读对应的状态(bmd_64_rx_mem_rd32_qw1);如果是32位地址写请求(bmd_mem_wr32_fmt_type),那么久转到32位写对应的状态(bmd_64_rx_mem_wr32_qw1);如果是不带数据的完成类型(bmd_cpl_fmt_type),那么就转到完成请求对应的状态(bmd_64_rx_cpl_qw1);如果是带数据的完成类型(bmd_cpld_fmt_type),那么就转到带数据完成对应的状态(bmd_64_rx_cpld_qw1)。
上面是状态机的第一次过渡,下面看状态的第二次过渡,在状态是bmd_mem_rd32_fmt_qw1时,这个时候tlp包的第二个dword已经传来,从第二个dword中可以得到读请求的地址addr_o,这个地址时输入到memory模块下用于读出对应地址下的数据的;然后过渡到下一个状态(bmd_64_rx_mem_32_wt),在这个状态下,rx模块会一直检测从tx返回的compl_done_i信号,当读请求申请的对应地址下的数据由tx发送出去时,compl_done_i信号就为1,这个时候rx就会返回到rst状态。当状态是bmd_mem_wr32_fmt_qw1时,这个时候rx也接受到了tlp包的第二个dword,从这个dword中可以拆分出地址(addr_o)和要写的数据(wr_data_o),同时在这个状态写使能值为有效(we_en_o),然后过渡到下一个状态(bmd_64_rx_mem_wr32_wt),在这一个状态,rx会一直检测从memory模块出来的信号(wr_busy_i)是不是为0,如果为0,说明写操作完成,rx回到rst状态。当状态是bmd_64_rx_cpl_qw1的时候,说明这是一个不带数据的完成,其他并没有什么操作。当状态是bmd_64_rx_cpld_qw1时,说明这是一个带数据的完成,为什么完成信号要携带数据呢,原因就是为了检验传输的数据是否正确,在这个状态下以及它的过渡状态中,rx会一次检测传输到pc端的数据和设备内存的数据是否相同,如果不相同,说明数据传输失败,返回失败传输信号(cpld_malformed)。
从上面的描述可以看出,bmd中的rx是不支持连续的写数据的(往设备内存写数据),所以往设备内存写数据的dma操作,xapp1052是不支持的,那么这里发送和接收的数据到底是什么呢,其实这里rx并不是要发送和接收存储数据,而是发送和接收配置数据,即dma的配置数据。
2,bmd_tx_engine的设计:这个模块是往pc端发送tlp包(trn_td[63:0]),这个模块是xapp1052dma的核心模块,它包含dma控制器的所有操作,当然这里只是发送端的dma控制器。tx要解决的问题就是要在不同的情况下发送对应的tlp包。
第一种情况:发送带数据的完成tlp,这是tx最优先处理的(这一点不是很确定,个人感觉xapp1052写的有点问题)。首先在rst状态会产生一个带数据类型的包头。然后过渡到下一个状态:bmd_64_tx_cpld_qw1。在这个状态里要发送tlp的第二个dword,主要包含地址和数据,然后进入下一个状态(bmd_64_tx_cpld_qw1)。
第二种情况:开启dma发送操作,在mwr_start_i和cfg_bm_en有效的情况下,开始发送tlp的包头,dma的包头也只是一个普通的写数据请求;在dma发送模式下,有几个参数是特别重要的:要发送的tlp数目、每个tlp中包含的数据长度、每个tlp对应pc端的起始写入地址。进入下一个状态(bmd_64_tx_mwr_qw1)的时候,tx首先会根据已经发送的tlp包的个数来计算pc端写入的起始地址(tmwr_addr),根据计算出的起始地址发送tlp的第二个dword,然后进入下一个状态:bmd_64_tx_mwr_qwn。在这个状态中,tx首先会判断一个tlp包中的数据长度是多少,如果是1,则在发送下一个dword之后,tx会进入rst状态;如果是2,则下一个dword会包含两个数据,但是同样在发送完下一个dword之后,tx会进入rst状态,在进入rst状态之前,tx又会判断当前发送的tlp数目是否已经等于预先设定的数,如果相等,则会返回mwr_done_o信号;如果当前数据长度大于2,那么在发完下一个dword的时候,tx还会继续发送数据,知道余下的数据长度小于2。这就是tx的发送dma操作,但是现在有一个问题就是在每个tlp中的数据长度大于2的时候,发向pc端的地址该由谁控制累加呢,这在tx模块中并没有体现,这里我猜测是在pc端地址会由相应的模块控制自动累加。还有这里的tx的dma其实也是有一定问题的,dma发送的数据不是由内存读取出来的,而是一个始终不变的数,虽然表面上看是由内存中读取出来的,说明xapp1052的tx的dma设计也只是存粹验证一下dma控制器的正确性,数据的来源xapp1052却并没有涉及。

如何设计高精度并且可靠的4-20mA通信
福特汽车柳青:不在中国做强世界上没地位
三星Galaxy S8发布之后,白羊座的小伙伴又激动难耐了!
物联网技术在工业自动化中的应用
嵌入式系统设计的几个关键步骤简介
Xilinx中的xapp1052的详细解释
泰克:2019做好准备,2020充满期待
宇凡微YE09合封芯片,集成高性能32位mcu和2.4G芯片
低成本无绳式单相BLDC手持式搅拌机方案
简介SMT是怎样的东西
njm4558中文资料(内部电路及参数介绍)
Vishay最新推出节省空间的小型0402外形尺寸新型器件
江门政府与华为携手打造城市智能体
提高Kubernetes的GPU利用率
最常见的几款单片机性能对比
美国政府将可能在2-4周内开始向华为颁发重新供货的许可证
利用云存储的优点来帮助用户解决常见IT问题
国产手机CIS开启新时代,转型Fab-Lite的格科微发布单芯片5000万像素CIS
Spring Boot如何实现异步任务
视觉系统检测机对比检验员,它的优势是什么