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 CLK10 .A(a), // input wire [3 : 0] A11 .B(b), // input wire [3 : 0] B12 .P(p) // output wire [7 : 0] P13 );
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_i15 (.a(a),16 .clk(clk),17 .p(p));18 endmodule
启动⾏为仿真,最终输出的波形如下。可以看到,在clk的第⼀个上升沿后,就有 p = a*a = 64,即实现了平⽅运算。
调⽤官⽅其它IP核,⽅法⼀致,有什么问题欢迎指导交流。
因篇幅问题不能全部显示,请点此查看更多更全内容