Vivado 入门 —— HLS HelloWorld 流水灯(二)—— 调用 IP 与上板验证

Vivado 入门 —— HLS HelloWorld 流水灯(二)—— 调用 IP 与上板验证

Vivado 新建项目

这里和使用 Vivado HLS 一样,要注意顶层名称与设置的一致

image

直接下一步,到芯片选择界面,选择的芯片型号为 xc7z020clg400-2:

image

创建成功后界面如下:

image

注意:这里我们需要使用的时 Vivado 而不再是 Vivado HLS 了

下面我们需要在我们的项目目录下新建一个文件夹用于存储 ip 文件

image

然后需要将我们前面已经生成的完整的 IP 文件夹复制到我们的 ip 文件夹中

准备好之后,我们就需要在项目中添加我们自己建立的第三方 ip

image

这里选择我们刚刚创建的文件夹即可,这样就能识别到里面的 IP

image

这样我们就能看到我们的 IP 了

image

双击就能看到我们 IP 的结构图

image

下面我们就需要创建 Verilog 文件来调用我们的 IP

代码设计

生成 IP

创建一个 Verilog 文件,来调用 IP

image

image

image

在调用 IP 之前我们需要先通过 IP 文件生成 IP,这里直接双击 IP,点击 ok 即可

image

image

当弹出创建 IP 的对话框时,我们只需要点击生成即可:

image

当出现如下提示框,就说明我们的 IP 已经生成成功了

image

我们也可以看到 IP 文件

image

代码设计

下面我们就可以开始设计我们的代码文件了,完整代码如下:

HLS_HelloWorld.v:

`timescale 1ns / 1ps

module HLS_HelloWorld(
	input 	wire 			clk 	,
	input 	wire 			rst_n 	,
	output 	wire 			led_o
    );

wire 			rst 			;//同步复位
wire			ap_ready 		;//当前可以接收下一次数据
reg 			ap_start 		;//IP开始工作
reg 			led_i_vld 		;//输入数据有效
wire  			led_o_vld 		;
reg 			led_i 			;//输入的led信号
wire 			led_o_r 		;
wire 			ap_done 		;
wire 			ap_idle 		;
reg  	[1:0] 	delay_cnt 		;

assign rst = ~rst_n ;
assign led_o = led_o_r 	;

//----------------delay_cnt------------------
always @(posedge clk) begin
	if (rst==1'b1) begin
		delay_cnt <= 'd0;
	end
	else if(delay_cnt[1]==1'b0) begin
		delay_cnt <= delay_cnt + 1'b1;
	end
end

//----------------ap_start------------------
always @(posedge clk) begin
	if (rst==1'b1) begin
		ap_start <= 1'b0;
	end
	else if(delay_cnt[1]==1'b1)begin
		ap_start <= 1'b1;
	end
end

//----------------led_i_vld------------------
always @(posedge clk) begin
	if (rst==1'b1) begin
		led_i_vld <= 1'b0;
	end
	else if(delay_cnt[1]==1'b1)begin
		led_i_vld <= 1'b1;
	end
end

//----------------ap_i------------------
always @(posedge clk) begin
	if (rst==1'b1) begin
		led_i <= 1'b0;
	end
	else if(led_o_vld==1'b1)begin
		led_i <= led_o_r ;
	end
end


flash_led_0 inst_flash_led (
  .led_o_V_ap_vld(led_o_vld),  // output wire led_o_V_ap_vld
  .led_i_V_ap_vld(led_i_vld),  // input wire led_i_V_ap_vld
  .ap_clk(clk),                  // input wire ap_clk
  .ap_rst(rst),                  // input wire ap_rst
  .ap_start(ap_start),              // input wire ap_start
  .ap_done(ap_done),                // output wire ap_done
  .ap_idle(ap_idle),                // output wire ap_idle
  .ap_ready(ap_ready),              // output wire ap_ready
  .led_o_V(led_o_r),                // output wire [0 : 0] led_o_V
  .led_i_V(led_i)                // input wire [0 : 0] led_i_V
);

wire 	[15:0] probe0;
assign probe0={
	led_i,
	led_i_vld,
	led_o,
	led_o_vld,
	ap_start,
	ap_ready,
	ap_done
};

ila_0 inst_ila (
	.clk(clk), // input wire clk


	.probe0(probe0) // input wire [15:0] probe0
);

endmodule

由于我们还需要观察内部信号的变化情况,我们就还需要添加一个 ILA

image

image

image

这里我们已经成功的生成了ILA

image

结果验证

绑定引脚约束文件

当我们一切准备就绪,就可以添加约束文件来观察实验结果,约束文件内容如下:

top_pin.xdc

##############LED define################## 
set_property PACKAGE_PIN P15 [get_ports {led_o}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led_o}]

##############Reset define################## 
set_property PACKAGE_PIN P16 [get_ports {rst_n}] 
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]

##############50M CLK define################## 
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports {clk}] 
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]

选择添加约束文件

image

这里我们选择我们的约束文件即可:

image

编译烧录

如果前面全部没有问题,我们就可以直接生成 Bit 文件

image

这一步时间较长,需要耐心等待,当出现如下界面就说明已经生成成功了

image

这里我们选择打开硬件设备管理

image

点击 open target 链接我们的 FPGA 芯片

image

如果 Hardware 中有设备显示就说明我们已经连接成功了

image

然后我们再点击烧录

image

这是我们可以看到如下界面,直接点击烧录

image

这是我们已经将文件下载到了开发板上

image

点击运行我们就可以观察到实验现象

image

实验结果

由于前面我们设置的时钟时 100 MHz,芯片时钟为 50 MHz,所以这里时 2s 灯亮灭一次

结果:

image

触发信号如下

image

到此我们的流水灯就已经完成了

猜你喜欢

转载自blog.csdn.net/m0_59161987/article/details/130664985