AXI4的PL与PS联合设计

1、实验原理

在前面的学习中,解决了如何利用一个缓冲寄存器控制另外一个寄存器的输入输出配置。接下来就是如何将PL设计直接导入到PS中实现资源互换。PS是可以通过AXI4总线访问从机的缓存寄存器,从机是可以直接调用PL设计的。只需要从机的IP的编辑界面正常的调用对应的module即可。这次的学习花费了很多时间,出现了许多软件操作错误,这里一一总结,以免日后再犯。

2、实验操作

(1)打开IP设计界面

这里的操作还是打开Ip封装界面,创建一个自定义的AXI4的总线IP。除了第二个界面选择一下create a new AXI4 peripheral之外,其他一路next即可。最后一个选择第二个edit IP,可以自动打开编辑IP界面。没有选择的话在IP category里找到自定义IP的名字后右击也是有edit IP in package的选项的。由于没有过多的选项,就不放图片了。

(2)IP中verilog文件的添加

这里有个十分特别的问题,如果直接从IP编辑界面新建一个文件,没有默认目录。自定义目录如果不在前面设计的工程中源文件目录的话,在完成编辑打包后该文件会自动丢失,无法再试打包。换言之,如果从其他目录引入文件到IP,只能使用一次就会失效。而且失效的文件还会占用在IP工程文件中,导致无法重新添加。这里的设置也没有细查,简单的解决方法就是先在创建的总工程中新建文件,然后在IP编辑界面添加源文件,这样就可以实现多次调用。好像在设置中看到IP打包时可以不删除添加的文件的设置,也没有验证,这里就不展开了。注意在总工程中创建后要移出工程(不要删除存储),以免对后面的步骤造成干扰。

下面是添加的部分:

module stream_led(
input clk_user,
input rst_n_user,
input state_user,
output reg [2:0] led_user
);
reg [25:0] cnt;
always@(posedge clk_user or negedge rst_n_user)begin
if(!rst_n_user)begin
cnt<=1'b0;
end
else if(cnt==26'd50_000_000-1'b1)begin
cnt<=1'b0;
end
else if(state_user)begin
cnt<=cnt+1'b1;
end
end
always@(posedge clk_user or negedge rst_n_user)begin
if(!rst_n_user)begin
led_user<=3'b0;
end
else if(cnt==26'd50_000_000-1'b1)begin
case(led_user)
3'b000:led_user<=3'b001;
3'b001:led_user<=3'b010;
3'b010:led_user<=3'b100;
3'b100:led_user<=3'b001;
default:led_user<=3'b000;
endcase
end
end
endmodule

(3)连接模块

这个是verilog的基本操作了,这里我是在前面的设计的基础上连接的,所以使用的是slv_reg3来实现PS的输出作用到PL的。clk_user和rst_n_user都是PL的端口,可以直接连出。led_user也是PL的端口,直接连接到模块顶层即可。

    stream_led U1_user(
.clk_user(CLK_USER),
.rst_n_user(RST_N_USER),
.state_user(slv_reg3),
.led_user(LED_USER)
);

(4)打包IP

这个操作在IP编辑界面的create and package IP中可以执行。第二个界面选择package your current project即可,其他一路next。

(5)IP的再编辑

一般来说,PL端的代码需要仿真后确认无误才能用于IP中,所以一般不会出问题。主要是端口的连接,这里出了问题也查不到。(由于偷懒,IP的文件添加后不会综合,直接打包,这也导致了一些问题,比较大的IP功能设计是应该综合并查看报告)IP核的再次编辑也是在IP category中找到自定义IP,右击后就会有edit IP in package的选项。有时候第一次打包IP的端口列表由于某些问题没有刷新到添加IP的BD界面上,也可以使用这个操作。

(6)已经完成顶层文件生成的IP的刷新

刷新IP在IP category中,只需要打开IP states(一般重新打包IP后会有提示),选择有感叹号的IP,update即可实现IPcategory中的刷新工作。对于已经添加IP到BD中,完成了顶层调用,或者已经综合映射完成的设计来说,刷新BD文件中IP需要BD文件generate output products(这个操作也是BD右击列表的功能,和自动例化IP的位置一样)。

有时候为了防止忘记,一般新建自定义IP到BD设计时也会刷新一次,在例化BD文件时才能保持一致。如果忘记这个操作:一般情况下可以生成bit流文件,但是无法导出xsa文件。

ERROR: [Common 17-69] Command failed: The current design is not implemented.
ERROR: [Common 17-69] Command failed: ERROR: [Common 17-69] Command failed: The current design is not implemented.

报错信息如上所示。感觉就是IP在BD中和category中不一致导致的。这会导致需要重新做一次流程,时间消耗还是巨大的。

(7)配置端口

输入输出口的配置还是在Elaborated design中实现,根据开发板原理图就可以配置。注意这里所有的配置都是针对PL配置。PS端的端口是由ARM核的寄存器来配置的。所以这里如果使用了PS端的端口的话会报错。

