本章節簡介:
可以在任意時刻啟動,可以重復啟動,延時時長可調,單位可切換(ms/us),在50MHz時鐘下的延時范圍是1ms-85899ms/1us-85899us。
moduledelay //#(parameterN)//可以延時N*1ms/us (inputclk,rst_n, inputstart,//start上升沿有效 inputdelay_unit,//延時單位,high:ms/low:us outputfinish,finish_pose);//finish上升沿有效 regstart_reg0,start_reg1;//start兩級緩存,用于邊沿檢測 regfinish_reg0,finish_reg1;//finish兩級緩存 reg[31:0]cnt;//固定32位寬計數 reg[31:0]cnt_full; regrestart;//重新開始 wirestart_pose,full; always@(posedgeclkornegedgerst_n) begin if(!rst_n) begin cnt<=?32'd0; ???????????????????cnt_full?<=?32'd10;?//避免一開始finish置位 ???????????????????restart?<=?1'b0; ???????????????????start_reg0?<=?1'b0;?start_reg1?<=?1'b0;? ???????????????????finish_reg0?<=?1'b0;?finish_reg1?<=?1'b0; ???????????????end ???????????else ??????????????begin ??????????????????start_reg0?<=?start;?start_reg1?<=?start_reg0; ??????????????????finish_reg1?<=?finish_reg0;?? ??????????????????/**檢測計時單位**/ ??????????????????if(delay_unit)?? ?????????????????????cnt_full?<=?32'd50_000*2-32'd2;??//計時2ms??實際例化時用N代替:?32'd50_000*N-32'd2 ??????????????????else ?????????????????????cnt_full?<=?32'd50*2-32'd2;??????//計時2us ?????????????????/***************/ ????????????????/**是否重新開始**/ ????????????????if(start_pose)??//檢測到起始時刻? ????????????????????restart?<=?1'b1;?? ???????????????/****計時完成****/ ???????????????else?if(full)??//延時結束 ??????????????????begin ??????????????????????cnt?<=?32'd0;??//cnt歸零 ??????????????????????finish_reg0?<=?1'b1;??//finish響應 ??????????????????????restart?<=?1'b0; ??????????????????end ?????????????/***************/ ?????????????/****計時開始****/ ?????????????else?if(restart)? ????????????????begin ????????????????????finish_reg0?<=?1'b0;????//新一輪延時finish復位 ????????????????????cnt?<=?cnt+1'b1; ????????????????end ???????????/***************/ ???????????/**等待新一輪計時**/ ???????????else? ??????????????begin ??????????????????cnt?<=?cnt; ??????????????????finish_reg0?<=?finish_reg0; ??????????????????restart?<=?restart; ??????????????end ????end?? end ? ??assign?start_pose?=?(~start_reg1&start_reg0)?1'b1:1'b0;??//start上升沿檢測 ??assign?finish_pose?=?(~finish_reg1&finish_reg0)?1'b1:1'b0;??//finish上升沿檢測 ??assign?full?=?(cnt_full-cnt==0)?1'b1:1'b0;???//檢測是否計滿 ??assign?finish?=?finish_reg0; endmodule /**************************************************************************************************/?????????????????????????????????????/***************************************modelsim********************************************/?? `timescale?1ns/1ps module?delay_tb(); ???reg?clk,rst_n; ???reg?start; ???wire?finish,finish_pose; ?? ??delay?delay_u0 ??(.clk(clk), ???.rst_n(rst_n), ???.start(start), ???.delay_unit(1'b1), ???.finish(finish), ???.finish_pose(finish_pose)); ???//defparam?delay_u0.N?=?2;?//延時2ms ?? ??initial ????begin clk?=?1'b0; ????????rst_n?=?1'b0; ????????start?=?1'b0; #1000?rst_n?=?1'b1; #4010?start?=?1'b1;?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????#50?????start?=?1'b0;????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????end ??always?#10?clk?=?~clk; endmodule
思路:
start端口給上升沿啟動延時,延時結束端口finish置位(重新啟動延時后復位)、finish的上升沿檢測在模塊內部已做好(端口finish_pose),直接調用即可,端口delay_unit置高選擇ms,置低選擇us,#(參數N )“是計時時長,例如計時8ms:”N = 8, .delay_unit(1'b1)“,實際例化時只需”defparam 例化名.N = 數值”。因為modelsim無法識別這種調用,所以直接用數值代替N進行測試。邊沿檢測會消耗兩個時鐘周期,所以cnt_full需要減2,并且將finish_reg0直接連到finish輸出端口而不是用finish_reg1連接完成。
延時2ms測試的起始時刻(5010ns)和結束時刻(2005010ns):


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
FPGA
+關注
關注
1660文章
22411瀏覽量
636273 -
仿真
+關注
關注
54文章
4483瀏覽量
138257 -
Verilog
+關注
關注
30文章
1374瀏覽量
114523 -
代碼
+關注
關注
30文章
4968瀏覽量
73960
原文標題:FPGA延時 Verilog HDL 實現
文章出處:【微信號:ZYNQ,微信公眾號:ZYNQ】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
如何利用Verilog HDL在FPGA上實現SRAM的讀寫測試
本篇將詳細介紹如何利用Verilog HDL在FPGA上實現SRAM的讀寫測試。SRAM是一種非易失性存儲器,具有高速讀取和寫入的特點。在FPGA
[下載]cpld\fpga\verilog hdl視頻教程
cpld\fpga\verilog hdl視頻教程入門篇:第1講、FPGA設計基礎(PDF、視頻)第2講、FPGA設計入門(視
發表于 03-26 16:37
FPGA雙沿發送之Verilog HDL實現 精選資料推薦
1.1 FPGA雙沿發送之Verilog HDL實現1.1.1 本節目錄1)本節目錄;2)本節引言;3)FPGA簡介;4)
發表于 07-26 06:20
FPGA雙沿采樣之Verilog HDL實現 精選資料分享
1.1 FPGA雙沿采樣之Verilog HDL實現1.1.1 本節目錄1)本節目錄;2)本節引言;3)FPGA簡介;4)
發表于 07-26 07:44
FPGA的編譯之二、Verilog HDL語言的FPGA快速
This manual describes the Verilog portion of Synopsys FPGACompiler II / FPGA Express application
發表于 07-23 10:01
?79次下載
基于Verilog HDL語言的FPGA設計
采用 Verilog HDL 語言在Altera 公司的FPGA 芯片上實現了RISC_CPU 的關鍵部件狀態控制器的設計,以及在與其它各種數字邏輯設計方法的比較下,顯示出使用
發表于 08-21 10:50
?69次下載
Verilog HDL語言在FPGA/CPLD開發中的應用
摘 要:通過設計實例詳細介紹了用Verilog HDL語言開發FPGA/CPLD的方法,并通過與其他各種輸入方式的比較,顯示出使用Verilog H
發表于 06-20 11:51
?2357次閱讀
Verilog HDL與VHDL及FPGA的比較分析
Verilog HDL與VHDL及FPGA的比較分析. Verilog HDL優點:類似C語言,上手容易,靈活。大小寫敏感。在寫激勵和建模方
發表于 01-11 10:45
?1631次閱讀
PLD/FPGA硬件語言設計verilog HDL
在我國使用Verilog HDL的公司比使用VHDL的公司多。從EDA技術的發展上看,已出現用于CPLD/FPGA設計的硬件C語言編譯軟件,雖然還不成熟,應用極少,但它有可能會成為繼VHDL和
發表于 03-12 11:21
?2037次閱讀
Verilog HDL入門教程之Verilog HDL數字系統設計教程
本文檔的主要內容詳細介紹的是Verilog HDL入門教程之Verilog HDL數字系統設計教程。
發表于 09-20 15:51
?86次下載
數字設計FPGA應用:Verilog HDL語言基本結構
本課程以目前流行的Xilinx 7系列FPGA的開發為主線,全面講解FPGA的原理及電路設計、Verilog HDL語言及VIVADO的應用,并循序漸進地從組合邏輯、時序邏輯的開發開始
FPGA延時Verilog HDL實現
評論