zoukankan      html  css  js  c++  java
  • Xilinx Vivado的使用详细介绍(3):使用IP核

    ilinx Vivado的使用详细介绍(3):使用IP核

    Author:zhangxianhe

    IP核(IP Core

    Vivado中有很多IP核可以直接使用,例如数学运算(乘法器、除法器、浮点运算器等)、信号处理(FFT、DFT、DDS等)。IP核类似编程中的函数库(例如C语言中的printf()函数),可以直接调用,非常方便,大大加快了开发速度。

    方式一:使用Verilog调用IP

    这里简单举一个乘法器的IP核使用实例,使用Verilog调用。首先新建工程,新建demo.v顶层模块。(过程参考上篇文档)

    添加IP核

    点击Flow Navigator中的IP Catalog。

     

    选择Math Functions下的Multiplier,即乘法器,并双击。

     

    将弹出IP核的参数设置对话框。点击左上角的Documentation,可以打开这个IP核的使用手册查阅。这里直接设置输入信号A和B均为4位无符号型数据,其他均为默认值,点击OK。

     

    稍后弹出的窗口,点击Generate。生成的对话框直接点Ok。

    综合选项中的Global表示只生成RTL代码,然后与整个工程一起参与综合,Out of context per IP表示生成后立即综合。

    调用IP核

    选择IP Sources,展开并选择mult_gen_0 - Instantiation Template - mult_gen_0.veo,可以打开实例化模板文件。如图,这段代码就是使用Verilog调用这个IP核的示例代码。

     

    将示例代码复制到demo.v文件中,并进行修改,最终如下。代码中声明了无符号型的4位变量a和b,分别赋初值7、8,作为乘数使用;无符号型的8位变量p,用于保存计算结果。clk为Testbench编写的周期20ns的时钟信号;mult_gen_0 Mymult_gen_0 (...)语句实例化了mult_gen_0类型的模块对象Mymult_gen_0,并将clk、a、b、p作为参数传入。

     

     1 module demo(
     2 );
     3 reg clk = 0;
     4 always #10 clk = ~clk;
     5 wire [3:0] a = 7;
     6 wire [3:0] b = 8;
     7 wire [7:0] p;
     8 mult_gen_0 Mymult_gen_0 (
     9   .CLK(clk),  // input wire CLK
    10   .A(a),      // input wire [3 : 0] A
    11   .B(b),      // input wire [3 : 0] B
    12   .P(p)      // output wire [7 : 0] P
    13 );
    14 endmodule

    行为仿真验证

    以demo为顶层模块,启动行为仿真,即可输出波形。设置a、b、p显示为无符号十进制(右击选择Radix - Unsigned Decimal)。如图,可以看到a=7, b=8,第一个时钟上升沿后p = a * b = 56。

     

    方式二:框图(Block Design)中调用IP核

    这里举一个简单的例子,通过调用乘法器IP核,产生一个能计算平方的新模块。

    创建框图设计文件

    选择Flow Navigator中的Create Block Design,创建一个框图设计文件。

     

    输入文件名并点击OK。

     添加IP核

    通过启动Add IP 向导来完成,或者可以在程序框图空白处右击选择Add IP..,IP目录窗口将会出现,显示在这个设计中添加所有可能的IP。

    IP核即可被添加进来,可以用导线将其与其他器件连接。

    双击这个IP核符号,可以打开参数设置对话框。点击左上方的Documentation可以查看IP核的手册。这里将输入的A、B均设置为4为无符号型,其他为默认值,点击OK确认。

     

    绘制电路

    右击Diagram窗口空白处,选择Create Port。

    弹出窗口中,设置端口a为4位输入信号,并点击OK。

     

    将a与A、B都连接起来。

     

    同样的方法,添加一个8位输出端口p,与P连接。

     

    再添加一个clk时钟输入端口,与CLK连接。

     

    最终结果如图。

     

    单击Tools,选择单击Validate Design,检查程序框图是否有误,结果直接点击Ok。

    仿真测试

    在源窗格中,选择系统框图“system.bd”,右击并选择Generate Output Products,默认设置,直接点generate,运行结束后,点击OK。


    在源窗格中,选择系统框图“system.bd”,右击并选择Create HDL Wrapper,选择第二项 Let Vivado manage Wrapper and auto-update,选择第一项和第二项的区别是选择第一项表示生成的wrapper允许使用者编辑,选择第二项表示让Vivado管理wrapper,并自动更新,使用者对wrapper的修改会在重新创建的HDL Wrapper覆盖。根据自己设计的情况选择,如果生成的wrapper需要修改则选择第一项。点击OK。

     

    打开生成的system_1_wrapper.v文件如图,红框中的代码用来调用前面画好的Block Design模块。

     

    在system_1_wrapper.v文件中,添加Testbench代码即可进行行为仿真。修改代码如下,给输入信号a赋初值为8,clk连接到Testbench生成的时钟信号c上。

     1 module system_wrapper
     2    (a,
     3     clk,
     4     p);
     5   input [3:0]a=8;
     6   input clk;
     7   output [7:0]p;
     8   wire [3:0]a;
     9   wire clk;
    10   wire [7:0]p;
    11   reg c = 0;
    12   always #10 c <= ~c;
    13   assign clk = c;
    14   system system_i
    15        (.a(a),
    16         .clk(clk),
    17         .p(p));
    18 endmodule

    启动行为仿真,最终输出的波形如下。可以看到,在clk的第一个上升沿后,就有 p = a*a = 64,即实现了平方运算。

     

     

    调用官方其它IP核,方法一致,有什么问题欢迎指导交流。

  • 相关阅读:
    解决spring boot JavaMailSender部分收件人错误导致发送失败的问题
    Linux设备驱动开发基础--内核定时器
    Linux中断分层--工作队列
    Linux中断分层--软中断和tasklet
    深入理解函数线程安全与可重入
    Linux中断处理流程
    Linux混杂设备驱动--按键设备驱动
    Linux字符设备驱动--Led设备驱动
    Linux字符设备简单示例
    Linux内核硬件访问技术
  • 原文地址:https://www.cnblogs.com/zhangxianhe/p/9792609.html
Copyright © 2011-2022 走看看