问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 3130 人浏览分享

开启左侧

[米联客-XILINX-H3_CZ08_7100] FPGA基础篇连载-34 VIVADO自定义IP简单封装

[复制链接]
3130 0
AMD-FPGA课程
AMD课程: 01-教程内容导读 »
​软件版本: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后设置默认的分频参数。
修改后的顶层文件
  1. `timescale 1ns / 1ns //仿真时钟刻度和精度
  2. module ui_uart#
  3. (
  4. parameter  integer   BAUD_BSP  = 115200,  //波特率
  5. parameter  integer   SYSCLK_HZ = 100_000_000  //系统时钟
  6. )
  7. (
  8. input  I_sysclk,//系统时钟输入
  9. input  I_uart_rx,//uart rx接收信号
  10. output O_uart_tx //uart tx发送信号
  11. );
  12. reg [11:0] rstn_cnt = 0;//上电后延迟复位
  13. wire uart_rstn_i;//内部复位信号
  14. wire uart_wreq,uart_rvalid;
  15. wire [7:0]uart_wdata,uart_rdata;
  16. assign uart_wreq  = uart_rvalid;//用uart rx接收数据有效的uart_rvalid信号,控制uart发送模块的发送请求
  17. assign uart_wdata = uart_rdata; //接收的数据给发送模块发送
  18. assign uart_rstn_i = rstn_cnt[11];//延迟复位设计,用计数器的高bit控制复位
  19. //同步计数器实现复位
  20. always @(posedge I_sysclk)begin
  21.     if(rstn_cnt[11] == 1'b0)
  22.         rstn_cnt <= rstn_cnt + 1'b1;
  23.     else
  24.         rstn_cnt <= rstn_cnt;
  25. end
  26. //例化uart 发送模块
  27. uiuart_tx#
  28. (
  29. .BAUD_DIV(SYSCLK_HZ/BAUD_BSP -1)
  30. )
  31. uart_tx_u
  32. (
  33. .I_clk(I_sysclk),//系统时钟输入
  34. .I_uart_rstn(uart_rstn_i), //系统复位
  35. .I_uart_wreq(uart_wreq), //uart发送驱动的写请求信号,高电平有效
  36. .I_uart_wdata(uart_wdata), //uart发送驱动的写数据
  37. .O_uart_wbusy(),//uart 发送驱动的忙标志
  38. .O_uart_tx(O_uart_tx)//uart 串行数据发送
  39. );
  40. //例化uart 接收
  41. uiuart_rx#
  42. (
  43. .BAUD_DIV(SYSCLK_HZ/BAUD_BSP -1)
  44. )
  45. uiuart_rx_u
  46. (
  47. .I_clk(I_sysclk), //系统时钟输入
  48. .I_uart_rstn(uart_rstn_i),//系统复位
  49. .I_uart_rx(I_uart_rx), //uart 串行数据接收
  50. .O_uart_rdata(uart_rdata), //uart 接收数据
  51. .O_uart_rvalid(uart_rvalid)//uart 接收数据有效,当uart_rvalid_o =1'b1 uart_rdata_o输出的数据有效
  52. );
  53.    
  54. endmodule
复制代码

4封装图形化IP
首先新建一个FPGA工程把源文件添加进去
5a1bab400f884b20a43b472d75b92c94.jpg ​
单击菜单Tools->选择Create and Package New IP
af2f81321976485998f1d1bf041c2ea1.jpg ​

da32aafc9961487eab74a1081ef42383.jpg ​

55518b4c34f64e65823ba84626242ab1.jpg ​
3eed712ad0e64450a956676f1fd15ab5.jpg ​

b31bfcf6ec424051b528ab9f718a65d9.jpg ​
Identification页面主要设置一些描述信息,其中最关键的是IP的名字设置
d402f83bb5a94f36a3a954dac6ab3b0e.jpg ​
Compatibility页面设置该IP 支持的芯片型号
293ebb30761f4f9abfd6a2313144b1cb.jpg ​
File Groups设置文件路径
875fb9ac952a48b79f62bbfa7bd0191a.jpg ​
Customization Parameters 页面设置用户参数,这就是顶层文件中的参数
31ab93cad87a478da4a5508b98e42002.jpg ​
a4050aba19414a7da2f33605849c221b.jpg ​

双击参数可以进行修改,我们这里定义的parameter integer默认就是long整形,其他包包括:
float浮点类型
bool 布尔类型 FALSE  0 或 TRUE  1
bitString 类型 通常用二进制或者16进制表示
Default Value设置默认值
string 字符串
dc0a9a402e214024aaa499f0780b0132.jpg ​
Ports and Interfaces信号接口
7685dd0b45c249e4ad651ec9ee995da2.jpg ​
Customization GUI,最终IP以图形化呈现的形式
7ccc91cb06674d6a8e49c61a909a9e9c.jpg ​

Review and Package重新产生IP
44b9859fcb794bdca962d0390a477f21.jpg ​
封装的参数会保存到这个文件
12be21c7a2244673bfd3fe1592dd96a5.jpg ​
检查IP路径的文件夹
5c43b5903e2a4fc08c0a8ecb5af517b6.jpg ​
5IP的调用
新创建一个空的工程
a121a8ceddb6478c998553101c2d43d4.jpg ​
设置IP的路径
d36323d54ca44066baee4c10227b6cbf.jpg ​

打开IP Catalog,可以看到IP已经添加成功
58fbf482fddd4a89b5479f267e66dbce.jpg ​
可以看到出现了我们自定义的IP,双击这个IP就可以添加进入我们当前的FPGA工程了,后面的使用就可以和普通的IP一样使用了,后期如果我们要修改这个参数双击Ip修改就可以。
7ee7545b7ebf4d45a88bb83b360f8fa5.jpg ​
双击IP就可以添加到当前的工程中
aac4e0943fc44f70ac3cf890584a04e0.jpg ​
364f5a1d16d1443786e86880b9d53fb8.jpg ​
后面的使用就和标准IP一样的了。
902fd3fbc743433f9330af1ef0acb438.jpg ​
创建一个顶层文件,调用IP实现UART环路测试
uart_top.v
  1. `timescale 1ns / 1ns//仿真时间刻度、精度
  2. module uart_top
  3. (
  4. input  I_sysclk_p,
  5. input  I_sysclk_n,//系统时钟输入
  6. input  I_uart_rx,// uart 串行接收总线输入信号
  7. output O_uart_tx//  uart 串行接收总线发送信号
  8. );
  9. wire I_clk;
  10. IBUFGDS CLK_U(
  11. .I(I_sysclk_p),
  12. .IB(I_sysclk_n),
  13. .O(I_clk)
  14. );
  15. //例化uart 收发模块   
  16. ui_uart_0 uiuart_inst (
  17.   .I_sysclk(I_clk),     //系统时钟输入
  18.   .I_uart_rx(I_uart_rx),   // uart 串行接收总线输入信号
  19.   .O_uart_tx(O_uart_tx)    //  uart 串行接收总线发送信号
  20. );
  21.    
  22. endmodule
复制代码

6测试结果
测试结果和前面的文章测试结果一致,参照第12课。
​
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

303

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版