生成IP核(使用自己的HDL代码)

在FPGA 设计中,有时会用到以前编写过的设计代码。通常比较好的做法就是把这些类似的可以复用的模块,独立定做成一个IP块以备以后需求。设计过程如下:

第一步:先像通常建立工程设计一样,先编写一个模块,如下以点亮led为例(万事点灯起),代码如下(为一个分频1000hz程序,输出看了led显示):

module led(
           input clk,
		   input key,
		   output reg clk_div
    );
reg [4:0] cnt1;
reg [15:0] cnt2;
reg [9:0] cnt3;
reg clk_div1;
reg clk_div2;
reg clk_div3;

initial
begin
  cnt1 = 5'd0;
  cnt2 = 16'd0;
  cnt3 = 10'd0;
  clk_div1 = 0;
  clk_div2 = 0;
  clk_div3 = 0;
end

always @(posedge clk)   //200MHz分频到10MHz
begin
   if(cnt1 == 9)
	begin
	   clk_div1 <= ~clk_div1;
		cnt1 <= 5'd0;
	end
	else
	   cnt1 <= cnt1 + 1;
end 
always @(posedge clk_div1)  //10MHz分频到1000Hz
begin
   if(cnt2 == 4999)
	begin
	   clk_div2 <= ~clk_div2;
		cnt2 <= 16'd0;
	end
	else
	   cnt2 <= cnt2 + 1;
end

always @(posedge clk_div2)
begin
   if(key)
	  clk_div <= 1;
	else
	  clk_div <= 0;
end


endmodule

设置综合选项,综合过程中不能加入IO buf(考虑到与外部模块接口问题)。在综合设置中,-iobuf不勾选,-iob选NO,如下图所示

生成IP核(使用自己的HDL代码)_第1张图片

第二步:制作一个blockbox模块(就是一个IP核的wrapper封装设计),Wrapper程序如下:

module led(
       input clk,
	   input key,
       output reg clk_div
    );

endmodule    //只声明端口

 

第三步,使用此IP,需要将第二部的blackbox以v文件形式加入工程,调用这个模块,再把led.ngc文件加入工程文件夹下即可

module top(
    input clk,
	input key,
	output valid,
	output led
    );

assign valid = (led = 1'b1) ? 1:1'b0;

led U1   //调用led IP核
(
    .clk(clk),
	.key(key),
	.clk_div(led)
);
endmodule

项目工程文件 ,注:一定要将led的Wrapper程序添加至工程中

生成IP核(使用自己的HDL代码)_第2张图片

 综合成功

生成IP核(使用自己的HDL代码)_第3张图片

至此,可以将自己的HDL代码生成IP核,避免在需要用到重复代码时重复编写或者添加。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(FPGA)