版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 電子信息系統(tǒng)課程設計</p><p> 題目 基于FPGA四位十進制數字頻率計 </p><p> 學 生 姓 名 </p><p> 學 院 信息科學與工程學院 </p><p> 專 業(yè) 電子信息工程 &
2、lt;/p><p> 班 級 09電子A 班 </p><p> 起 訖 日 期 2012.11.8-20012.12.20 </p><p> 指導教師 </p><p><b> 摘要 </b></p>&
3、lt;p> 頻率計的主要功能是準確測量出待測頻率的頻率、周期、脈寬及占空比。在電子技術中,頻率是最基本的參數之一,并且與許多電參量的測量方案、測量結果都有十分密切的關系,因此頻率的測量就顯得更為重要。測量頻率的方法有多種,其中電子計數器測量頻率具有精度高、使用方便、測量迅速,以及便于實現(xiàn)測量過程自動化等優(yōu)點,是頻率測量的重要手段之一。電子計數器測頻有兩種方式:一是直接測頻法(高頻),即在一定閘門時間內測量被測信號的脈沖個數;二是
4、間接測頻法,如周期測頻法(低頻)。直接測頻法適用于高頻信號的頻率測量,間接測頻法適用于低頻信號的頻率測量。本設計中分別以圖形設計方法為主和VHDL語言為主的兩種形式進行設計。</p><p> 在這次設計過程中,我們設計了兩套測量頻率計的方案。下面分別闡述。第一種方案,主要是通過一個計數器,在1秒時間內,當有待測信號上升沿產生時,開始計數。最后送到顯示模塊顯示。而占空比,則是通過分別計算高電平時間和低電平時間,
5、從而得到占空比數值。應該說這種方法,更接近于測頻法的思想。通過實驗的檢測,發(fā)現(xiàn)與實驗儀器(信號發(fā)生器)的最大誤差只有±1,所以,在測量頻率不是特別大的范圍內,這種設計方案,筆者認為應該可以接受。而第二種方案,則是對于不同大小的頻率,通過測頻法和測周法,進行選擇輸出頻率值大小。</p><p><b> 課程設計的設計要求</b></p><p> 1、任
6、務與要求 設計一個具有如下功能的簡易頻率計。</p><p><b> ?。?)基本要求:</b></p><p> a.被測信號的頻率范圍為1~20kHz,用4 位數碼管顯示數據。</p><p> b.測量結果分別用十進制和十六進制數值顯示。</p><p> c.被測信號可以是正弦波、三角波、方波,幅
7、值1~3V 不等。</p><p> d.具有超量程警告(可以用LED 燈顯示,也可以用蜂鳴器報警)。</p><p> e.當測量脈沖信號時,能顯示其占空比(精度誤差不大于1%)。</p><p><b> (2)發(fā)揮部分</b></p><p> a.修改設計,實現(xiàn)自動切換量程。</p><
8、;p> b.構思方案,使整形時,跳變閾值自動進行調節(jié),以實現(xiàn)擴寬被測信號的幅值范圍。</p><p><b> c.其它。</b></p><p><b> 設計方案</b></p><p> 方案1:采用fpga開發(fā)板實現(xiàn)。</p><p> 該課程設計要求測頻的范圍是1~20KH
9、Z,可分1~9999HZ和10.00~20.00KHZ兩個量程。將1HZ CLK信號二分頻,取分頻后信號的高電平作為測頻的1S閘門信號,測量結果有5位,當結果小于9999HZ時選擇低四位由數碼管顯示輸出,大于9999HZ且小于20KHZ時,選擇高四位輸出。通過選擇高四位或低四位來實現(xiàn)量程的轉換。</p><p> 此方案的特點是實現(xiàn)方法簡單,適合小范圍的頻率測量,但測頻范圍較大時,實現(xiàn)起來,測量速度較慢,還會造
10、成所用元器件的浪費。</p><p><b> 原理方框圖如下:</b></p><p> 方案2:采用單片機進行測頻控制。</p><p> 單片機技術比較成熟,功能也比較強大,被測信號經放大整形后送入測頻電路,由單片機對測頻電路的輸出信號進行處理,得出相應的數據送至顯示器顯示。</p><p> 原理方框圖如
11、下所示:</p><p><b> 待測信號</b></p><p> 采用這種方案,優(yōu)點是依賴成熟的單片機技術、運算功能較強、軟件編程靈活、自由度大、設計成本也較低,缺點是顯而易見的,在傳統(tǒng)的單片機設計系統(tǒng)中必須使用許多分立元件組成單片機的外圍電路,整個系統(tǒng)顯得十分復雜,并且單片機的頻率不能做得很高,使得測量精度大大降低。</p><p>
12、; 比較兩方案可知:對于本設計,方案1較方案2簡單,采用現(xiàn)場可編程門陣列(FPGA)為控制核心,利用VHDL語言編程,下載燒制實現(xiàn)。將所有器件集成在一塊芯片上,體積大大減小的同時還提高了穩(wěn)定性,可實現(xiàn)大規(guī)模和超大規(guī)模的集成電路,測頻測量精度高,測量頻率范圍大,而且編程靈活、調試方便。</p><p> 綜合上述分析,方案1為本設計測量部分最佳選擇方案。</p><p><b>
13、; 單元電路設計</b></p><p> 一·整形放大電路 原理圖</p><p> 這一部分,當被測信號幅值為1~3V 不等時,通過兩級運放,將信號電壓放大到電路所需的電壓值。后面再通過斯密特觸發(fā)器,把被測信號正弦波,三角波整形為方波。</p><p> 通過對《模擬電子技術》的學習,知道對于上面的一級運放,電壓放大的倍數為Au
14、=1+R2/R1。如果1V的電壓值輸入都可以,那么1V以上的一定都行。所以,本次設計,兩級運放的放大倍數分別為2,3.這樣已經可以滿足實驗的要求。所以,圖中R1=R2=R4=1K,R3=2K。這是其PCB版圖:</p><p> 下面開始介紹頻率計的核心部分。這一部分,是通過FPGA設計。</p><p><b> 二·時鐘發(fā)生器</b></p&g
15、t;<p> 通過對50MHZ的晶振時鐘進行50M的分頻,等到一個1HZ信號。再通過此信號,通過2分頻,得到一個0.5HZ的信號,從而得到高電平為1秒的閘門控制信號en來控制計數器的計數時間.再通過對en求反,等到鎖存信號load.而清零信號clr則通過en與1HZ信號共同產生. 同時對50MHZ信號進行500分頻,一個兩位的std_logic_vector(1 downto 0)信號在分頻信號的驅動下不斷加‘1’,等
16、到“00”、“01”、“10”、“11”四種片選信號,對應4個數碼管,從而驅動數碼管的動態(tài)掃描顯示 。 </p><p><b> 仿真圖如下:</b></p><p> Clk0周期產生時,由于clr為有效信號,使得pian不產生信號。導致后面的動態(tài)掃描不進行。即清零。</p><p> 由于該模塊涉及到計數值25000000,數值較大
17、,不便仿真。但經過實驗檢測,證明該模塊設計達到要求。</p><p><b> 三·信號輸入器</b></p><p> 通過對50MHZ信號進行不同的2的n次方分頻,得到781250HZ,195313HZ,24HZ這三個內部自測信號,以檢測頻率計是夠正常。通過按鍵key1,key2,key3來選擇三個中的一個信號輸入以對頻率計進行自檢。而信號輸入器的默
18、認情況是輸入外部待測信號。由于使用if---elsif語句,三個按鍵中,優(yōu)先級最高的是key1,然后是key2,最后是key3。</p><p> 由于cin要輸入50MHz的頻率信號,且對50MHz還要進行分頻,但在現(xiàn)有的Quartus9.0中,仿真實現(xiàn)不了這一要求,所以這個仿真圖就沒辦法做出來。實驗已驗證,當cin接入50MHz的頻率信號時,K1有效時,clkout輸出24Hz信號;當K2有效而K1無效時,
19、clkout輸出195313Hz;當僅有K3有效時,clkout輸出781250Hz;當K1K2K3都為低電平無效信號時,clkout輸出為P端口的待測信號。PP端口一直輸出24Hz,用于檢測內部的工作狀態(tài)。P端口用于接入待測信號。</p><p><b> 四·計數器 </b></p><p> 根據在時基有效時間內的計數值進行判斷,計數器可以直接定義
20、成8個std_logic_vector(3 downto 0)的32位信號,在待測時鐘上升沿到來的時候,使用語句“計數器<=計數器+1;”,當信號的值小于“1001”時,信號就不斷自增;當信號大于或等于“1001”時,就歸零。由于if語句的特性,使得到一個二進制顯示的十進制計數器,對于后續(xù)的顯示代碼轉換也是十分的方便。 當高4位不全為零時,產生一個信號來點亮板上的led燈,告訴使用者待測頻率已經超過9999hz,需要翻頁才能看到結
21、果的高4位數據。 同時通過一個按鍵key5,產生一個高低4位傳送切換信號。當key5信號為0時,送低4位到譯碼顯示電路;當key5信號為1時,送高四位到譯碼顯示電路。默認情況下是送低4位到譯碼顯示電路。這樣就可以通過按鍵來實現(xiàn)高低四位的換頁顯示了。Key5也同時控制著小數點的顯示與否,若小數點點亮,則表示切換到高位成功,否則,仍然顯示低位。</p><p><b> 仿真圖如下:</b>&
22、lt;/p><p> 當clkin上升沿到來時,且clr0為低電平(無效信號),do為有效信號(高電平)時,開始計數clkin的上升沿個數。如圖所示,在do為高電平范圍內,clkin有7個上升沿產生,d1計數,并且最終顯示為7.當clrO產生為有效信號(高電平),d1d2d3d4清零。圖中,K為翻頁信號,dian為高4位的標記,跟隨K翻頁信號變化。Biao信號為指示數字顯示是否超過4位數碼管。當biao為有效信號時
23、,即提示需要進行高4位的翻頁顯示。</p><p> 下圖顯示dian信號跟隨K信號變化。證明當K翻頁信號產生時,數碼管上的小數點會提示,設計無誤。</p><p><b> 五·顯示譯碼電路 </b></p><p> 首先對前面各部分送來的將要顯示的部分進行鎖存。默認情況下是鎖存計數器產生的頻率數。通過按鍵key4可以切換到
24、鎖存占空比數據。當鎖存信號load的上升沿到來時,就進行鎖存操作。然后根據pian片選信號產生的“00”,“01”,“10”,“11”四種信號對輸入的信號進行選擇操作,同時也選通相應的數碼管的位選。最后對數據進行數碼管顯示碼的譯碼,把小數點及l(fā)ed燈的信號連同數碼管輸出碼一同輸出到外部相應的端口。</p><p><b> 仿真圖如下圖所示:</b></p><p>
25、; 如上圖所示,PX為掃描信號,其變化由時鐘發(fā)生器給出,使其變化為00,01,10,11,如用十進制顯示,即為0,1,2,3。當suo上升沿產生時,且KK4=1(顯示頻率),顯示部分qout即有規(guī)律的從9,8,7,6變化。至于這4個數字顯示的位置,則由qcom決定。顯然,動態(tài)掃描利用了人眼的余暉效應,才使得看上去,4個數碼管都同時顯示數字。</p><p> 當suo上升沿產生時,且KK4=0(顯示占空比),
26、顯示部分qout即有規(guī)律的從0,0,2,3變化。即表示此時占空比為32%(t2為高位)。前面兩個數碼管不用。</p><p> 可見,顯示部分的設計符合我們的要求。通過對KK4的控制,選擇顯示頻率,占空比。</p><p><b> 六·分頻模塊</b></p><p> 對50MHz的原始信號進行分頻,產生50Hz的掃描信號,
27、用于寄存器。筆者認為,其實,這就是一個計數器。當達到設定的一個數值時,產生對應信號的跳變,從而達到分頻效果。</p><p> 該仿真圖由于涉及到50MHz的頻率,在現(xiàn)有的仿真軟件上,不能做到。但通過實驗驗證,這一模塊是正確的,達到我們所期望的結果。</p><p><b> 七·寄存器模塊</b></p><p> 為了防止顯
28、示數字的跳動,我們設置了寄存器模塊,使顯示的數字趨于穩(wěn)定。</p><p><b> 仿真圖如下:</b></p><p> 如圖所示,當clk上升沿產生時,dout1跟隨din1變化,dout2跟隨din2變化。</p><p><b> 八·占空比模塊</b></p><p>
29、 占空比測量電路,以50MHZ信號作為計數的頻率基準。當待測信號為高電平時,進行計數,得到值x;當待測信號為低電平時,進行計數,得到值y。 再通過公式z=x*100/(x+y) 得到占空比的整數形式。 再通過u1=z rem 10,得到個位數字;通過u10=z/10 ,得到十位數字。 最后通過case語句進行譯碼,得到相應的數碼管顯示代碼。然后鎖存到譯碼顯示電路,等待后續(xù)的顯示操作。 由于此處用到除法以及求余運算,將會耗費不少的片內資源
30、。</p><p><b> 仿真圖如下:</b></p><p> 應該說,clkche端口接入基準信號(該硬件開發(fā)板為50MHz),clkshu接入待測信號,t1顯示個位數字,t2顯示十位數字。由于t2顯示12,根據譯碼模塊,應該顯示—。通過硬件驗證,數碼管顯示—7正如上面分析。當新的有效測量周期產生時,仿真顯示80.其含義為占空比為80%。通過實驗硬件驗證,
31、正確。</p><p><b> 整體原理圖</b></p><p> 備注:硬件采用的是ASK2CB開發(fā)板,所使用的核心芯片為CycloneII EP2C8Q208C8N.</p><p><b> 引腳分配</b></p><p><b> 硬件驗證</b><
32、;/p><p> 頻率測量(輸入波形為方波)</p><p><b> 總結</b></p><p> 這次課程設計,學到了許多東西。應該說,通過這次課程設計,讓我重新熟悉Quartus的使用和自己買來的FPGA開發(fā)板。這次課程設計,完成的設計內容有,設計的頻率計,可以測試0~99999999Hz的方波頻率信號,并且是通過4個數碼管進行十進制
33、顯示。當頻率超過9999Hz時候,會有LED燈的提示。這個頻率計,還可以向外輸出24HZ,195313HZ,781250HZ的頻率,通過實驗檢測,都是方波信號。不足之處是,沒有通過十六進制顯示。這個筆者有嘗試的做了一下,就是通過最后的譯碼部分,改變輸出的表達形式。不過只能對于小于9999HZ的管用,大于此頻率,顯示亂碼。而且,不能夠翻頁顯示。所以,最后決定,放棄十六進制顯示。還有一點就是占空比的測量。硬件顯示,測量結果處于變動(現(xiàn)在已經
34、可以穩(wěn)定輸出)。占空比的測量原理是分別測出待測方波信號高電平,低電平分別通過基準信號周期的個數,然后計算出占空比。一開始試了很多次,后來返現(xiàn)由于馬虎,連錯線路。現(xiàn)在硬件可以正常顯示。有一個問題是,自做的整形放大部分,并不能工作,導致只能輸入方波才能顯示正確的頻率。整形放大部分,是通過把三角波還有正弦波,將其放大便于硬件</p><p> 雖然這次課程設計,并不能完全完成,但收獲頗多。最重要的一點是,讓我所學的知
35、識又一次通過實驗去檢驗,深化對知識的理解。</p><p><b> 參考文獻</b></p><p><b> 1 百度文庫資料</b></p><p> 2 江國強. EDA技術與與應用(第2版).北京:電子工業(yè)出版社,2007年4月.</p><p> 3 王鈿 卓興旺. 基于Veri
36、log HDL的數字系統(tǒng)應用設計. 北京:國防工業(yè)出版社,2006年1月.</p><p> 4 延明 張亦華. 數字電路EDA技術入門. 北京:北京郵電大學出版社,2006年1月.</p><p> 5 王鈿 卓興旺盛. 基于Verilog HDL的數字系統(tǒng)應用設計. 北京:國防工業(yè)出版社,2006年1月.</p><p><b> 備注:<
37、/b></p><p> 以上就是在摘要里提到的第一種設計,下面將介紹第二種設計。</p><p> 一·設計原理及具體方案</p><p> 低頻信號的測量(測周期法1HZ—10KHZ):所謂頻率就是在單位時間(1s)內周期信號的變化次數。若在一定時間間隔T內測得周期信號的重復變化次數為N,則其頻率為f=N/T,據此,同樣對于低于10KHZ的
38、信號,我們采用測周期法,時標為50MHZ,其誤差遠遠小于0.001,故可達到指標要求</p><p> 高頻信號的測量(測頻法10KHZ—99MHZ):由于我們很難得到準確的1hz頻率,故在這里我們采用等精度測量法,這樣就可以不必考慮1s信號的精確度的影響。</p><p> 閘門時間不是固定值,而是被測信號周期的整數倍,即與被測信號同步.因此排除了對被測信號計數所產生的1個周期誤差,
39、并且達到了在整個測試頻段的等精度測量.</p><p> 在測量過程中,有兩個計數器分別對標準信號和被測信號同時計數.首先給出閘門開啟信號(預置閘門上升沿),此時計數器并不開始計數.而是等到被測信號的上升沿到來時,計數器才真正開始計數.然后預置閘門關閉信號(下降沿到時),計數器并不立即停止計數,而是等到被測信號的上升沿到來時才開始結束計數,完成一次測量過程.</p><p> 設在一次
40、實際閘門時間t中計數器對被測信號的計數值為Nx,對標準信號的計數值為Ns, 標準信號的頻率為fs,則被測信號的頻率為fx= fs。由推斷(此處省略)得測量頻率的相對誤差 = </p><p> 由上式可看出測量頻率的相對誤差與被測信號頻率的大小無關,僅與閘門時間和標準信號頻率有關.閘門時間越長,標準頻率越高測頻的相對誤差就越小.標準頻率可由穩(wěn)定性好,精度高的高頻率晶振產生,在保證測量精度不變的前提下,提高標準信
41、號頻率,可使閘門時間縮短,即提高測試速度.可實現(xiàn)</p><p><b> 二·波形整形電路</b></p><p> 為了能測量不同電平值與波形的周期信號的頻率,必須對被測信號進行放大與整形處理,使之成為能被計數器有效識別的脈沖信號。信號放大與波形整形電路的作用即在于此</p><p><b> 三·程序原
42、理圖 </b></p><p> 四·主要各個模塊的介紹</p><p><b> 分頻模塊</b></p><p> 因為電腦資源限制,所以筆者認為,為了能夠更清楚看到上訴模塊的仿真功能,建議把上面的計數數值2500改小為25,這樣易于仿真截圖,但其道理和2500沒有區(qū)別。仿真如下:</p><
43、p> 可見,當clk_in每25個下降沿產生時,clk_out就會產生邊沿跳變。這樣,clk-out的周期是clk_in周期的50倍。周期大頻率小,即當clk_in每2500個跳變沿產生時,clk-in的頻率為clk-out的5000倍。Clk-in為50MHz,clk-out為10KHz.</p><p> 同理;下面的這個模塊功能與上述類似:當接50MHz輸入時,產生1Hz.</p>
44、<p> 下面的這個模塊功能與上述類似:當接50MHz輸入時,產生50Hz.</p><p><b> 仿真圖如下:</b></p><p> 由上圖可以看出:當m=0,clkout的波形和clk0的一樣;當m=1,clkout的波形和clkx一樣。</p><p><b> 寄存器模塊</b></
45、p><p><b> 仿真圖:</b></p><p> 當clk上升沿產生時,dout跟隨din變化而變化。該模塊實現(xiàn)寄存器功能。</p><p><b> 除法模塊</b></p><p> 設置這一模塊,是為了提高測量的準確度。將測量到的數值,由于數值太小,通過擴大一定的倍數,使模塊能夠接
46、受,最后輸出時在縮小同樣的倍數,從而輸出原來的數值。</p><p><b> 譯碼模塊</b></p><p><b> 仿真圖如下:</b></p><p> 第一行為輸入的數字,下面一行對應數碼管中顯示的數字,即從左到右對應abcdefg,這是共陽極數碼管。當數碼管中對應的二極管為0時,即點亮。</p&g
47、t;<p> 當第一行為10到15時,顯示為—。即不顯示對應的符號。</p><p><b> 動態(tài)掃描模塊</b></p><p><b> 仿真圖如下:</b></p><p> 當sel有規(guī)律的變化時,enf跟隨變化。enf中0的位置,即顯示的數碼管位置。</p><p>
48、;<b> 亮燈提示模塊</b></p><p><b> 仿真圖如下:</b></p><p> 由上圖可以看出,當s=0時,不論k怎樣變化,輸出端口a=0,b=0,c=1;當s=1時,k=1時,a=1,b=0,c=0;k=0時,a=0,b=1,c=0.這一部分,提示對應輸出的含義。</p><p> 五
49、3;安裝與調試過程 </p><p> 設計好以上每個模塊的電路后便可畫出整個數字頻率計的電路圖,然后列出所需要的元器件清單。拿到元器件按照整體電路圖安裝好數字頻率及的電路后,進行調試,首先分模塊進行調試,在每個模塊調試正確后,不規(guī)則進行聯(lián)調。因為整個電路的分析是瞬態(tài)分析,故總體電路的分析需要較長時間。</p><p><b> 六·結果分析</b>&l
50、t;/p><p> 1)測量頻率范圍0.4~1.9MHz,3.3V以上胡信號可測至100MHZ的頻率;</p><p> 2)最大讀數99999999HZ,閘門信號的采樣時間為1s左右;.</p><p> 3)被測信號可以是正弦波、三角波和方波;</p><p> 4)顯示方式為8位十進制數顯示,可顯示小數點后面4位;</p>
51、;<p> 5)滿足基本要求輸入為0.5V到5V,信號最大幅值可擴展。</p><p> 6)占空比,周期,頻率,均滿足要求,各個測量誤差小于+-0.1%。</p><p><b> 七·參考文獻:</b></p><p> 1、百度文庫資料 2、以前參加電子設計大賽所做的頻率計資料 3、EDA課本<
52、;/p><p><b> 附錄</b></p><p><b> 時鐘發(fā)生器</b></p><p> library ieee; </p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_ar
53、ith.all;</p><p> use ieee.std_logic_unsigned.all; </p><p> entity clock is</p><p> port(clk0:in std_logic; </p><p> load,en,clr:out std_logic; </p>
54、<p> pian:buffer std_logic_vector(1 downto 0) </p><p><b> );</b></p><p> end entity clock; </p><p> architecture run of clock is</p><p> signal
55、en1,en2,en3:std_logic;</p><p><b> begin </b></p><p> onehz:process(clk0) --產生1HZ信號 </p><p> variable cnt:integer range 0 to 50000000; </p><p> vari
56、able x:std_logic; </p><p><b> begin</b></p><p> if(clk0'event and clk0='1') then </p><p> if(cnt<24999999) then </p><p> cnt:=cnt+1
57、; </p><p> else cnt:=0; x:=not x; </p><p><b> end if; </b></p><p><b> en1<=x; </b></p><p><b> end if;</b></p><
58、;p> end process onehz; </p><p> zreo5hz:process(en1) --產生0.5HZ信號 </p><p><b> begin</b></p><p> if(en1'event and en1='1') then </p><p&g
59、t; en2<=not en2;</p><p><b> end if;</b></p><p><b> en<=en2;</b></p><p> end process;</p><p> locks:process(en2) --對en信號進行取反,得到鎖存信號loa
60、d </p><p><b> begin </b></p><p> load<=not en2;</p><p> end process; </p><p> clr1:process(en1,en2) --由en信號與1HZ信號共同產生清零信號clr </p><p>&l
61、t;b> begin</b></p><p> if(en1='0'and en2='0') then</p><p><b> clr<='1';</b></p><p> else clr<='0';</p><p>
62、;<b> end if; </b></p><p> end process;</p><p> onekhz:process(clk0) --對50MHZ信號進行500分頻</p><p> variable cnt1:integer range 0 to 50000000;</p><p> varia
63、ble x1:std_logic;</p><p><b> begin </b></p><p> if(clk0'event and clk0='1') then </p><p> if(cnt1<500) then</p><p> cnt1:=cnt1+1;</p&g
64、t;<p> else cnt1:=0; x1:=not x1;</p><p><b> end if; </b></p><p><b> en3<=x1; </b></p><p><b> end if;</b></p><p> en
65、d process; </p><p> pianx:process(en3) --由500分頻信號得到片選信號</p><p><b> begin</b></p><p> if(en3'event and en3='1') then</p><p> pian<=pian+1
66、;</p><p><b> end if; </b></p><p> end process;</p><p> end architecture run;</p><p><b> 信號輸入端</b></p><p> library ieee; </p
67、><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity fenpin is port(cin,k1,k2,k3,p:in std_l
68、ogic;</p><p> clkout,pp:out std_logic ); </p><p> end entity fenpin;</p><p> architecture run3 of fenpin is</p><p> signal temp:std_logic_vector(50 downto 0); &l
69、t;/p><p><b> begin</b></p><p> c:process(cin)--對50Mhz進行2的n次方分頻 </p><p><b> begin</b></p><p> if(cin'event and cin='1') then </p&
70、gt;<p> temp<=temp+1;</p><p><b> end if; </b></p><p> end process; </p><p> d:process(p,k1,k2,k3) </p><p><b> begin</b></p>
71、<p> if(k1='0') then</p><p> clkout<=temp(20); --得到24HZ信號,k1=0</p><p> elsif(k2='0') then </p><p> clkout<=temp(7); --得到195313HZ信號,k1k2=10</p&g
72、t;<p> elsif(k3='0') then</p><p> clkout<=temp(5); --得到781250HZ信號,k1k2k3=110</p><p> else clkout<=p; --默認情況下檢測外部信號,k1k2k3=111</p><p><b> end if
73、;</b></p><p> end process; </p><p> pp<=temp(20); --向外輸出一個24HZ的頻率,可供自身測試使用 </p><p> end architecture run3;</p><p><b> 計數器模塊</b></p>&l
74、t;p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all; </p><p> use ieee.std_logic_unsigned.all; </p><p> entity counter
75、is</p><p> port(clkin,clr0,do,k:in std_logic;</p><p> biao,dian:out std_logic;</p><p> d1,d2,d3,d4:out std_logic_vector(3 downto 0) );</p><p> end entity counter;&
76、lt;/p><p> architecture run1 of counter is</p><p><b> begin </b></p><p> a:process(clkin)</p><p> variable a1,a2,a3,a4,a5,a6,a7,a8:std_logic_vector(3 downt
77、o 0);</p><p><b> begin </b></p><p> if(clkin'event and clkin='1') then –1 32位寬的信號進行加1計算,得到頻率值 a8a7a6a5a4a3a2a1</p><p> if(do='1') then --11
78、 最低位</p><p> if(a1<"1001") then a1:=a1+1;</p><p> else a1:="0000"; </p><p> if(a2<"1001") then a2:=a2+1; </p><p> else a2:=&q
79、uot;0000"; </p><p> if(a3<"1001") then a3:=a3+1; </p><p> else a3:="0000"; </p><p> if(a4<"1001") then a4:=a4+1; </p><p> e
80、lse a4:="0000";</p><p> if(a5<"1001") then a5:=a5+1;</p><p> else a5:="0000"; </p><p> if(a6<"1001") then a6:=a6+1; else a6:=
81、"0000"; </p><p> if(a7<"1001") then a7:=a7+1; else a7:="0000"; if(a8<"1001") then --最高位</p><p><b>
82、; a8:=a8+1;</b></p><p> else a8:="0000";</p><p> end if;end if; end if; </p><p> end if; end if; end if;end if; end if; end if; --11</p>&
83、lt;p> if(clr0='1') then --12 清零信號有效時,對32位寬信號進行清零,為下一次計數做好準備 </p><p> a1:="0000"; a2:="0000"; a3:="0000";</p><p> a4:="0000"; a5:=&quo
84、t;0000"; a6:="0000";</p><p> a7:="0000"; a8:="0000";</p><p> end if; --12</p><p> end if; --1</p><p> if(a5/=&quo
85、t;0000") or (a6/="0000") or (a7/="0000")or (a8/="0000")then --2 </p><p> biao<='1'; --待測信號是否超出9999HZ的判斷,從而產生高位翻頁提醒信號</p><p> else biao
86、<='0'; end if; --2</p><p> if(k='0') then --3高低4位翻頁切換信號的產生與執(zhí)行</p><p> d4<=a8; d3<=a7; d2<=a6;d1<=a5; </p><p> dian<='0'; </p>
87、<p><b> else </b></p><p> d4<=a4;d3<=a3;d2<=a2;d1<=a1;</p><p> dian<='1'; </p><p> end if; --3 </p><p> end p
88、rocess;</p><p> end architecture run1;</p><p><b> 譯碼顯示電路</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.s
89、td_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity ldisp is</p><p> port(suo,dian1,biao1,kk4:in std_logic;</p><p> px:in std_logic_vector(1
90、 downto 0);</p><p> i1,i2,i3,i4,tt1,tt2:in std_logic_vector(3 downto 0);</p><p> qout:out std_logic_vector(6 downto 0);</p><p> qcom:out std_logic_vector(3 downto 0); </p>
91、<p> dianout,biaoout:out std_logic ); </p><p> end entity ldisp; </p><p> architecture run2 of ldisp is</p><p> signal e:std_logic_vector(3 downto 0);</p><p&g
92、t; signal c5,c6:std_logic;</p><p><b> begin</b></p><p> l:process(px) --對各種信號進行鎖存a</p><p> variable c1,c2,c3,c4: std_logic_vector(3 downto 0);</p><p>&
93、lt;b> begin</b></p><p> if( suo'event and suo='1') then </p><p> if(kk4='0') then --kk4=0,顯示占空比 c1:=tt1;</p><p> c2:=tt2; c3:="0000"
94、;; c4:="0000";</p><p><b> else</b></p><p> c1:=i1; c2:=i2; c3:=i3; c4:=i4; </p><p> c5<=dian1; c6<=biao1;</p><p><b> end if;
95、</b></p><p><b> end if;</b></p><p> case px is --根據位選信號進行數據選擇和位選信號的選擇 </p><p> when"00"=>e<=c1;qcom<="0111";</p><p>
96、 when"01"=>e<=c2;qcom<="1011";</p><p> when"10"=>e<=c3;qcom<="1101";</p><p> when "11"=>e<=c4;qcom<="1110&quo
97、t;;</p><p> when others=>e<="1111";qcom<="1111";</p><p><b> end case;</b></p><p> end process;</p><p> y:process(e) --數
98、碼管顯示代碼譯碼</p><p><b> begin</b></p><p><b> case e is</b></p><p> when "0000" => qout<="0000001";--0</p><p> when &qu
99、ot;0001" => qout<="1001111";--1</p><p> when "0010" => qout<="0010010";--2</p><p> when "0011" => qout<="0000110";--3&l
100、t;/p><p> when "0100" => qout<="1001100"; --4</p><p> when "0101" => qout<="0100100";--5</p><p> when "0110" => qout
101、<="0100000";--6</p><p> when "0111" => qout<="0001111";--7</p><p> when "1000" => qout<="0000000";--8</p><p> whe
102、n "1001" => qout<="0000100";--9</p><p> when others => qout<="1111110";</p><p><b> end case;</b></p><p> dianout<=c5; --
103、小數點及l(fā)ed燈信號輸出</p><p> biaoout<=c6;</p><p> end process; </p><p> end architecture run2;</p><p><b> 分頻模塊</b></p><p> library ieee;</p&
104、gt;<p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity fenpin2 is</p><p> port(clk_in:in std_logic;</p><p> clk_out:ou
105、t std_logic);</p><p><b> end;</b></p><p> architecture arc of fenpin2 is</p><p> signal number:integer range 0 to 500000; --50Hz</p><p> signal current_
106、clk: std_logic;</p><p><b> begin </b></p><p> clk_out<=current_clk;</p><p> process(clk_in)</p><p><b> begin</b></p><p> i
107、f clk_in'event and clk_in='0' then</p><p> if number<500000 then </p><p> number<=number+1;</p><p> else number<=0;</p><p> current_clk<=not
108、 current_clk;--shuchushizhongxinhao</p><p> end if; end if; end process; end arc;</p><p><b> 寄存器模塊</b></p><p> library ieee;</p><p> use ieee.std_logic_
109、1164.all;</p><p> entity reg2 is</p><p> port(clk:in std_logic;</p><p> din1:in std_logic_vector(3 downto 0);</p><p> din2:in std_logic_vector(3 downto 0);</p>
110、;<p> dout1:out std_logic_vector(3 downto 0);</p><p> dout2:out std_logic_vector(3 downto 0));</p><p><b> end;</b></p><p> architecture arc of reg2 is</p&g
111、t;<p> begin process(clk)</p><p><b> begin</b></p><p> if(clk'event and clk='1') then</p><p> dout1<=din1; dout2<=din2;</p><p&g
112、t; end if; end process; end arc;</p><p><b> 占空比模塊</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;
113、</p><p> use ieee.std_logic_unsigned.all;</p><p> entity zhankong is</p><p> port(clkshu,clkche: in std_logic;</p><p> t1,t2:out std_logic_vector(3 downto 0) );<
114、/p><p> end entity zhankong;</p><p> architecture run5 of zhankong is</p><p> signal x1,y1:integer range 0 to 50000000;</p><p> signal z:integer range 0 to 100; </p
115、><p> signal zo:std_logic_vector(7 downto 0); </p><p><b> begin</b></p><p> q:process(clkshu) --以50Mhz為頻率基準,對待測信號高電平期間進行計數 </p><p> variable x,x2: integer
116、range 0 to 50000000;</p><p><b> begin </b></p><p> if(clkshu'event and clkshu='1') then </p><p> if(clkche='1') then x:=x+1;</p><p&
117、gt; elsif (x>0) then x2:=x; x1<=x2; x:=0;</p><p> end if; end if; end process;</p><p> q1:process(clkshu) --以50Mhz為頻率基準,對待測信號低電平期間進行計數</p><p> variable y,y2:integer ran
118、ge 0 to 50000000;</p><p><b> begin </b></p><p> if(clkshu'event and clkshu='1') then</p><p> if (clkche='0') then y:=y+1;</p><p>
119、 elsif (y>0) then y2:=y; y1<=y2; y:=0; </p><p> end if; end if; end process; </p><p> q2:process(x1,y1) --求出占空比,并且通過乘以100得到整數形式 </p><p> variable z1:integer range 0 to
120、 100;</p><p><b> begin</b></p><p> z1:=(x1*100)/(x1+y1);</p><p><b> z<=z1;</b></p><p> end process;</p><p> q3:process(clks
121、hu,z) --得出個位,十位代碼</p><p> variable u1,u10:integer range 0 to 9;</p><p> variable r1,r2:std_logic_vector(3 downto 0);</p><p><b> begin </b></p><p> u1:=z
122、 rem 10; --個位 </p><p> u10:=z/10; --十位</p><p> case u1 is --個位譯碼</p><p> when 0=>r1:="0000";</p><p> when 1=>r1:="00
123、01";</p><p> when 2=>r1:="0010";</p><p> when 3=>r1:="0011"; </p><p> when 4=>r1:="0100"; </p><p> when 5=>r1:="
124、0101";</p><p> when 6=>r1:="0110"; </p><p> when 7=>r1:="0111"; </p><p> when 8=>r1:="1000"; </p><p> when 9=>r1:=&qu
125、ot;1001";</p><p> when others=>r1:="1111"; </p><p> end case; </p><p> case u10 is --十位譯碼</p><p> when 0=>r2:="0000";</p&g
126、t;<p> when 1=>r2:="0001"; </p><p> when 2=>r2:="0010"; </p><p> when 3=>r2:="0011"; </p><p> when 4=>r2:="0100"; <
127、/p><p> when 5=>r2:="0101"; </p><p> when 6=>r2:="0110";</p><p> when 7=>r2:="0111";</p><p> when 8=>r2:="1000"; &l
128、t;/p><p> when 9=>r2:="1001"; </p><p> when others=>r2:="1111"; </p><p> end case; </p><p> t1<=r1; --傳送到譯碼顯示電路 </p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論