[X]关闭

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

文档创建者:FPGA课程
浏览次数:359
最后更新:2024-09-07
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
本帖最后由 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后设置默认的分频参数。
修改后的顶层文件
  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课。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则