这个例子展示了如何对来自FPGA的外部内存访问进行建模,以旋转ASCII艺术图像。许多应用需要FPGA按照算法的要求随机访问内存。您将学习如何设计内存地址生成以及其他AXI4主信号,以使用SoC块集读取和写入内存的特定区域。您将在硬件上模拟、实现和验证您的设计。
万博1manbetx支持的硬件平台:
Artix®7 35T Arty FPGA评估套件
Xilinx®Kintex®7 KC705开发板
Xilinx Zynq®ZC706评估套件
Xilinx Zynq UltraScale™+ MPSoC ZCU102评估套件
Xilinx Zynq UltraScale™+ RFSoC ZCU111评估工具包
Altera®Cyclone®V SoC开发套件
Altera Arria®10 SoC开发套件
ASCII艺术图像被编码为24 × 64矩阵的uint8字符。设计任务是通过在FPGA逻辑中为外部内存访问建模AXI4主接口来旋转图像。通过使用外部内存模型和AXI4协议模拟设计,可以在应用程序设计时验证行为。这节省了在实现阶段在硬件上调试设计的时间。
总体数据流如下图所示。图像存储在从地址0x00000000到0x000017FF的内存区域的外部内存中。FPGA算法从该区域读取图像,并以相反的顺序将其写入内存区域0x00001800,从而旋转它。最后,将数据从内存中读入。
这些模型是使用Model引用构造的。顶级模特的soc_image_rotation'包括FPGA型号'soc_图像_旋转_fpga'使用模型块作为模型参考.
顶级车型涵盖以下领域:
测试台输入:它对刺激进行建模,以设置模拟设计AXI4主源
块初始化外部存储器的输入图像数据算法启动
块通过寄存器通道块向FPGA算法发送启动信号。开放式预加载功能soc_image_rotation_init.m查看模型参数和输入数据是如何初始化的。
测试台输出:AXI4大师沉
块对从外部存储器读取输出图像数据进行建模。输出数据保存在工作区的变量AXI4MasterSinkContent中。开停功能soc\u图像\u旋转\u post.m查看如何绘制输入数据和输出数据。
内存:内存系统使用一个内存控制器和两个内存通道块建模。输入读存储通道
块模型存储输入图像的存储区域1和输出写存储通道
块模型存储旋转图像的存储区域2。
FPGA:此区域实例化FPGA模型参考,该参考为AXI4主接口和数据旋转建模逻辑。
FPGA模型在三个子系统中实现算法,AXI4MasterRead
,ReverseDataOrder
和AXI4MasterWrite
.开放的FPGA图像旋转子系统:
作为正边缘开始
检测到信号,AXIMasterRead
读取一行图像数据并将其传送到ReverseDataOrder
颠倒数据的顺序。然后将反转的数据写入外部存储器AXIMasterWrite
子系统。一旦写入一行的数据,它就会发送一个信号request_next_line
通过以下方式触发下一行的读取:AXIMasterRead
. 此循环将继续,直到处理完图像的所有行。
开放AXI4MasterReadController和AXI4MasterWriteController块来检查用于AXI4主接口的MATLAB®代码。这些块按照AXI4协议设计读写操作的寻址逻辑。SoC Blockset支万博1manbetx持AXI4主协议和AXI4信号的时序图,请参阅AXI4主界面生成的模型设计.
运行模型并从FPGA模型打开逻辑分析仪。注意以下要点:
主机一次写入/读取一行数据。因为每行有64个字符长;突发长度为64 (0x40)。在信号上注意这个值rd_len
和沃伦
.
每个字符扩展为uint32数据类型时有4个字节,这使得行64x4的长度=256(0x100)字节。因此,地址递增/递减0x100。注意这一点地址
和wr_addr
信号。
一次读突发之后是一次写突发。观察德瓦利德
和瓦利德
交替切换。
request_next_line
在每次写入突发之后断言,这将触发下一次读取突发。
在模拟结束时绘制输入和输出图像:
本节需要以下产品:s manbetx 845
高密度脂蛋白编码器™
针对Xilinx设备的So万博1manbetxC区块集支持包,或
针对英特尔®设备的SoC区万博1manbetx块集支持包
要在支持的FPGA板上实现该模型,请使用万博1manbetxSoC建设者应用程序。在实现之前,请确保您已经安装了所需的产品和FPGA供应商软件。s manbetx 845
开放SoC建设者通过单击工具条中的“配置,构建和部署”按钮,并遵循以下步骤:
在“设置”屏幕上选择“构建模型”。单击“下一步”。
单击“查看/编辑内存映射”在“查看内存映射”屏幕上查看内存映射。请注意,基址0x00000000被分配给输入读存储通道
块,并将基址0x00001800分配给输出写存储通道
块AXI4地址是基址和FPGA算法的地址之和。例如wr_addr
从FPGA开始,算法以0x1700开始。输出数据将从地址0x00001800+0x1700=0x00002F00写入外部存储器。提到AXI4主界面生成的模型设计有关基址寄存器计算的详细信息。单击“下一步”。
在“选择项目文件夹”屏幕上指定项目文件夹。单击“下一步”。
在“Select Build Action”屏幕上选择“Build, load and run”。单击“Next”。
在“验证模型”界面,按“验证模型”,以检查要实施的模型是否兼容。单击“Next”。
单击“构建”开始在“构建模型”屏幕上构建模型。当FPGA合成开始时,外壳将打开。单击“下一步”进入“加载比特流”屏幕。
FPGA综合可能需要30分钟以上的时间。为了节省时间,你可以按照以下步骤使用预先生成的比特流:
关闭外壳以终止合成。
通过运行下面的命令将预生成的比特流复制到您的项目文件夹中,然后,
单击“加载”按钮加载预生成的比特流。
copyfile(完整文件(matlabshared.supp万博1manbetxortpkg.getSupportPackageRoot,“工具箱”,...“soc”,“万博1manbetxsupportpackages”,“xilinxsoc”,“xilinxsocexamples”,“比特流”,...“soc_图像_旋转-zc706.位”),”。/ soc_prj ');
要运行此示例,请将示例测试台复制到项目文件夹中。
拷贝文件(fullfile (matlabroot,“工具箱”,“soc”,“socexamples”,'soc\u image\u rotation\u aximaster.m'),...”。/ soc_prj ',“f”);
输入以下命令运行测试台:
soc\u图像\u旋转\u aximaster
测试台执行以下操作:
初始化图像旋转IP
将输入图像数据写入外部存储器
开始图像旋转操作
从外部存储器读回并显示输出图像数据
如果您的FPGA板不是Xilinx Zynq ZC706评估套件,则在启动SoC Builder之前,需要在顶级型号的配置参数中进行以下设置。
选择“硬件实现”面板下的“硬件板”来匹配您的板。
取消选中“硬件实现->目标硬件资源-> FPGA设计(顶层)”面板下的“包括处理系统”。
在“硬件实现->目标硬件资源->FPGA设计(mem通道)”面板下,将“互连数据宽度(位)”设置为“32”。
可用的预生成比特流有:
“soc_图像_旋转-zc706.位”
“soc\u图像\u旋转艺术.位”
‘soc_图像_旋转-zcu102.bit’
“soc_image_rotation-XilinxZynqUltraScale_RFSoCZCU111EvaluationKit.bit”
“soc_图像_旋转-kc705.位”
“soc_image_rotation-a10soc.sof”
修改复制文件命令和示例测试台与您的电路板和选定的项目文件夹相匹配(视情况而定)。对于Altera Arria®10 SoC开发工具包和Altera Cyclone®V SoC开发工具包,请使用下面的复制文件命令对应您的板。
copyfile(完整文件(matlabshared.supp万博1manbetxortpkg.getSupportPackageRoot,“工具箱”,“soc”,...“万博1manbetxsupportpackages”,“国际电信组织”,“互联网示例”,“比特流”,...“soc_image_rotation-a10soc.sof”),”。/ soc_prj ');
请注意,如果自定义内存映射,预生成的位流可能无法工作。
这个示例展示了AXI4主接口的建模,通过旋转一个ASCII艺术图像,使用SoC Blockset以随机方式访问外部内存。您可以将此作为指南来设计自己的算法,以使用AXI4 Master协议直接访问内存。