广告

原创 Vivado嵌入式系统设计(3)——创建和添加定制IP

2017-9-28 09:29 1116 0 分类: FPGA/CPLD


  通过使用IP 封装器,创建并添加一个定制的外设到一个已经存在的处理器系统。主要步骤:创建定制IP模板,修改定制IP设计模板、使用IP封装器封装外设,添加IP到设计,添加BRAM。


(一)创建定制IP模板

  下面通过vivado 提供的axi_lite 接口,从外设模板和定制IP 源代码中创建一个满足设计要求的定制IP

  (1)在 Vivado开始界面中,单击 Manage IP,出现浮动菜单。执行命令 New IP Location,弹出对话框,单击 Next,弹出一个对话框,按下面的参数设置。


   点击Finish 按钮,会打开vivado集成开发环境的主界面。执行Tools ,Create and Package IP,弹出一个对话框,点击Next按钮,在弹出的对话框中,选中 Create new AXI4 peripheral 前面的复选框。



点击 Next,弹出的对话框按如下配置



点击 Next ,弹出的对话框按如下参数配置


  单击 Next 按钮,弹出Create and Package New IP-Create Peripheral 对话框。在该对话框中,选中Edit IP 前面的复选框。单击 Finish


(二)修改定制的IP模板

   在修改定制IP设计模板前,查看所生成的设计模板文件。在Sources标签窗口,展开Design Sources 选项,顶层文件为led_ip_v1_0.v ,该文件实现AXI接口逻辑,以及对前面指定个数寄存器的读/写操作,这个模板是创建用户定制IP的基础。

  下面将在顶层设计模板中添加参数化的输出端口,并且在子模板块中AXI 所写的数据将连接到外部LED端口。

(1)打开led_ip_v1_0.v 文件。在第8行添加如下代码



第20行添加如下代码,


第50行添加如下代码


第55行添加如下代码


(2)打开led_ip_v1_0_S00_AXI.v 文件

分别在第7行和18行添加LED参数和端口定义


在393行添加下面的代码,用于例化逻辑,该逻辑用于LED_IP


(3)在工程中添加一个lab3_user_logic.v 文件,代码如下

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2017/09/27 16:45:01
// Design Name:
// Module Name: lab3_user_logic
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////


module lab3_user_logic(
input S_AXI_ACLK,
input slv_reg_wren,
input [2:0] axi_awaddr,
input [31:0] S_AXI_WDATA,
input S_AXI_ARESETN,
output reg [7:0] LED
);

always @(posedge S_AXI_ACLK)begin
if(S_AXI_ARESETN == 1'b0)
LED <= 8'b0;
else
if(slv_reg_wren && (axi_awaddr==3'h0))
LED<=S_AXI_WDATA[7:0];

end    

endmodule


(3)点击 Run Synthesis

目的在于对IP进行封装前的检查设计的正确性,必要的时候需要执行功能仿真,对逻辑功能的正确性进行验证。


(三)使用IP封装器封装外设

(1)vivado主界面左侧的Flow Navigator窗口下,单击Package IP选项,弹出Package IP-led_ip 对话框。


单击左侧的Compatibility,可以选择该IP支持的元器件


  单击 File Groups,在右侧窗口单击Merge changes from File Groups Wizard 。该步骤用于对IP所进行的修改,以及添加的lab3_user_logic.v文件。


单击Customization Parameters。如果出现Merge changes from Customization Parameters 提示,进行导入参数操作。



  单击Ports and Interfaces 。如果出现Merge changes from Ports and Interfaces,单击该提示,进行导入端口和接口的操作。

单击Review and Package,在右侧窗口内,单击Re-Package IP 按钮。


(四)修改设置

  新建一个名为lab3的目录,并且将上篇文章的工程的所有文件复制到lab3目录下,打开工程。

  在vivado主界面的Flow Navigator 窗口下,选择展开Project Manager 选项。在展开项中,选择并单击Project Setting 选项。单击左侧的IP块图。在右侧窗口内,单击Repository Manager 标签。单击Add Repository 按钮,定位到前面定制IP的路径。



(2)添加定制 IP 到路径

  下面将添加led_ip,并且连接到系统的AXI4 Lite 接口,同时,将进行内部和外部端口的连接,以及建立LED端口作为外部FPGA的引脚。

  在viavdo主界面左侧的Flow Navigator窗口下,单击Open Block Design;或者在源文件窗口中选择并单击system.bd文件,打开IP集成器。在Diagram 窗口左侧的一列工具栏中,单击添加IP按钮,在搜索框中输入led。双击led_ip_v1_0 ,将其添加到设计中。


Diagram 窗口中,选中 led_ip_0块符号,然后在Block Properties 窗口内将其名字改为led_ip


同时可以看到led_ip属性窗口内属性参数的设置。注意到可以修改LED_WIDTH的值。

点击Diagram窗口上方的Run Connection Automation,点击OK.



选择 led_ip 模块的LED[7:0]端口,单击鼠标右键,出现浮动菜单,执行命令Make External


选择 Address Editor标签,可以看到系统已经为LED_IP分配了地址空间。



  在Vivado主界面的主菜单下,执行菜单命令ToolsValidate Design,运行设计规则检查。



  在源文件窗口,选中system.bd文件,单击鼠标右键,出现浮动菜单,在浮动菜单内执行Create HDL Wrapper,更新HDL文件。在弹出的对话框中,选中let vivado manage wrapper and auto-update 前面的复选框。单击OK


(四)添加BRAM

  选择并打开system.bd,在右侧的Diagram 窗口中选择并单击添加IP核按钮。弹出 IP catalog对话框,在搜索框中输入 BRAM。找到并双击 AXI BRAM Controller,添加一个例化到设计中。单击Diagram 上面的Run Connection Automation。弹出一个对话框,选中前面的S_AXI前面的复选框。单击OK按钮。

  双击图中的axi_bram_ctrl_0块图标,将BRAM Options标签栏下的Number of BRAM interfaces 的值改为1,单击OK按钮。使用AXI4协议而不用AXI4 Lite,这样BRAM能提供更高带宽,控制器能支持猝发交易。



单击Diagram 顶层的Run Connection Automation。然后刷新原理图



  在源文件窗口,右键单击system.bd 文件,出现浮动菜单,执行Create HDL wrapper,在弹出的对话框选择Let Vivado manage wrapper and auto-update 前面的复选框,单击OK。按F6,验证设计的正确性。


综合后,为LED分配管脚(参考zebboard硬件图)


选中system.bd,单击鼠标右键,出现浮动菜单,执行Generate Output Products,弹出对话框,单击Generate按钮。最后生成比特流。




广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1  ...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.    ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产...
我要评论
0
0
广告
关闭 热点推荐上一条 /2 下一条