xdma核各接口的含义:
pcie_cfg_mgmt接口:配置IP核内部信息的接口
sys_clk是从GT Bank上输入过来的时钟
sys_rst_n是由RC控制的冷复位,作用域更大,将核的所有逻辑都复位一遍 RC中还有另外两种复位:温复位、热复位
user_irq_req:中断请求,主要用MSI中断或MSI-X中断
与中断请求相对应的是user_irq_ack,它是一个由主机发送过来的应答信号,ack拉高主要表示主机已经接收到从机的中断请求,
M_AXI:PCIE数据输入输出的接口,可以接DDR或RAM或用户逻辑
pcie_mgt:pcie的引脚
user_lnk_up:是与电脑连接完成的指示信号
XDMA配置:
1、Basic 这部分细节后面讲,先配好
2、PCIE ID
部分1是Xilinx的厂商ID和设备ID,不能更改。如果更改了PCIE就不能正确识别了。也就是说你用不了人家官方提供的xdma驱动了。
部分2是自己可以修改的
部分3是ClassCode,主要表示这个PCIE是用来干啥的,比如这里是用来做简易通信控制器的
3、PCIE BAR空间配置
第三页这里是用来配置BAR空间的,XDMA的bar空间已经被Xilinx写好了,不能更改。如果想扩展一部分用户的BAR空间可以勾选红框
勾选了这个选项,就可以把一部分BAR空间的内容通过AXI Lite输出出来,可以设置BAR空间的大小。比如我这里BAR空间大小我选择了4K
这里需要注意下pcie to axi transiation,电脑的存储域地址都是从0开始的,PC的这个起始地址0和FPGA内bar空间的起始地址不一定是一样的,他的功能就是来设置映射关系的,就是“PC里面的0地址映射到FPGA BAR空间的哪个地址”。由Address Editor确定。
4、PCIE 中断配置
5、DMA通道设置
H:host(电脑) C:card(FPGA板卡) 这个界面可以设置FPGA与电脑数据传输的不同通道,比如FPGA要传给PC的数据有两股,图像数据、ADC采样数据,它们通过不同的通道把数据上传给PC,PC识别这两个通道来确定接收到的是哪类数据。
6、共享逻辑,一般不勾选,保持默认
附:
1、XDMA配置界面Basic中的DMA interface option,这里选择AXI Memort Mapped或AXi Stream有什么区别?哪种的性能要更好一点?
二者的使用场景不一样。
AXI Memort Mapped模式下DMA通道通过地址映射的方式访问内存。源地址和目标地址都是内存地址,数据通过标准的读写操作进行传输。这种适用于需要精确控制数据传输的应用,支持随机访问内存。但缺点是由于引入内存地址访问,会带一点延迟。
AXi Stream模式下数据以流的方式进行传输,没有地址的概念,传输过程简单,只需要控制流信号(如TREADY、TVALID、TLAST等)。优点就是低延迟,因为没有地址解析和内存访问的开销,适用于连续的大数据流传输,例如音视频数据传输。缺点是:灵活性较低。不适用于需要随机访问内存的场景。
资源消耗方面:AXI Memory Mapped 由于涉及地址映射和缓存管理,可能需要更多的硬件资源,而 AXI Stream 的实现相对简单,资源消耗较低。
2、那么AXI Interface下的AXI Data Width64bit与128bit有什么区别?为什么尽量使用64bit?
这里的数据位宽指的是单次可以传输的数据量。128bit就是16个字节,对于编程来讲太麻烦了,假如传输尾端只想传输12个字节,剩下4字节是无效的,那么这里还得做尾端掩码对齐。
3、AXI接口中的尾端对齐:在AXI协议中,“wstrb(写选通信号)”用于指示哪些字节是有效的。当进行数据传输时,wstrb信号可以通过掩码方式来指示哪些字节需要写入,哪些字节可以忽略。
尾端对齐的具体步骤:
1、数据传输准备:例如当有44字节数据需要传输时,可以分为2个128bit(16字节),和1个12字节。
2、传输16字节:在前两个传输周期中,每个周期传输16字节,wstrb信号设置为全高(0xffff),表示所有字节有效
3、传输12字节:在最后一个传输周期中,传输12字节,wstrb需设置为0X0FFF,表示仅前12个字节有效,后4个字节无效。
代码示例:展示了如何做尾端对齐
module axi_tail_alignment (
input wire clk,
input wire reset,
input wire [127:0] data_in,
input wire [3:0] data_length, // 数据长度,单位为字节
output reg [127:0] data_out,
output reg [15:0] wstrb_out
);
always @(posedge clk or posedge reset) begin
if (reset) begin
data_out <= 0;
wstrb_out <= 0;
end else begin
// 默认情况下,所有字节都有效
data_out <= data_in;
wstrb_out <= 16'hFFFF;
// 处理尾端对齐
case (data_length)
4'd1: wstrb_out <= 16'h0001;
4'd2: wstrb_out <= 16'h0003;
4'd3: wstrb_out <= 16'h0007;
4'd4: wstrb_out <= 16'h000F;
4'd5: wstrb_out <= 16'h001F;
4'd6: wstrb_out <= 16'h003F;
4'd7: wstrb_out <= 16'h007F;
4'd8: wstrb_out <= 16'h00FF;
4'd9: wstrb_out <= 16'h01FF;
4'd10: wstrb_out <= 16'h03FF;
4'd11: wstrb_out <= 16'h07FF;
4'd12: wstrb_out <= 16'h0FFF;
4'd13: wstrb_out <= 16'h1FFF;
4'd14: wstrb_out <= 16'h3FFF;
4'd15: wstrb_out <= 16'h7FFF;
4'd16: wstrb_out <= 16'hFFFF;
default: wstrb_out <= 16'hFFFF;
endcase
end
end
endmodule
同样的,不论数据宽度是64bit还是128bit,在需要处理非整数倍数据长度时,都需要进行尾端对齐,只是64bit的做起来相对简单一些。所以,在数据量需求不大的情况下,64bit已经足够满足传输需求了,而且功耗和逻辑资源也比128bit低。