本帖最后由 FPGA课程 于 2024-9-7 14:38 编辑
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
1概述XILINX作为FPGA全球老大,不仅仅是硬件技术实力,而且EDA软件也是非常优秀,XILINX VIVADO是业内最先进的开发工具。从VIVADO开始,支持通过图形化编程FPGA,极大提高了开发效率,图形化开发方法减少了低端接口输入输出错误。 但是,为了方便图形化设计,VIVAOD需要用户编写的代码封装成图形化的IP。当然封装后的IP也可以和原来一样方便的调用。本文以实现串口IP封装为例,介绍VIVADO IP图形化封装的方法,以及调用方法。 本文的目前以简单的UART IP封装为例,简单介绍图形化IP的封装方法,一些复杂接口IP封装方法,比如uifdma_dbuf IP的封装我们后续特色课程中再单独提供。 2硬件电路分析硬件接口和子卡模块请阅读“附录 1” 配套工程的 FPGA PIN 脚定义路径为 soc_prj/uisrc/04_pin/ fpga_pin.xdc。 3准备源码我们把之前编写的uart串口的程序需要稍作修改,把波特率分频参数放到端口中,这样可以方便我们双击IP后设置默认的分频参数。 修改后的顶层文件 - `timescale 1ns / 1ns //仿真时钟刻度和精度
- module ui_uart#
- (
- parameter integer BAUD_BSP = 115200, //波特率
- parameter integer SYSCLK_HZ = 100_000_000 //系统时钟
- )
- (
- input I_sysclk,//系统时钟输入
- input I_uart_rx,//uart rx接收信号
- output O_uart_tx //uart tx发送信号
- );
- reg [11:0] rstn_cnt = 0;//上电后延迟复位
- wire uart_rstn_i;//内部复位信号
- wire uart_wreq,uart_rvalid;
- wire [7:0]uart_wdata,uart_rdata;
- assign uart_wreq = uart_rvalid;//用uart rx接收数据有效的uart_rvalid信号,控制uart发送模块的发送请求
- assign uart_wdata = uart_rdata; //接收的数据给发送模块发送
- assign uart_rstn_i = rstn_cnt[11];//延迟复位设计,用计数器的高bit控制复位
- //同步计数器实现复位
- always @(posedge I_sysclk)begin
- if(rstn_cnt[11] == 1'b0)
- rstn_cnt <= rstn_cnt + 1'b1;
- else
- rstn_cnt <= rstn_cnt;
- end
- //例化uart 发送模块
- uiuart_tx#
- (
- .BAUD_DIV(SYSCLK_HZ/BAUD_BSP -1)
- )
- uart_tx_u
- (
- .I_clk(I_sysclk),//系统时钟输入
- .I_uart_rstn(uart_rstn_i), //系统复位
- .I_uart_wreq(uart_wreq), //uart发送驱动的写请求信号,高电平有效
- .I_uart_wdata(uart_wdata), //uart发送驱动的写数据
- .O_uart_wbusy(),//uart 发送驱动的忙标志
- .O_uart_tx(O_uart_tx)//uart 串行数据发送
- );
- //例化uart 接收
- uiuart_rx#
- (
- .BAUD_DIV(SYSCLK_HZ/BAUD_BSP -1)
- )
- uiuart_rx_u
- (
- .I_clk(I_sysclk), //系统时钟输入
- .I_uart_rstn(uart_rstn_i),//系统复位
- .I_uart_rx(I_uart_rx), //uart 串行数据接收
- .O_uart_rdata(uart_rdata), //uart 接收数据
- .O_uart_rvalid(uart_rvalid)//uart 接收数据有效,当uart_rvalid_o =1'b1 uart_rdata_o输出的数据有效
- );
-
- endmodule
复制代码
4封装图形化IP首先新建一个FPGA工程把源文件添加进去
单击菜单Tools->选择Create and Package New IP
Identification页面主要设置一些描述信息,其中最关键的是IP的名字设置
Compatibility页面设置该IP 支持的芯片型号
File Groups设置文件路径
Customization Parameters 页面设置用户参数,这就是顶层文件中的参数
双击参数可以进行修改,我们这里定义的parameter integer默认就是long整形,其他包包括: float浮点类型 bool 布尔类型 FALSE 0 或 TRUE 1 bitString 类型 通常用二进制或者16进制表示 Default Value设置默认值 string 字符串
Ports and Interfaces信号接口
Customization GUI,最终IP以图形化呈现的形式
Review and Package重新产生IP
封装的参数会保存到这个文件
检查IP路径的文件夹
5IP的调用新创建一个空的工程
设置IP的路径
打开IP Catalog,可以看到IP已经添加成功
可以看到出现了我们自定义的IP,双击这个IP就可以添加进入我们当前的FPGA工程了,后面的使用就可以和普通的IP一样使用了,后期如果我们要修改这个参数双击Ip修改就可以。
双击IP就可以添加到当前的工程中
后面的使用就和标准IP一样的了。
创建一个顶层文件,调用IP实现UART环路测试 uart_top.v - `timescale 1ns / 1ns//仿真时间刻度、精度
- module uart_top
- (
- input I_sysclk_p,
- input I_sysclk_n,//系统时钟输入
- input I_uart_rx,// uart 串行接收总线输入信号
- output O_uart_tx// uart 串行接收总线发送信号
- );
- wire I_clk;
- IBUFGDS CLK_U(
- .I(I_sysclk_p),
- .IB(I_sysclk_n),
- .O(I_clk)
- );
- //例化uart 收发模块
- ui_uart_0 uiuart_inst (
- .I_sysclk(I_clk), //系统时钟输入
- .I_uart_rx(I_uart_rx), // uart 串行接收总线输入信号
- .O_uart_tx(O_uart_tx) // uart 串行接收总线发送信号
- );
-
- endmodule
复制代码
6测试结果测试结果和前面的文章测试结果一致,参照第12课。
|