弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
IP核:知识产权核,指某一方提供的、形式为逻辑单元的可重用模块。IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以缩短设计所需要的周期。
上面一段为形式主义的解释,按照我等弟弟级别的FPGA玩家,理解就是可以将一段代码封装起来,功能告知与你,但是代码却可以让你看不见。举个简单例子,板子上的200M时钟不是我想要的,我想要个45M时钟,正好有个老哥写了个代码,只需要输入200M时钟,出来的就是45M时钟,他不想让你看见,就可以将其封装成IP核,你就可以当成模块一样去调用,只是看不见他的源代码。
废话不多说,上干货,本文的目标是封装并调用一个简单的按键控制led灯亮的IP核
软件:vivado2017.4
先上一个最终结果图(仿真)
1.IP核的封装
首先正常创建一个工程,写一个design source
下面是源代码,十分简单的一个代码,由于手上的板子是一个差分时钟,所以这里也写了个差分时钟
module key_light(
input sys_clk_p,
input sys_clk_n,
input reset,
input key,
output reg led
);
wire clk;
IBUFDS sys_clk(
.O (clk),
.I (sys_clk_p),
.IB (sys_clk_n)
);
[email protected](posedge clk or negedge reset)
begin
if(!reset)
led<=1'b0;
else
led<=key;
end
endmodule
综合成功后,开始封装
点开Tools中有一项Create or Package New IP
next
next
next,下面这里可以完善开发者信息等
开始封装,按照下图开始点击
封装成功
2.调用IP核
新建一个工程,直接准备跑仿真,当然,先把刚才封装的IP核搞出来,点击下图所示
点击库管理(Repository)
将我们封装好的IP核添加进库,点击+号,这个project是本人写fpga的文件夹,封装的IP核即在里面
确定完文件夹后,vivado会自动检测所有project里的IP核
点击OK,打开IP Catalog
点开key_light_v1_0,这个就是我们刚刚封装的IP核,能看到输入为两个差分时钟,一个reset,一个key,输出为led
点击ok后,进行生成IP核(Generate),界面如下
下面在仿真中,展示结果
创建top仿真文件并且置顶
下面开始写仿真语法(入门级的仿真会在后面教学,适用于FPGA菜鸟)
这里请忽略按键的频率高达100Mhz根本就是违反常规
`timescale 100ps/ 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2018/12/31 17:46:37
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module top;
reg sys_clk_p;
wire sys_clk_n;
reg key;
reg reset;
wire led;
key_light_0 key_light_0(
.sys_clk_p (sys_clk_p),
.sys_clk_n (sys_clk_n),
.key (key),
.reset (reset),
.led (led)
);
initial begin
sys_clk_p=0;
key=0;
reset=0;
#10;
reset=1;
#20000;
end
always #25 sys_clk_p=!sys_clk_p;//200M时钟
always #50 key=!key;//高达100M的按键频率
assign sys_clk_n=!sys_clk_p;
endmodule
ok,开始仿真,结果很好
这里额外解释一下为什么明明是让led<=key,但是led和key在时域上不同步,学习完数字电路的触发器和锁存器应该知道,这是在时钟的上升沿才可以触发进行某种运算,可以看到在sys_clk_p的上升沿到来时,led<=key实现,并且锁存到下一个上升沿到来。