弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

时间:2024-04-12 14:04:25

弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

IP核:知识产权核,指某一方提供的、形式为逻辑单元的可重用模块。IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以缩短设计所需要的周期。

上面一段为形式主义的解释,按照我等弟弟级别的FPGA玩家,理解就是可以将一段代码封装起来,功能告知与你,但是代码却可以让你看不见。举个简单例子,板子上的200M时钟不是我想要的,我想要个45M时钟,正好有个老哥写了个代码,只需要输入200M时钟,出来的就是45M时钟,他不想让你看见,就可以将其封装成IP核,你就可以当成模块一样去调用,只是看不见他的源代码。

废话不多说,上干货,本文的目标是封装并调用一个简单的按键控制led灯亮的IP核
软件:vivado2017.4
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
先上一个最终结果图(仿真)
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

1.IP核的封装
首先正常创建一个工程,写一个design source
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

下面是源代码,十分简单的一个代码,由于手上的板子是一个差分时钟,所以这里也写了个差分时钟

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

综合成功后,开始封装
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
点开Tools中有一项Create or Package New IP
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
next
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

next
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

next,下面这里可以完善开发者信息等
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

开始封装,按照下图开始点击
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

封装成功
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

2.调用IP核
新建一个工程,直接准备跑仿真,当然,先把刚才封装的IP核搞出来,点击下图所示
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

点击库管理(Repository)

弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

将我们封装好的IP核添加进库,点击+号,这个project是本人写fpga的文件夹,封装的IP核即在里面

弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

确定完文件夹后,vivado会自动检测所有project里的IP核

弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

点击OK,打开IP Catalog
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

点开key_light_v1_0,这个就是我们刚刚封装的IP核,能看到输入为两个差分时钟,一个reset,一个key,输出为led
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

点击ok后,进行生成IP核(Generate),界面如下
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

下面在仿真中,展示结果
创建top仿真文件并且置顶
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

下面开始写仿真语法(入门级的仿真会在后面教学,适用于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,开始仿真,结果很好
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

这里额外解释一下为什么明明是让led<=key,但是led和key在时域上不同步,学习完数字电路的触发器和锁存器应该知道,这是在时钟的上升沿才可以触发进行某种运算,可以看到在sys_clk_p的上升沿到来时,led<=key实现,并且锁存到下一个上升沿到来。