ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

时间:2023-03-09 17:01:11
ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

  软件的定时中断很难控制精准触发沿的位置,可以通过 PL-PS 的中断完成精准的定时中断。PL 的中断通过 Verilog 代码产生,这样紧密结合 PS-PL 的处理,发挥各自的优势。

一、PL 侧定时中断

1.实际要求

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

① 上升沿中断;
② 高电平宽度不小于1us;
③ 中断计数器的时钟为 200Mhz;
④ 有两个中断: 3ms 和 .5ms

2.Verilog中断代码

 //**************************************************************************
// *** 名称 : genintr3ms05ms.v
// *** 作者 : xianyu_FPGA
// *** 博客 :https://www.cnblogs.com/xianyufpga/
// *** 日期 :2019-08-10
// *** 描述 : 3ms和0.5ms精准延时
//************************************************************************** module genintr3ms05ms
//==================<端口>==================================================
(
//input -----------------------------------------
input wire clk , //时钟,200Mhz
input wire rst , //复位,高电平有效
//output ----------------------------------------
output reg intr3ms , //3ms中断
output reg intr05ms //0.5ms中断
);
//==================<参数>==================================================
parameter CNT3MS_END = ;
parameter CNT05MS_END = ;
parameter PULSEW = ; //中断高电平维持时间
//==================<信号>==================================================
reg [:] cnt3ms ;
wire add_cnt3ms ;
wire end_cnt3ms ;
reg [:] cnt05ms ;
wire add_cnt05ms ;
wire end_cnt05ms ; //==========================================================================
//== 0.5ms延时
//==========================================================================
always @(posedge clk) begin
if(rst)
cnt3ms <= ;
else if(add_cnt3ms) begin
if(end_cnt3ms)
cnt3ms <= ;
else
cnt3ms <= cnt3ms + ;
end
end assign add_cnt3ms = ;
assign end_cnt3ms = add_cnt3ms && cnt3ms== CNT3MS_END-; always @(posedge clk) begin
if(rst) begin
intr3ms <= ;
end
else if(end_cnt3ms) begin
intr3ms <= ;
end
else if(add_cnt3ms && cnt3ms==PULSEW-) begin
intr3ms <= ;
end
end //==========================================================================
//== 3ms延时
//==========================================================================
always @(posedge clk) begin
if(rst)
cnt05ms <= ;
else if(add_cnt05ms) begin
if(end_cnt05ms)
cnt05ms <= ;
else
cnt05ms <= cnt05ms + ;
end
end assign add_cnt05ms = ;
assign end_cnt05ms = add_cnt05ms && cnt05ms== CNT05MS_END-; always @(posedge clk) begin
if(rst) begin
intr05ms <= ;
end
else if(end_cnt05ms) begin
intr05ms <= ;
end
else if(add_cnt05ms && cnt05ms==PULSEW-) begin
intr05ms <= ;
end
end endmodule

3.PL中断封装成私有IP

①打开 Vivado,新建工程,然后选择菜单栏 Tools --- Create and Package New IP...

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

②Vivado 打开了一个新的界面,类似于原界面,但是多了一个选项

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

这时如果 Verilog 有语法错误,Source处会显示红色波浪线。也可以在此新界面修改代码,修改后保存,页面显示成编辑图标,必须点击更新才行。

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

③默认情况下,复位是低有效,我们可以手动改成高有效

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

④选择 Review and Package 可以看到 Package IP ,点击它即可完成 IP 的封装

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

⑤此页面自动关闭,回到原页面,可以在 Settings --- IP --- Repository 中可以看到这个自定义 IP,此页面也可以手动添加第三方 IP

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

⑥生成 bit 文件并以此加载 SDK。

二、ZYNQ硬中断的使用

1.进入到 Create Block Design 中,输入 genintr3ms05ms 即可添加该自定义 IP

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

2.添加 ZYNQ,复位选上,时钟频率设置为 200Mhz,同时记得勾选中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

3.连线,两个中断,但只有一个接口,我们借用一个 Concat IP 即可

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

4.连线可以直接点击上方 Run 自动布线,会多出一个 Processor System Reset模块,中断复位是高有效,而ZYNQ复位是低有效,此模块会协调好。而手动布线则可能出错。

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

5.如果布线时发现自定义 IP 需要修改,可以选中该 IP,右键进入修改

ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

  之后就可以进入到SDK进行中断代码编写了,和普通PL中断是类似的。

参考资料:

    [1]V3学院FPGA教程