AXI自定义IP之UART调试
AXI自定义IP之UART调试
1、实验原理
前面的自定义IP中已经将AXI总线的大部分接口设置都一一验证了。基本掌握了关键接受寄存器slv_reg和发送寄存器data_reg_out,可以基本实现简单的PL和PS的联合设计。但是,限于开发板的测试手段有限,只有一个按键和四个LED灯,限制了对复杂设计的测试能力。这里将PS端的一些常用接口利用起来,用于满足测试需求。本次实验使用的是UART串口显示。这个串口可以联系到上位机,可以有效提高测试能力。还有一些其他的资源也会用到,但是比较简单,比如GPIO的使用,调用一个IP就可以了,就不会设置专门的实验验证了。
2、实验操作
(1)hw(hardware硬件)界面操作
新建一个自建IP所需的verilog模块,这里这是复习前面的调用PL的模块,所以设计比较简单。
module multi_n(
input wire [31:0] numb_n1,
input wire [31:0] numb_n2,
output wire [31:0] result_and,
output wire [31:0] result_or,
output wire [31:0] result_not
);
assign result_and = numb_n1 & numb_n2;
assign result_or = numb_n1 | numb_n2;
assign result_not = ~numb_n1;
endmodule
(2)IP界面的操作
这里需要通过新建一个自定义AXI的IP进入IP界面。进入IP设计后,在二级模块调用hw界面中新建的文件(先要添加到IP编辑界面),注意暂存信号的位宽设置。
修改部分:(注意声明信号前置)
//user
wire [31:0] slv_reg2_wire;
wire [31:0] slv_reg3_wire;
wire [31:0] slv_reg4_wire;
//end user always @(*)
begin
// Address decoding for reading registers
case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
3'h0 : reg_data_out <= slv_reg0;
3'h1 : reg_data_out <= slv_reg1;
3'h2 : reg_data_out <= slv_reg2_wire;
3'h3 : reg_data_out <= slv_reg3_wire;
3'h4 : reg_data_out <= slv_reg4_wire;
3'h5 : reg_data_out <= slv_reg5;
default : reg_data_out <= 0;
endcase
end multi_n U1(
.numb_n1(slv_reg0),
.numb_n2(slv_reg1),
.result_and(slv_reg2_wire),
.result_or(slv_reg3_wire),
.result_not(slv_reg4_wire)
);
修改完后就可以打包文件,创建IP。这里总是需要打包两次才能将做好(代码总是容易出问题)。在第二次重复操作时出现IP在某个具体设计bd文件中锁死的情况,这个时候删除重来新调用IP就可以。
(3)hw界面的bd窗口设计
bd设计没有需要外连的端口,直接调用后自连自引即可。最后刷新IP和创建实例module,生成bit流即可实现硬件平台的设计。
(4)sw(software软件)界面的设计
直接建立C语言工程,可以直接使用helloworld的模版,可以快速添加所需的头文件。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "xparameters.h" #define ADR_BASE XPAR_MYIP_V1_0_0_BASEADDR
#define ADR_REG0 0
#define ADR_REG1 4
#define ADR_REG2 8
#define ADR_REG3 12
#define ADR_REG4 16
int main()
{
init_platform();
unsigned int a;
unsigned int b;
unsigned int c;
unsigned int d;
unsigned int e;
print("Hello World\n\r"); a=2;
b=3; Xil_Out32(ADR_BASE+ADR_REG0,a);
Xil_Out32(ADR_BASE+ADR_REG1,b);
c=Xil_In32(ADR_BASE+ADR_REG2);
d=Xil_In32(ADR_BASE+ADR_REG3);
e=Xil_In32(ADR_BASE+ADR_REG4); printf("and= %d\n" ,c);
printf("or= %d\n" ,d);
printf("not= %d\n" ,e); cleanup_platform();
return 0;
}
这个设计就是通过操作五个缓存寄存器实现自定义IP的功能测试。
图中使用的函数比较好理解,就不详细说明了。
(5)Teminal窗口观测
在windows》terminal就可以选择设置,读取串口数据。注意选择serial terminal,这个模式才是串口模式。其他模式暂时没有接触过,暂时不了解。结果会随着调试显示在对应的位置。
3、实验结果
板级测试的结果符合预期。不过由于前面的自定义IP的二级模块的端口声明没有注意位宽,导致显示的数据只有一位。但是与或非输出都符合预期。
AXI自定义IP之UART调试的更多相关文章
- ZYNQ笔记(7):AXI从口自定义IP封装
使用 AXI_Lite 从口实现寄存器列表的读写,并且自己封装为一个自定义 IP,以便以后使用.本次记录的是 M_AXI_GP0 接口,此接口是 ARM 作为主机,FPGA 作为从机,配置 FPGA ...
- ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果
一.前言 在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能.要想使自定义IP核被CPU访问,就必须带有总线接口.ZYNQ采用AXI BUS实现PS和PL之间 ...
- AXI-Lite总线及其自定义IP核使用分析总结
ZYNQ的优势在于通过高效的接口总线组成了ARM+FPGA的架构.我认为两者是互为底层的,当进行算法验证时,ARM端现有的硬件控制器和库函数可以很方便地连接外设,而不像FPGA设计那样完全写出接口时序 ...
- vivado设计三:一步一步生成自己的自定义IP核
开发环境:xp vivado2013.4 基于AXI-Lite的用户自定义IP核设计 这里以用户自定义led_ip为例: 1.建立工程 和设计一过程一样,见vivado设计一http://blog. ...
- 教你怎样写自定义IP地址算法
通过IP地址可以看到算法规律,写成自定义IP地址,也可以把IP地址转为自定格式的IP地址.也可以用于加密一些明文数字.起始次方可自定义(以1次方和0次方为例) a.以下写正反算法(以1次方为最小单位) ...
- C#自定义ip控件
前言:由于项目中有ip输入,但C#中又没有IP控件,如果直接放4个TextBox感觉又怎么好,还不好控制,于是可以通过自定义控件的方式来解决,就又了下面的自定义ip控件,该控件功能基本完善,如果还有未 ...
- [原创]iFPGA-Cable FT2232H JTAG & UART调试器
iFPGA-Cable FT2232H JTAG & UART调试器 [特性] 采用FT2232H,双通道接口: 支持UART: 支持JTAG,Digilent SMT-1,TCK最大时钟频率 ...
- xilinx AXI相关IP核学习
xilinx AXI相关IP核学习 1.阅读PG044 (1)AXI4‐Stream to Video Out Top‐Level Signaling Interface (2)AXI4‐Stream ...
- Vivado 2017封装自定义IP Core
使用Vivado2017.3自定义IP Core.通常情况下,我们做设计采用模块化设计,对于已经设计好的一部分模块功能,就可以直接拿来调用,IP Core就是这样来的,一般来说我们看不到IP Core ...
- Vivado 调用自定义IP核
关于Vivado如何创建自定义IP核有大量的参考文章,这里就不多加阐述了,本文目的主要是解决如何在新建工程中引用其它工程已经自定义封装好的IP核,从而实现自定义IP核的灵活复用. 举个例子,我们的目标 ...
随机推荐
- python绘图总结
1 二维图像 1.1 二维曲线 plot(x, y, ls="-", lw=1.5, label=None) x, y:横坐标和纵坐标 ls:颜色.点标记.线型列表,如 ls='r ...
- IntersectionObserver对象
IntersectionObserver对象 IntersectionObserver对象,从属于Intersection Observer API,提供了一种异步观察目标元素与其祖先元素或顶级文档视 ...
- 使用spring boot jpa进行增删改查
项目地址:https://gitee.com/indexman/spring_boot_in_action 编写实体类User package com.laoxu.springboot.entity; ...
- django中从你的代码运行管理命令call_command
# 主要用法就是调用django自定义的Command命令 # 语法 django.core.management.call_command(name,*args,**options) - name ...
- 【LeetCode栈与队列#03】删除字符串中所有的相邻重复项
删除字符串中所有的相邻重复项 力扣题目链接(opens new window) 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们. 在 S 上反复执行重复项删除操作 ...
- 一次kafka消息丢失问题处理
背景&现象 生产微服务架构环境,kafka消息消费服务架构如下: 当服务B接口出现宕机或者B接口调用超时,kafka消息消费端服务A出现异常,异常发生后未执行手动提交offset操作.待服务B ...
- Anaconda与Python环境在Windows中的部署
本文介绍在Win10电脑中,安装Anaconda环境与Python语言的方法. 在这里需要注意,本文介绍的方法是在电脑自身原本不含有Python的情况下进行的:如果大家电脑中原本就下载.安装过 ...
- java基础 韩顺平老师的 面向对象(基础) 自己记的部分笔记
194,对象内存布局 基本数据类型放在堆里面,字符串类型放在方法区. 栈:一般存放基本数据类型(局部变量) 堆:存放对象(Cat cat,数组等) 方法区:常量池(常量,比如字符串),类加载信息 19 ...
- 2FA双因素认证 - TOTP详解
主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在2FA双因素认证中,TOTP可谓是标准化程度最高的技术方案.它 ...
- Editor - Goto Location: Multiple Definitions - vscode 多个定义,直接跳转到主定义 不进行选择
Editor - Goto Location: Multiple Definitions - vscode 多个定义,直接跳转到主定义 不进行选择 配置里面 搜 多