軟件的定時中斷很難控制精准觸發沿的位置,可以通過 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
①打開 Vivado,新建工程,然后選擇菜單欄 Tools --- Create and Package New IP...
②Vivado 打開了一個新的界面,類似於原界面,但是多了一個選項
這時如果 Verilog 有語法錯誤,Source處會顯示紅色波浪線。也可以在此新界面修改代碼,修改后保存,頁面顯示成編輯圖標,必須點擊更新才行。
③默認情況下,復位是低有效,我們可以手動改成高有效
④選擇 Review and Package 可以看到 Package IP ,點擊它即可完成 IP 的封裝
⑤此頁面自動關閉,回到原頁面,可以在 Settings --- IP --- Repository 中可以看到這個自定義 IP,此頁面也可以手動添加第三方 IP
⑥生成 bit 文件並以此加載 SDK。
二、ZYNQ硬中斷的使用
1.進入到 Create Block Design 中,輸入 genintr3ms05ms 即可添加該自定義 IP
2.添加 ZYNQ,復位選上,時鍾頻率設置為 200Mhz,同時記得勾選中斷
3.連線,兩個中斷,但只有一個接口,我們借用一個 Concat IP 即可
4.連線可以直接點擊上方 Run 自動布線,會多出一個 Processor System Reset模塊,中斷復位是高有效,而ZYNQ復位是低有效,此模塊會協調好。而手動布線則可能出錯。
5.如果布線時發現自定義 IP 需要修改,可以選中該 IP,右鍵進入修改
之后就可以進入到SDK進行中斷代碼編寫了,和普通PL中斷是類似的。
參考資料:
[1]V3學院FPGA教程