FPGA实践教程(六)AXI-Lite实现PS与PL通信

51 篇文章 6 订阅
9 篇文章 11 订阅

背景:PS与PL的通信方式有AXI4,AXI-Lite,AXI-Stream。之前实现的为AXI-Stream s(side channel),并且编译环境为linux编译环境。现在改为基础的AXI-Lite的通信方式,编译环境变为SDK环境。

目的:实现AXI-Lite的通信。

AXI-lite的实现过程中,设计流程中三点至关重要,一是编写什么样的c程序并如何用HLS综合,二是系统如何搭建,三是PS端的SDK的c程序如何编写。

目录

一、C程序HLS为IPcore

1.1 接口

1.2 HLS test Bench编写

二、系统搭建

系统生成的驱动

三、SDK单片机程序

四、运行与测试


一、C程序HLS为IPcore

1.1 接口

//Ipcore

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void AxiLiteTest(int * tenNum, int * oneNum, int * outNum)
{
#pragma HLS INTERFACE s_axilite port=outNum
#pragma HLS INTERFACE s_axilite port=oneNum
#pragma HLS INTERFACE s_axilite port=tenNum
  * outNum=10*(*tenNum)+(*oneNum);
  
}

需要在HLS中将接口综合为s_axi-lite,值既可以为指针,也可以为int或者float,有return的话也可以进行相应的综合,传回return的值,后续HLS会根据接口生成相应的驱动,系统搭建时会传给vivado系统,再传给SDK软件。

1.2 HLS test Bench编写

// IPcore HLS testBench
#include <stdio.h>

void AxiLiteTest(int * tenNum, int * oneNum, int * outNum);

int main()
{

  // init value
  int tenNum=3;
  int oneNum=4;
  
  int outNumPS,outNumIP;
  
  //PS simulate
  outNumPS=10*tenNum+oneNum;
  printf("PS simulate finished\n");

  //AXI-lite and IP core
  printf("Test HLS AXI-Lite with mig\n");
  AxiLiteTest(&tenNum, &oneNum, &outNumIP);
  
  //compare the results
  if(outNumPS==outNumIP)
	  printf("IP and AXI-lite OK");
  else
	  printf("IP and AXI-lite failed");

  return 0;

}

只需将相应的值送入,因为Core为指针,所以在testBench中运用取址。(IPcore的c程序就相当于一个子函数,若不是指针的话就不会更改主函数中的变量值?这点需要实验验证,但目前来看是这样的。如果不是指针形式就需要用return来返回值,但HLS的testBench不是关键,仅仅用于验证IPcore的c代码正确,关键在于SDK的testBench)

二、系统搭建

只需要用PS的master GP端就可以,运用interConnect相连,系统会自动生成相应的连接。

相应的地址分配如上,驱动程序在搭建vivado时就会被综合好。parameter.h即为根据具体的程序生成的头文件。里面有各个IPcore的地址等等信息。我们可以参考例子程序实现相应的功能,如IPcore的使能,通信等等。

系统生成的驱动

在axi-lite接口的时候,HLS会生成一个.h和.c的源文件,路径为\ddrHLS\solution1\impl\ip\drivers\memDDR3Tester_v1_0\src    意思是相关IP的单片机的驱动。以供后续的SDK的单片机使用。

SDK的单片机参考程序D:\xilinx\SDx\2016.4\SDK\data\embeddedsw\XilinxProcessorIPLib\drivers

三、SDK单片机程序

//axi-lite SDK testBench 
#include <stdio.h>
#include <xaxilitetest.h>
#include <xparameters.h>
#include <xil_cache.h>

XAxilitetest XAxilitetestCore;

int main()
{
	//initialize IP core
	XAxilitetest_Initialize(&XAxilitetestCore, XPAR_AXILITETEST_0_DEVICE_ID);
	printf("\n	Initialize axilitetest IPcore SUCCESSFUL!\n");
	
	//initialize value
	int tenNum=0;
	int oneNum=0;
	int outNumPS, outNumIP,outNumIPVld;
	printf("	Initialize param tenNum=%d,oneNum=%d SUCCESSFUL!\n",tenNum,oneNum);
	
	//before set value on IP core
	outNumIPVld=XAxilitetest_Get_outNum_vld(&XAxilitetestCore);
	printf("	outNumIPVld is %d,outNumIP is %d\n",outNumIPVld,outNumIP);
	
	//simulate on PS
	outNumPS=10*tenNum+oneNum;
	
	//test on IPcore
	printf("	Test axi-lite IP core\n");
	XAxilitetest_Set_tenNum(&XAxilitetestCore,tenNum);
	XAxilitetest_Set_oneNum(&XAxilitetestCore,oneNum);
	//out
	outNumIP=XAxilitetest_Get_outNum(&XAxilitetestCore);
	outNumIPVld=XAxilitetest_Get_outNum_vld(&XAxilitetestCore);
	printf("	outNumIPVld is %d \n",outNumIPVld);
	
	if(outNumIP==outNumPS)
		printf("	outNumIP is %d,Test SUCCESSFUL!\n",outNumIP);
	
	return 0;
}

单片机程序在编写时,可以参考SDK软件中相应的例程,SDK软件中几乎对所有的程序都有例程,只需更改其中的参数即可。对AXI-lite通信,首先我们需要使能IPcore,然后对相应的端口进行值的设定,然后进行IPcore的运算。

