霍旭陽
在設計單片機和數字電路時經常需要測量脈沖個數、脈沖寬度、脈沖周期、脈沖頻率等參數,雖然使用邏輯分析儀可以很好地測量這些參數,但其價格過于昂貴。筆者基于Altera公司的EPM7064SLC可編程邏輯芯片(CPLD),設計了一種多功能計數測頻儀,可以進行脈沖計數,測量脈沖寬度、周期和頻率,實現了一部分邏輯分析的功能。
系統簡介
1.系統功能
筆者自制的這套多功能計數測頻儀有計數、測頻、測寬、測周四種工作模式,計數、測頻時,可以測量最高50MHz的輸入脈沖信號;測寬、測周時,時間分辨率為50ns,可以測量脈沖寬度(周期)長達200s的脈沖信號。
本系統的核心是基于CPLD的32位計數器及相應控制邏輯,它完成所有的計數、測量功能,對應于四種工作模式,計數器的計數值分別為:脈沖計數、脈沖頻率、脈沖寬度和脈沖周期;本系統采用8個數碼管作為系統的輸出,測量結果以十六進制格式在數碼管上顯示輸出;本系統中,計數、測頻時可以選擇被測脈沖的有效沿,測寬時可以選擇被測脈沖的有效電平;本系統通過四個輕觸按鍵控制系統的工作狀態,四個按鍵分別用于:計數器清零、選擇計數有效沿、選擇工作模式、啟動測量。
2.系統工作原理
在脈沖計數模式下,直接將被測脈沖輸入作為計數器的時鐘,每個被測脈沖的有效沿計數器加1,數碼管上顯示的數值就是當前的脈沖計數。在計數過程中可以隨時通過“計數器清零”按鍵來清零計數器,也可以通過“選擇計數有效沿”按鍵選擇被測脈沖的有效沿。
測量脈沖頻率時,仍將被測輸入信號作為計數器時鐘,同時使用系統內的1Hz時鐘信號來啟動和終止計數器計數,按下“啟動測量”按鍵后,在相鄰的1Hz時鐘的上升沿啟動計數器計數,下一個1Hz時鐘上升沿停止計數器計數,則計數停止后計數器的值就是被測信號的頻率。
測量脈沖寬度時,將系統的20MHz時鐘作為計數器的時鐘,計數器僅在按下“啟動測量”按鍵后的相鄰被測信號的有效電平期間計數,計數停止后計數器的值就是被測信號的脈沖寬度(以50ns為單位)。
測量脈沖周期時,將系統的20MHz時鐘作為計數器的時鐘,按下“啟動測量”按鍵后,在相鄰的被測脈沖信號的有效沿處啟動計數器計數,下一個脈沖信號有效沿停止計數器計數,則計數停止后計數器的值就是被測信號的周期(以50ns為單位)。
3. 系統構成
系統由一片CPLD、8個數碼管、4個按鍵、幾片74XX邏輯芯片構成,電路由鍵盤模塊、時鐘模塊、顯示模塊和CPLD核心模塊四部分構成,如圖1所示。它使用一片CPLD作為系統核心,把原本需要多片門電路完成的計數和控制邏輯集成到一片EPM7064可編程邏輯芯片中,不但縮小了電路板的面積、降低了系統功耗、使系統工作更加穩定可靠,而且可以非常方便地通過重新編程CPLD芯片實現系統功能的修改和升級。
鍵盤模塊鍵盤模塊由四個輕觸按鍵構成,每個輕觸按鍵都是一端接地,另一端用10kΩ電阻上拉、并連接到CPLD。
時鐘模塊 時鐘模塊為CPLD提供測量脈沖寬度和周期使用的20MHz、測量頻率使用的1Hz以及顯示使用的512Hz時鐘信號。這三種時鐘信號使用了20MHz和32768Hz鐘表晶振兩個晶體振蕩源,1Hz和512Hz信號分別由32768Hz信號經32768和64分頻得到。
顯示模塊 顯示模塊將本系統的測量值以8位十六進制數字的格式顯示輸出于8個數碼管,8個數碼管輪流顯示,掃描頻率為64Hz;十六進制7段譯碼電路在CPLD中實現,顯示模塊接收從CPLD發來的7段數碼信號和位選信號,7段數碼信號同時送給8個數碼管,位選信號經3-8譯碼后,選擇某位數碼管顯示,通過不同的7段數碼信號和位選信號可以實現8個數碼管的輪流顯示、實現8位十六進制數字的輸出。為了保證數碼管的亮度,顯示模塊使用了三極管擴展顯示電流。
CPLD核心模塊本模塊是系統的核心,最重要的是其功能的設計,將在下面詳細介紹。
4. CPLD的設計
CPLD的設計采用了Altera公司提供的MaxPlusII軟件,綜合使用了原理圖和硬件描述語言,頂層使用原理圖進行描述,各個模塊單元使用AHDL硬件描述語言進行描述。
CPLD接收按鍵輸入、時鐘輸入和被測脈沖信號輸入,并將測量結果以掃描的方式發送給外圍顯示模塊在數碼管進行顯示。CPLD的設計分為計數控制單元、計數器單元、顯示單元3個單元,其關系如圖2所示。
計數控制單元 計數控制單元控制整個系統的工作狀態,它接收按鍵、時鐘、被測信號輸入,輸出計數脈沖到計數器單元。計數控制單元完成選擇計數有效沿、切換工作模式、啟動測量及自動終止功能。
選擇計數有效沿(脈沖有效電平)是通過將被測脈沖輸入信號與“有效沿選擇寄存器”異或而實現的,其描述如下:
EdgeSelect.clk= nEdgeSelBut;%有效沿選擇寄存器%
EdgeSelect=!EdgeSelect; %輕觸按鍵,則翻轉有效沿%
Signal=SignalIn xor EdgeSelect;
通過選擇計數器的計數時鐘可以切換工作模式,其描述如下:
WorkingMode[].clk=ModeBut;%工作模式寄存器%
WorkingMode[]=WorkingMode[] + 1;%輕觸按鍵,則切換工作模式%
Case WorkingMode[]is%選擇計數器的計數時鐘%
When H"0"=>CounterClk=Signal;%脈沖計數%
When H"1"=>CounterClk=Signal and OneSec;%測頻%
When H"2"=>CounterClk=Signal and PulseWidth and Clock20M;%測脈寬%
When H"3"=>CounterClk=PulseWidth and Clock20M;%測周期%
End Case;
測量脈沖頻率的啟動與自動終止控制描述如下:
En1SCount.clk=nStartBut;%捕獲啟動按鍵%
En1SCount.clrn=!OneSec;%測量開始后清除捕獲%
En1SCOunt=VCC;
OneSec.clk=Clock1S;%每秒鐘監測啟動與自動終止%
OneSec.clrn=nClearBut and !ModeBut;
OneSec=En1SCount;%確定測量啟動與自動終止%
測量脈沖寬度與周期的啟動與自動終止控制描述如下:
CanPulse.clk=nStartBut;%捕獲啟動按鍵%
CanPulse.clrn=!PulseWidth;%測量開始后清除捕獲%
CanPulse=VCC;
PulseWidth.clk=!Signal;%監測啟動與自動終止%
PulseWidth.clrn=nClearBut and !ModeBut;
PulseWidth=CanPulse;%確定測量啟動與自動終止%
計數器單元計數器單元是一個32位的計數器,它接收計數控制單元輸出的計數脈沖,把此脈沖作為計數器的計數時鐘,計數值送給顯示單元進行顯示。計數器單元由32位寄存器組成,其時鐘通過控制單元控制,描述如下:
Counter[].clk=CounterClk;%計數時鐘%
Counter[]=Counter[] + 1;%加1計數%
Counter[].clrn=nClearBut and !ModeBut;%異步清零%
顯示單元顯示單元接收32位的計數值,將計數值分為8組,每組4位,在512Hz的顯示時鐘控制下,輪流選擇其中一組,對其計數值進行十六進制7段譯碼,將譯碼后的7段信息以及當前組的編號輸出CPLD,由CPLD的外圍顯示模塊顯示在相應的數碼管上。
顯示單元完成十六進制7段譯碼、掃描輸出等功能。掃描輸出的語言描述如下:
DispScan[].clk=Clock512;
DispScan[]=DispScan[] + 1;
十六進制7段譯碼的語言描述如下:
Table
NumDisplay[]=>Num7Seg[];
H"0"=>B"1111110";
H"1"=>B"0110000";
H"2"=>B"1101101";
H"3"=>B"1111001";
H"4"=>B"0110011";
H"5"=>B"1011011";
H"6"=>B"1011111";
H"7"=>B"1110000";
H"8"=>B"1111111";
H"9"=>B"1111011";
H"A"=>B"1110111";
H"B"=>B"0011111";
H"C"=>B"1001110";
H"D"=>B"0111101";
H"E"=>B"1001111";
H"F"=>B"1000111";
End Table;
CPLD的編程設計完CPLD的功能后,將CPLD的JTAG接口通過下載電纜連接到計算機打印口,使用MaxPlusII軟件即可編譯設計并下載到CPLD芯片內。
小 結
本系統基于一片CPLD芯片,實現了脈沖計數、測周、測頻等功能,可以完成部分邏輯分析儀的功能。通過自制本系統,既可以學習CPLD的設計,又制作了一臺實用的工具,值得廣大電子愛好者一試。