(8)生成XSA文件

在生成bit流后即可输出硬件,然后就可以供vitis使用了。输出硬件就是file的export中的第一个。

(9)软件测试

前面的操作就不多介绍了,就是导入硬件到ARM开发平台即可。直接看代码吧。

#include "xil_io.h"
#include "sleep.h"
#include "stdio.h"
#include "xparameters.h"
#define IP_BASE XPAR_MYIP_V1_0_0_BASEADDR
#define REG0_OFFSET 0
#define REG1_OFFSET 4
#define REG2_OFFSET 8
#define REG3_OFFSET 12
int main(){
int BTN;
Xil_Out32(IP_BASE+REG2_OFFSET,0xffff);
while(1){
BTN=Xil_In32(IP_BASE+REG1_OFFSET); Xil_Out32(IP_BASE+REG0_OFFSET,BTN);
Xil_Out32(IP_BASE+REG3_OFFSET,1); }
}

注意,Xil_Out32(IP_BASE+REG3_OFFSET,1)这个语句就可以实现PS驱动PL的流水灯工作。前面的代码是来自前一次的学习。

3、实验结果

最后的板级验证是符合预期的。这里有一个额外的收获:调试时,打开调试按钮,PS部分的设计正常工作;关闭按钮,PS部分停止工作,但是PL部分还是会继续工作。这里体现了调试只是调试PS部分,PL部分是不受调试的影响的。PL的调试需要使用前面学习的ILA和VIO。

AXI4的PL与PS联合设计的更多相关文章

  1. PS网页设计教程——30个优秀的PS网页设计教程的中文翻译教程

    PS网页设计教程--30个优秀的PS网页设计教程的中文翻译教程   作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作 ...

  2. Zynq7000术语详解,不懂啥是PL,PS,APU,SCU?那就进来看看吧

    Zynq7000术语详解,不懂啥是PL,PS,APU,SCU?那就进来看看吧     相信大家刚看到Zynq手册的时候,对着那么一大堆缩略语肯定是一头雾水,特转来一篇文章,为大家解惑 摘要:本文介绍与 ...

  3. 78.PL和PS通过BRAM交互共享数据

    本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将结果 ...

  4. 【ZYNQ-7000开发之九】使用VDMA在PL和PS之间传输视频流数据

    [ZYNQ-7000开发之九]使用VDMA在PL和PS之间传输视频流数据 原创 2016年01月14日 11:35:02 标签: VDMA / zynq / zedbaord / AXI 10384 ...

  5. PS网页设计教程XXX——在PS中创建一个漫画书主题网页布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  6. PS网页设计教程XXIV——从头设计一个漂亮的网站

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  7. PS网页设计教程XXV——使用Photoshop设计的老式组合布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  8. PS网页设计教程XXVI——如何在PS中创建一个专业的网页布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  9. PS网页设计教程XXVIII——如何在PS中创建一个干净的网页布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  10. PS网页设计教程XXIX——如何在PS中设计一个画廊布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

随机推荐

  1. oracle 游标变量ref cursor详解

    一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言 ...

  2. 《系列二》-- 8、单例bean的创建

    目录 1 源码入口概述 2 getSingleton(beanName, ObjectFactory) 的行为 总结 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需 ...

  3. python调用namp.py进行扫描,调用go编译的so文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- import json import os import platform from ctypes impo ...

  4. win32 - wsprintf和wvsprintf

    前者很常用, 经常被用来转换为字符串或者拼接字符串. 例子: #include <Windows.h> #include <stdio.h> int main() { int ...

  5. 【LeetCode贪心#04】跳跃游戏I + II

    跳跃游戏 力扣题目链接(opens new window) 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示 ...

  6. 【LeetCode哈希表#1】有效的字母异位词+赎金信(数组)

    有效的字母异位词 力扣题目链接(opens new window) 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagr ...

  7. pip相关知识

    正常安装语法 # 安装单个 pip install some-package # 安装指定版本 pip install some-package==版本号 # 查看当前模块版本号 pip instal ...

  8. DataGear 制作自定义柱状图条目颜色的数据可视化看板

    DataGear 看板提供了dg-chart-options图表选项配置功能,可自定义样式.位置.显示内容等图表选项,其中的processUpdateOptions回调函数配置项,可以在图表更新数据前 ...

  9. 【Azure Function App】如何修改Azure函数应用的默认页面呢?

    问题描述 当在Azure中创建了一个函数应用(Function App)后,访问默认URL会得到一个默认的页面.是否有办法修改这个默认页面呢? 问题解答 在之前的博文中,介绍了修改App Servic ...

  10. 【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)

    问题描述 在Azure Kubernetes 服务中,创建一个Internal Load Balancer服务,使用以下yaml内容: internallb.yaml apiVersion: v1 k ...