四、运行与测试

表明IPcore上的寄存器只要不断电就会保持原来值,如果不初始化IPcore,只变更单片机SDK的程序,则IPcore的值均为上次初始化的值。IPcore_vld函数在运行之后就会变为1值。我们的IPcore正常工作。这里我们发现进行运算之前,只要不断电,IPcore上的寄存器会保持之前的值。

(依然存在疑问:IPcore开始运算的标志是什么?是否为每次Get_outnum时就开始IPcore?然后用vld来标志其是否有效?)

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: axi-stream和axi-lite是两种不同的传输协议,它们在数据传输的方式和控制信号上有所不同。在将axi-stream转换为axi-lite时,需要进行一些改变和调整。 首先,axi-stream是一种流式传输协议,它主要用于高速数据传输,没有固定的地址和控制信号。而axi-lite是一种基于地址和控制信号的传输协议,适用于低速数据传输和对外部设备的读写控制。 要将axi-stream转换为axi-lite,需要定义一个寄存器(或寄存器组),用于接收从axi-stream传输过来的数据。通过定义该寄存器的地址和控制信号,可以对其进行读写操作,并将数据传输到外部设备。 其次,需要根据具体的应用场景,对数据的格式和处理进行调整。axi-stream一般通过数据流的方式传输,而axi-lite传输的数据需要按照特定的格式进行打包和解包。因此,在进行转换时,需要对数据进行格式转换和处理,以满足axi-lite的传输要求。 最后,需要修改相应的控制逻辑和状态机来适应axi-lite的读写操作。axi-stream主要通过数据流传输,而axi-lite需要定义读写控制信号和状态机来实现读写操作。因此,在进行转换时,需要对控制逻辑和状态机进行修改,以实现axi-lite的读写功能。 总结起来,将axi-stream转换为axi-lite需要进行以下几个步骤:定义一个寄存器用于接收数据、调整数据的格式和处理、修改控制逻辑和状态机来适应axi-lite的读写操作。通过这些步骤,我们可以完成axi-stream到axi-lite的转换。 ### 回答2: 要将Axi-Stream转换为Axi-Lite,需要进行一系列的处理和转换。 首先,需要了解Axi-Stream和Axi-Lite之间的区别。Axi-Stream是一种高速数据传输协议,用于在数据流传输应用中实现高速数据传输。相比之下,Axi-Lite则是一种更简化、精简的协议,适用于低速、延迟敏感的访问要求。 要将Axi-Stream转换为Axi-Lite,需要将数据流转变为离散的数据包。可以通过添加一些额外的逻辑和寄存器来实现数据的提取和转换。 首先,需要添加一个接收缓冲区,用于接收Axi-Stream传输的数据。可以使用一个FIFO(First-In, First-Out)缓冲区来实现。将Axi-Stream输入端口连接到该缓冲区,并配置缓冲区的大小以适应数据传输的需求。 然后,可以使用状态机和控制逻辑从接收缓冲区中提取数据。根据Axi-Lite协议的要求,需要提取合适的数据字段,并将其放入适当的寄存器中。可以使用状态机来控制数据的提取和转换过程。 最后,在提取和转换数据后,可以使用Axi-Lite的地址端口和数据端口,将数据传输到Axi-Lite总线上。根据Axi-Lite协议的要求,需要设置地址、数据和控制信号,以完成对寄存器的读写操作。 总体而言,将Axi-Stream转换为Axi-Lite需要添加接收缓冲区、状态机和控制逻辑,并通过Axi-Lite协议完成数据的提取和转换。这样可以实现从高速数据传输到低速数据访问的转换。 ### 回答3: Axi-stream和Axi-lite是两种不同的通信协议,将Axi-stream转换为Axi-lite可以通过添加适当的逻辑和转换器来实现。下面是一种将Axi-stream转换为Axi-lite的方法: 1. 首先,需要添加一个转换器模块,该模块将负责将Axi-stream信号转换为Axi-lite信号。该转换器模块可以使用FIFO(First-In-First-Out)缓冲区来处理数据流,并将其转换为连续的数据列。 2. 转换器模块接收来自Axi-stream的有效数据包,并根据Axi-lite协议的要求生成对应的Axi-lite数据包。转换过程包括将Axi-stream的数据包拆分为Axi-lite的数据包,并提取有效数据和其他控制信息。 3. 转换器模块还需要处理Axi-stream信号的流速。由于Axi-stream的数据是连续流动的,而Axi-lite的数据包需要在时钟边沿进行传输,因此需要添加适当的时序逻辑来处理数据流速的差异。 4. 转换器模块还应该能够处理Axi-lite协议中的写入和读取操作。写入操作将由Axi-stream转换成Axi-lite写入操作,读取操作将由Axi-stream转换成Axi-lite读取操作。 5. 最后,通过适当的连接操作将转换器模块与Axi-lite总线连接起来,以实现Axi-stream到Axi-lite的转换。 总结来说,将Axi-stream转换为Axi-lite需要添加一个转换器模块,该模块负责处理Axi-stream数据流的数据包和流速,并将其转换为符合Axi-lite协议的信号。这样可以实现Axi-stream到Axi-lite的数据通信转换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

祥瑞Coding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值