vivado的ip核应该比较常用的设计工具,但有时候官方的ip核设计的比较复杂而我们不需要如此多功能的ip核时,就可以我们自己去设计自己想要的ip核。
一、RTL设计
首先需要你提前设计好自己的模块,包括源文件,以及模块仿真。我的源设计如下
module mid_data(
input clk ,rst_n,
input [7:0] a,b,c,
output reg [7:0] mid_data
);
wire A,B,C;
wire [2:0] state;
assign A=(a>b)?1:0;
assign B=(b>c)?1:0;
assign C=(c>a)?1:0;
assign state={A,B,C};
always@(posedge clk)
if(!rst_n)
begin
mid_data<=8'b0;
end
else case(state)
3'd2,3'd5: begin mid_data<=a; end
3'd1,3'd6: begin mid_data<=b; end
3'd0,3'd3,3'd4: begin mid_data<=c; end
default: begin mid_data<=mid_data; end
endcase
endmodule
实现的是一个数据比较器,主要是在一个周期以内找出3个8bit数的中间数。下面是仿真激励代码
module mid_data_tb;
reg clk,rst_n;
reg [7:0] a,b,c;
wire [7:0] mid_data;
mid_data i0(
.clk(clk),
.rst_n(rst_n),
.a(a),
.b(b),
.c(c),
.mid_data(mid_data)
);
initial
begin
clk=0;
rst_n=0;
a=0;
b=0;
c=0;
#95
rst_n=1;
#100
a=1;
b=15;
c=21;
#100
a=30;
b=10;
c=20;
#100
a=15;
b=12;
c=26;
#100
a=13;
b=13;
c=20;
#100
a=15;
b=14;
c=14;
#100
a=50;
b=50;
c=50;
#100
a=15;
b=12;
c=26;
#200
$stop;
end
always #5 clk=!clk;
endmodule
代码的设计就到处结束,接下来开始ip封装
二、封装IP核
打开tool选择create and packape new ip,点击next,
选择第一个继续点击next
这里需要选择一个文件夹存放你的IP核封装文件,最好是新建一个文件夹,将你的所有自己设计的ip核放在这里,每个ip核单独一个文件,方便以后的工程调用。
创建完了就点击next,然后是ok,最后是finished,接着就会生成一个专门的ip核封装工程和自定义窗口,
在这里打绿色勾勾的地方我们不关注,都是一些基础配置,vivado已经自动配置好了,包括ip核它的库,源文件,适用的芯片系列。需要关注的是下面这个Ports and interfaces这个选项里面的两个黄色的警告。顺便说一句vivado这里可以自动识别匹配我们源文件中的端口。
产生的警告也可以在下面的messages提示里看到 ,其实忽略这两个警告也是可以的,但为了追求完美可以通过下面的方法来解决。
先看第一个警告,[IP_Flow 19-315]bus Interface 'rst n " : Bus parameter POLARITY is ACTIVE_LOW but port ' rst_n is not*resetn - please double check the POLARITY setting
什么意思呢,英语比较差百度翻译直接翻译就是[IP_Flow 19-315]总线接口“rst n”:总线参数极性为ACTIVE_LOW,但端口“rst_n”不是*resetn-请仔细检查极性设置。
再翻译一下就是rst_n这个信号没有检测到用作低电平有效。首先说明我们的源文件设计是没有问题的,但是vivado就是检查出有警告,那么怎么解决呢,有两种方式:
1,更改源文件包括仿真文件中的“rst_n”这个信号的名字为“*resetn”例如全部改成“aresetn”,亲测有效。
2,有的小伙伴有很多的源文件那改起来就很麻烦,需要替换等操作,这里还有一个方法就是点击一下Ports and interfaces这个选项里面的"rst_n"在弹出的窗口中选择parameters,可以看到有个属性是ACTIVE_LOW,对就是这个直接改成ACTIVE_HIGH。警告接解决的,同时这里不会影响源文件的逻辑,后面通过仿真也可以看到是不影响逻辑的。
接下来就是第二个警告,[IP Flow 19-5661] Bus Interface ' clk' does not have any bus interfaces associated with it 。直接翻译就是:总线接口“clk”没有与之关联的任何总线接口。
解决方式也很简单,添加总线接口,同样点击一下Ports and interfaces这个选项里面的"clk"在parameters当中给clk添加属性,选中ASSOXIATED_BUSIF,接着选中间的右移小箭头move
然后就可以看到他出现在了右边的Overridden选项当中,最后在数数值当中写上你的时钟接口“clk”,就可以了。点击ok,然后就可以看到警告都消失了,出现了绿色的勾勾。
最后选中最下面的Review and package选项,点击package IP,点击ok就完成了。
三、IP核调用
接下来打开你自己的最开始的工程,然后点开IP核搜索界面就可以调用了,无论是在基础的源文件例化还是在bd工程中调用都可以。
最后就是简单的测试,生成ip核过后,还需要改一下最开始上面测试激励文件的例化,只需要将mid_data改为mid_data_0即可
然后最后出来的仿真结果没有问题,大功告成!