基于FPGA的單脈沖發生器_第1頁
基于FPGA的單脈沖發生器_第2頁
基于FPGA的單脈沖發生器_第3頁
基于FPGA的單脈沖發生器_第4頁
基于FPGA的單脈沖發生器_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一、設計報告:1.技術規范:在clr的控制下置入脈寬data,在輸入按鍵key的控制下,產生單次的脈沖pulse,脈沖的寬度由data 8位的輸入數據控制(以下稱之為脈寬參數)。clk_50M為系統的時鐘。2.總體設計方案:系統功能描述:(1)分頻模塊:輸入為總的時鐘50M,經過分頻以后變為100HZ。(2)延時模塊:當clk為高電平且在復位脈沖clr有效時置入延時脈寬,延時5個始終周期后輸出一個高電平load 。(3)計數模塊:脈寬參數端data接受8位的數據,經數據預置端clr裝載脈寬參數,在計數允許端有效后便開始計數。該計數器設計成為減法計數的模式,當其計數到0時,輸出端pulse由高電

2、平變為低電平。便可得到單脈沖的輸出。系統功能描述時序關系:可編程單脈沖發生器的操作過程是:(1) 預置脈寬參數。(2) 按下復位鍵,初始化系統。(3) 按下啟動鍵,發出單脈沖。以上三步可用三個按鍵來完成。但是,由于目標板已確定,故考慮在復位鍵按下后,經過延時自動產生預置脈寬參數的動作。輸出的信號加到燈上,輸如的脈寬有開發版上的撥碼開關決定,當輸入脈寬后,按下復位鍵置入脈寬,然后按下啟動鍵,發出單脈沖,延時一段時間后燈開始亮,亮一段時間后燈熄滅。延時模塊的時序圖如下:clk clr load 3.流程圖的設計:根據時序關系,可以做出圖所示的流程圖。在系統復位后,經一定的延時產生一個預置脈沖loa

3、d,用來預置脈寬參數。當按鍵key有效后產生脈沖pulse。 開始系統復位延時啟動計數器預置脈寬計數器結束?產生單脈沖結束計數器減一二、驗證方案:1.驗證方案的設計: 分頻模塊的設計:分頻模塊的代碼:module div(clk_50M,clk);/模塊名及端口的定義,到endmodule。 input clk_50M;/輸入端口的定義。 output clk;/輸出端口的定義。 reg 31:0 a=32d0;/定義內部寄存器并賦初值。 reg clk=0;/給輸出賦初值。 always(posedge clk_50M) begin if(a=32d500000)/判斷計數器是不是記到了50

4、0000 begin a=32d0;/ 計數器記到了500000清零。 clk=clk; / 輸出脈沖取反end/ 結束。else a=a+1;/ 計數器沒有記到了500000自加。end/結束always塊。endmodule/結束分頻模塊。分頻模塊的仿真結果:在驗證的時候設計了一個8分頻。 有波形圖可以看出clk_50M經過8個周期后clk取反,實現了8分頻,驗證了自己的設計。延時模塊的設計: 延時模塊的代碼:module dely(clk,clr,load); /模塊名及端口的定義,endmodule。input clk,clr; /輸入端口的定義。output load; /輸出端口的

5、定義。reg 2:0 counta; /延時計數器。reg load;/輸出。always(posedge clk or negedge clr)begin if(!clr) / 當clr為低電平時 begin counta=5;/清零。 load=0; end/結束清零。else / 當clr為高電平時計數器減一。begin counta=counta-8d1;if(counta=8d0)/計數器減到零時,進行復位輸出load為高 begin counta=8d0; load=1;/ 輸出load為高。 endendendendmodule /結束延時模塊。延時模塊的仿真結果: 從波形圖可以

6、看出當clr為高電平,且時鐘的上升沿到來的時候,延時5個時鐘周期后輸出load為高電平。計數模塊的設計: 計數模塊代碼:module count(clk,data,clr,load,pulse,key);/模塊名定義。input clk,clr,load,key;/輸入端口的定義。input7:0 data;/ mai kuan de ding yioutput pulse;/輸出的定義。reg pulse;/輸出定義為reg類型。reg 7:0 count;/ 計數器的定義。always(posedge clk or negedge clr)begin if(!clr)/低電平復位。 beg

