ZYNQ笔记(6):PL精准定时中断

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

一、PL 侧定时中断

1.实际要求

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

2.Verilog中断代码

 1 //**************************************************************************
 2 // *** 名称 : genintr3ms05ms.v
 3 // *** 作者 : xianyu_FPGA
 4 // *** 博客 :https://www.cnblogs.com/xianyufpga/
 5 // *** 日期 :2019-08-10
 6 // *** 描述 : 3ms和0.5ms精准延时
 7 //**************************************************************************
 8 
 9 
10 module genintr3ms05ms
11 //==================<端口>==================================================
12 (
13 //input -----------------------------------------
14 input  wire                 clk                 , //时钟,200Mhz
15 input  wire                 rst                 , //复位,高电平有效
16 //output ----------------------------------------
17 output reg                  intr3ms             , //3ms中断
18 output reg                  intr05ms              //0.5ms中断
19 );
20 //==================<参数>==================================================
21 parameter CNT3MS_END        = 600000            ;
22 parameter CNT05MS_END       = 100000            ;
23 parameter PULSEW            = 200               ; //中断高电平维持时间
24 //==================<信号>==================================================
25 reg  [23:0]                 cnt3ms              ;
26 wire                        add_cnt3ms          ;
27 wire                        end_cnt3ms          ;
28 reg  [23:0]                 cnt05ms             ;
29 wire                        add_cnt05ms         ;
30 wire                        end_cnt05ms         ;
31 
32 //==========================================================================
33 //==    0.5ms延时
34 //==========================================================================
35 always @(posedge clk) begin
36     if(rst)
37         cnt3ms <= 0;
38     else if(add_cnt3ms) begin
39         if(end_cnt3ms)
40             cnt3ms <= 0;
41         else
42             cnt3ms <= cnt3ms + 1;
43     end
44 end
45 
46 assign add_cnt3ms = 1;
47 assign end_cnt3ms = add_cnt3ms && cnt3ms== CNT3MS_END-1;
48 
49 always @(posedge clk) begin
50     if(rst) begin
51         intr3ms <= 0;
52     end
53     else if(end_cnt3ms) begin
54         intr3ms <= 1;
55     end
56     else if(add_cnt3ms && cnt3ms==PULSEW-1) begin
57         intr3ms <= 0;
58     end
59 end
60 
61 //==========================================================================
62 //==    3ms延时
63 //==========================================================================
64 always @(posedge clk) begin
65     if(rst)
66         cnt05ms <= 0;
67     else if(add_cnt05ms) begin
68         if(end_cnt05ms)
69             cnt05ms <= 0;
70         else
71             cnt05ms <= cnt05ms + 1;
72     end
73 end
74 
75 assign add_cnt05ms = 1;
76 assign end_cnt05ms = add_cnt05ms && cnt05ms== CNT05MS_END-1;
77 
78 always @(posedge clk) begin
79     if(rst) begin
80         intr05ms <= 0;
81     end
82     else if(end_cnt05ms) begin
83         intr05ms <= 1;
84     end
85     else if(add_cnt05ms && cnt05ms==PULSEW-1) begin
86         intr05ms <= 0;
87     end
88 end
89 
90 
91 
92 endmodule

3.PL中断封装成私有IP

...

二、ZYNQ硬中断的使用

...

猜你喜欢

转载自www.cnblogs.com/xianyufpga/p/11442211.html