7、in count=data;/置入脈寬。 pulse=0;/輸出為零。endelse if(load=1)/load有效的時候。beginif(key=0)/當有按鍵按下的時候。begin count=count-8d1;/計數器減一。 pulse=1;/輸出為高電平。 if(count=8d0)/當計數器減到零的時候。 begin count=8d0; pulse=0;/輸出為低電平。 end/ end beginend/end beginend/end beginend/end alwaysendmodule/結束計數模塊。上圖為可編程單脈沖發生器的邏輯仿真結果。由仿真結果可以看出,單脈沖

8、輸出的持續時間(脈沖寬度)由輸入的脈寬參數data決定。2.仿真激勵源代碼:timescale 1ns/100ps module confirmpulse_tb;/仿真模塊名字的定義。,reg 7:0 data;/ 輸入的脈寬。reg clk_50M,key,clr;/輸入的時鐘,按鍵,清零。wire pulse;/輸出。always #10 clk_50M=clk_50M;/時鐘周期。initialbegin clk_50M=0;clr=0;key=1;data=8d10; /賦初值。 #10 clr=1;key=0; #10000 $finish;/結束仿真。endinitial/ 監控。

9、begin$monitor($time,clk_50M=%d,clr=%d,data=%d,key=%d,pulse=%dn ,clk_50M,clr,data,key,pulse);endconfirmpulse /實例化。wsm(.key(key),.clk_50M(clk_50M),.data(data),.clr(clr),.pulse(pulse);endmodule/激勵模塊結束。五、電路設計源代碼:/*頂層模塊*/module confirmpulse(clk_50M,data,clr,key,pulse); input 7:0 data;/脈寬的定義。input clk_50M

10、,key,clr;/ key是發脈沖的信號,clr為清零信號。output pulse;/脈寬的輸出。 wire load;/中間變量的定義。 wire clk; div div(.clk_50M(clk_50M),.clk(clk);/實例化。 dely u1(.clk(clk),.clr(clr),.load(load);/ 實例化。 countu2(.clk(clk),.data(data),.clr(clr),.load(load),.pulse(pulse),.key(key);/ 實例化。Endmodule/結束頂層模塊。/*分頻模塊*/module div(clk_50M,clk

11、);/模塊名及端口的定義,到endmodule。 input clk_50M;/輸入端口的定義。 output clk;/輸出端口的定義。 reg 31:0 a=32d0;/定義內部寄存器并賦初值。 reg clk=0;/給輸出賦初值。 always(posedge clk_50M) begin if(a=32d500000)/判斷計數器是不是記到了500000 begin a=32d0;/ 計數器記到了500000清零。 clk=clk; / 輸出脈沖取反end/ 結束。else a=a+1;/ 計數器沒有記到了500000自加。end/結束always塊。endmodule/結束分頻模塊。

12、/*延時模塊*/module dely(clk,clr,load); /模塊名及端口的定義,endmodule。input clk,clr; /輸入端口的定義。output load; /輸出端口的定義。reg 2:0 counta; /延時計數器。reg load;/輸出。always(posedge clk or negedge clr)begin if(!clr) / 當clr為低電平時 begin counta=5;/清零。 load=0; end/結束清零。else / 當clr為高電平時計數器減一。begin counta=counta-8d1;if(counta=8d0)/計數器

13、減到零時,進行復位輸出load為高 begin counta=8d0; load=1;/ 輸出load為高。 endendendendmodule /結束延時模塊。/*計數模塊*/module count(clk,data,clr,load,pulse,key);/模塊名定義。input clk,clr,load,key;/輸入端口的定義。input7:0 data;/ mai kuan de ding yioutput pulse;/輸出的定義。reg pulse;/輸出定義為reg類型。reg 7:0 count;/ 計數器的定義。always(posedge clk or negedge clr)begin if(!clr)/低電平復位。 begin count=data;/置入脈寬。 pulse=0;/輸出為零。endelse if(load=1)/load有效的時候。beginif(key=0)/當有按鍵按下的時候。begin count=count-8d1;/計數器減一。 pulse=1;/輸出為高電平。 if(count=8d0)/當計數器減到零的時候。 begin count=8d0; pu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論