




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、數字頻率計的設計一、頻率計實現的功能要設計的頻率計的測量范圍為1MHz。為了提高測量的精度,量程分為三檔,分別是:10kHz、100kHz、1MHz。并要求在測量頻率大于或小于選擇的量程時,頻率計自動換檔。1、當讀數大于999時,頻率計處于超量程狀態,下一次測量時,量程自動增加一檔。2、當讀數小于009時,頻率計處于欠量程狀態,下一次測量時,量程自動減小一檔。3、當超出測量范圍時,顯示錯誤。4、在計數時不顯示數據,計數完成后只顯示測量結果。5、小數點位置要自動移位。二、頻率計各部分的分析在這個設計中,需要用計數器來進行計數,而且計數器在各個檔位要被重復使用,在測量的過程中,計數允許時鐘信號還要
2、進行調整,故將計數器設計成一個單獨的模塊,提供計數值的輸出。顯示結果包括數值顯示,檔位顯示及溢出標志顯示。其中數值顯示要用到三個數碼管,實驗箱上連在一起的三個數碼管中,只有兩個數碼管內部接有譯碼器,因此我們自己還要在程序中為那個沒有譯碼器的數碼管再加一段七段譯碼器程序來顯示結果。檔位標志由三個LED燈來顯示,代替數碼管上的小數點的功能。溢出標志由兩個LED燈來顯示,其中一個顯示結果溢出,另一個顯示輸入信號在測量范圍之內。該頻率計的頂層邏輯電路原理圖如圖(1)所示:圖(1)三、頻率計各部分的設計和實現 從上面的分析可以知道,頻率計可以由三個模塊來組成。下面對各個模塊的設計方法和實現方法進行詳細說
3、明。1、時基進程的設計和實現 在實際使用時,輸入的信號是隨意的,沒有辦法預知輸入的頻率。因此選取頻率計的時基是非常重要的。在設計要求中,將量程分為三檔,在某一檔進行測量時,需要提供該檔的時基。在10kHz檔,該檔最大讀數為9.99kHz,最小讀數為0.01 kHz,所以要提供的時基是頻率為0.01 kHz的脈沖。同理,在100 kHz檔上,要提供的時基應該是頻率為0.1 kHz的脈沖。在1 MHz檔上,要提供的時基是頻率為1 kHz的脈沖。這三種脈沖信號從輸入信號中提取,可以采用分頻的方法來產生。將輸入信號先進行分頻產生1 kHz的脈沖信號,然后將分頻后的1 kHz信號通過一個10倍的分頻器,
4、產生0.1 kHz的脈沖信號,同時使用一個100倍分頻器對1 kHz的信號分頻產生0.01 kHz的脈沖信號。在測量頻率時,采用輸入信號作為時基,以輸入信號為時鐘,用一個計數器測量在一個時基周期里輸入的信號的周期數,這樣就可以得到輸入信號的頻率。產生一個高電平為時基信號周期的脈沖信號作為時基,使得能夠在程序中以“如果時基信號為1”作為判斷條件,如果滿足條件則計數器開始計數。同理,在設計中還要產生高電平為時基信號周期的1/10和1/100的脈沖信號作為時基。這三種時基采用有限狀態機來實現。狀態機采用1kHz的脈沖信號觸發,由于還要產生高電平為10ms和1ms的脈沖信號,故采用100個狀態的有限狀
5、態機。要產生高電平為1ms的脈沖信號,只要在狀態99的時候產生高電平,狀態100的時候恢復到低電平即可。要產生高電平為10ms的脈沖信號,只要在狀態90的時候產生高電平,在狀態100的時候恢復到低電平即可。需要產生哪一個時基就根據此時頻率計所在的檔位作為判斷條件進行控制。在100個狀態中,很多狀態的功能是相同的,可以將它們合并在一起。2、計數器的設計和實現 為了計數方便,將計數器定義成一個整型信號。只要使用“計數器<=計數器+1;”就可以。這個計數值要作為顯示輸出,就要將這個計數器用個位、十位、百位分開表示,并且要遵循加法規則。這樣可以直接通過七段譯碼器進行顯示。在不同的檔位,小數點的位
6、置是不同的,可以用小數點的顯示所在的檔位為判斷條件。由于實驗箱上的數碼管沒有小數點的,故在實驗板上用三個LED燈來代替小數點的現實。 計數器的VHDL語言描述如程序1所示。其中,reset為異步置位端口,sig_clk為時鐘輸入端口,en為信號輸入端口,q1為計數值的個位輸出端口,q2為計數值的十位輸出端口,q3為計數值的百位輸出端口。cou1為計數值的個位,cou2為計數值的十位,cou3為計數值的百位。ctrcou為控制計數功能的進程,outctr為控制計數值輸出的進程。 程序1:library ieee;use ieee.std_logic_1164.all;use ieee.std_l
7、ogic_arith.all;use ieee.std_logic_unsigned.all;entity counter isport(reset:in std_logic; sig_clk:in std_logic; -時鐘輸入端口 en:in std_logic; -信號輸入端口 q1:out std_logic_vector(3 downto 0); -計數值的個位輸出端口 q2:out std_logic_vector(3 downto 0); -計數值的十位輸出端口 q3:out std_logic_vector(3 downto 0); -計數值的百位輸出端口end;archit
8、ecture count of counter issignal cou1:std_logic_vector(3 downto 0); -計數值的個位signal cou2:std_logic_vector(3 downto 0); -計數值的十位signal cou3:std_logic_vector(3 downto 0); -計數值的百位begin-控制計數功能的進程ctrcou:process(reset,sig_clk)begin if reset='1' thencou1<= "0000"cou2<= "0000"
9、cou3<= "0000" elseif sig_clk 'event and sig_clk = '1' then if en ='1' thenif cou3 = "1010" then cou3 <="1010"elsif cou3 ="1001" and cou2 ="1001" and cou1 = "1001" thencou1 <= "0000"cou2 <= "000
10、0"cou3 <= "1010" elsif cou1 ="1001" and cou2 ="1001" thencou1 <= "0000"cou2 <= "0000"cou3 <=cou3+1;elsif cou1 ="1001" thencou1 <="0000"cou2 <=cou2+1;elsecou1<=cou1+1;end if; else cou1 <= "0000&quo
11、t; cou2 <= "0000" cou3 <= "0000"end if;end if; end if;end process ctrcou;-控制計數值輸出的進程outctr: process(reset,en)begin if reset= '1' then q1 <="0000" q2 <= "0000" q3 <= "0000" else if en 'event and en ='0' then q1 <=
12、 cou1; q2 <= cou2; q3 <= cou3; end if; end if;end process outctr;end count;3、七段譯碼器的設計和實現 七段譯碼器將輸入的從09的4位二進制數,以七段譯碼的方式輸出。使用一個7位向量來分表表示七段譯碼器種的七段。程序如程序2所示: 程序2:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity view isport(in_data:in std_l
13、ogic_vector(3 downto 0); -輸入的二進制數out_data:out std_logic_vector(0 to 6); -輸出的譯碼end view;architecture ouview of view isbegin process(in_data) begin case in_data is when "0000"=>out_data <="1111110" -0的顯示 when "0001"=>out_data <="0110000" -1的顯示 when &
14、quot;0010"=>out_data <="1101101" -2的顯示 when "0011"=>out_data <="1111001" -3的顯示 when "0100"=>out_data <="0110011" -4的顯示 when "0101"=>out_data <="1011011" -5的顯示 when "0110"=>out_data <=&q
15、uot;1011111" -6的顯示 when "0111"=>out_data <="1110000" -7的顯示 when "1000"=>out_data <="1111111" -8的顯示 when "1001"=>out_data <="1111011" -9的顯示 when others=>out_data <="0110001" end case; end process; end o
16、uview;其中in_data表示輸入的4位二進制數的端口,out_data為七段譯碼輸出端口。4、有限狀態機的設計和實現有限狀態機程序如程序3所示。state是用于產生時基的狀態機類型。在其中有開始狀態(start)、判斷狀態(judge)、計數狀態1(count1)、計數狀態289 (count2to89)、計數狀態90(count90)、計數狀態9198(count91to98)、計數狀態99(count99)、計數狀態100(count100)。由于計數狀態289是相同的,所以將它們合成一個,同樣對計數狀態9198也進行合并。由于時基信號都要在計數狀態100時清零,所以計數狀態100單
17、獨提取。產生高電平為100ms的時基需要在計數狀態1的時候將時基信號置1,從199計數狀態只有99ms,在計數狀態1之前的judge狀態中,如果處于10kHz的檔位,就要將時基信號置1。產生高電平為10ms的時基,需要在計數狀態90將時基信號置1。產生高電平為1ms的時基,需要在計數狀態99的時候將時基信號置1,所以計數狀態1、計數狀態90和計數狀態99要單獨提取。程序3中,mycrm是一個state類型的信號,信號crmcou用于狀態機中的計數器,其計數值從0到100,信號clk1k為產生的頻率為1kHz的脈沖信號。標志信號flag用于標志不同的檔位,當flag為0時表示10kHz的測頻檔,
18、當flag為1時表示100kHz的測頻檔,當flag為2時表示1MHz的測頻檔,當它為其他時表示溢出。程序3:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cymometer isport(areset:in std_logic; aclk:in std_logic;q2_in:in std_logic_vector(3 downto 0);enclk,cntok,cntov:out std_logic;dot:out st
19、d_logic_vector(2 downto 0); -小數點的輸出end;architecture cym of cymometer istype state is (start,judge,count1,count2to89,count90,count91to98,count99,count100);signal mycrm:state;signal crmcou:integer range 0 to 100;-狀態機中的計數器signal clk1k:std_logic; -1kHz的脈沖信號signal cou1s:integer range 0 to 999; -產生1s顯示計時信
20、號的計數器signal clk1s:std_logic;-產生1s顯示計時信號的脈沖信號signal flag:std_logic_vector(1 downto 0);-測頻檔的標志begin-使用2KHz的脈沖產生頻率為1KHz的脈沖進程crclk1k:process(areset,aclk)beginif areset = '1' then-計數器清零clk1k<='0'elseif aclk 'event and aclk = '1' thenclk1k <= not clk1k;end if;end if;end p
21、rocess crclk1k;-產生1S的顯示計時信號cr1s: process(areset,clk1k)beginif areset = '1' thencou1s <= 0;clk1s <= '0'elseif clk1k 'event and clk1k = '1' thenif cou1s =997 thenclk1s <= not clk1s;cou1s<=cou1s+1;elsif cou1s =999 thenclk1s <= not clk1s;cou1s<=0;elsecou1s &
22、lt;= cou1s +1;end if;end if;end if;end process cr1s;-控制小數點的顯示crdot:process(flag)begin case flag iswhen "00"=> dot <="100"when "01"=> dot <="010"when "10"=> dot <="001"when others=> dot <="111" end case;end
23、process crdot;-用于產生時基的狀態機cretimer:process(areset,clk1k)begin if areset = '1' then cntov<='0'cntok<='0' crmcou<=0;enclk<= '0'flag <= "01"mycrm <= start; else if clk1k'event and clk1k='1' then case mycrm is when start=> -開始狀態if
24、 clk1s='1' then crmcou<=0; enclk<='0' mycrm<=judge;elsemycrm<=start;if q2_in ="0000" or q2_in ="1010" thencntov <='1'cntok <= '0'else cntov <='0'cntok <='1'end if;end if; when judge=> -判斷狀態if flag="11
25、" then -溢出檔 if q2_in ="1010" then flag<="11" else flag<="10" end if; elsif flag="00" then-10kHz測頻檔if q2_in ="0000" then flag<="00" enclk<='1' elsif q2_in ="1010" then flag<="01"elseflag<=fl
26、ag; end if; elsif flag="01" then -100kHz測頻檔 if q2_in="0000" then flag<= flag-1;enclk<='1' elsif q2_in="1010" then flag<= flag+1; else flag<=flag; end if; else -1MHz測頻檔 if q2_in="0000" then flag<= flag-1; elsif q2_in="1010" then
27、 flag<= flag+1;else flag<=flag; end if; end if; mycrm<= count1; -狀態轉移到計數狀態1 when count1=> -計數狀態1 if flag="00" then enclk<='1' end if; crmcou<= 1; mycrm<= count2to89; when count2to89=> -計數狀態289 if crmcou=88 then crmcou<=89; mycrm<= count90; else crmcou&
28、lt;= crmcou+1; mycrm<= count2to89; end if; when count90=> -計數狀態90 if flag="01" then enclk<='1' end if; crmcou<=90; mycrm<= count91to98; when count91to98=> -計數狀態9198 if crmcou=97 then crmcou<=98; mycrm<= count99; else crmcou<=crmcou+1; mycrm<=count91to9
29、8; end if; when count99=> -計數狀態99 if flag="10" or flag="11" then enclk<='1' end if; crmcou<=99; mycrm<=count100; when count100=> -計數狀態100 crmcou<=100; enclk<='0' mycrm<=start; when others=> null; end case; end if; end if; end process cre
30、timer; end cym;5、頻率計的綜合設計將前面設計好的模塊例化到一個程序里,組成了所要設計的頻率計。程序如程序4所示。程序4:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity plj isport(reset:in std_logic;clk:in std_logic;testsignal:in std_logic;q1:out std_logic_vector(3 downto 0);q2:out std_logic
31、_vector(3 downto 0);q3:out std_logic_vector(0 to 6);cntok,cntov:out std_logic;dot:out std_logic_vector(2 downto 0);-小數點的輸出attribute lock :string;-引腳鎖定attribute lock of reset:signal is"34"attribute lock of clk:signal is"20"attribute lock of testsignal:signal is"52"attrib
32、ute lock of q1:signal is"53,54,55,56"attribute lock of q2:signal is "57,58,59,60"attribute lock of q3:signal is "81,80,79,78,77,76,75"attribute lock of cntok:signal is "17"attribute lock of cntov:signal is "15"attribute lock of dot:signal is "71
33、,70,69"end;architecture rtl of plj iscomponent cymometer -對控制器進行元件說明port(areset:in std_logic;aclk:in std_logic;q2_in:in std_logic_vector(3 downto 0);enclk,cntok,cntov:out std_logic;dot:out std_logic_vector(2 downto 0);-小數點的輸出end component;component counter -對計數器進行元件說明port(reset:in std_logic; si
34、g_clk:in std_logic;-外部時鐘輸入 en:in std_logic;-時基信號 q1:out std_logic_vector(3 downto 0);-計數值個位 q2:out std_logic_vector(3 downto 0);-計數值十位 q3:out std_logic_vector(3 downto 0);-計數值百位end component;component view is-引用七段譯碼器 port(in_data:in std_logic_vector(3 downto 0);out_data:out std_logic_vector(0 to 6);
35、end component;signal en_s:std_logic;-子模塊之間接口信號說明signal q3out_s:std_logic_vector(3 downto 0);begin-在結構體描述中使用元件例化語句U0: cymometer port map (reset,clk,q3out_s,en_s,cntok,cntov,dot);U1: counter port map (reset,testsignal,en_s,q1,q2,q3out_s);U2: view port map (q3out_s,q3);end rtl;四、仿真與測試我們選用軟件ModelSim SE
36、6.0來進行功能仿真;由于譯碼器比較簡單,而且又不涉及時鐘信號,故將譯碼器的仿真略去。以下分別是計數器、狀態機和整合后的頻率計的仿真波形:1、計數器的仿真:圖(2)、圖(3)為計數器的仿真波形,仿真時間設為0s, sig_clk即待測信號設定初值為0,周期20us,占空比50%,reset即復位信號設定初值為1,周期為1s,占空比為1%,en即計數允許信號設定初值為0,周期為24ms,占空比為50%。對波形的分析如下:圖(2)圖(3)(1)、圖(2)和圖(3)的仿真設定值一樣,不同之處在于圖(3)將圖例放得較大些。(2)reset為0,en為1時,計數器才能開始計數。(3)采用sig_clk的上升沿計數,en的周期為24ms,高電平持續12ms,sig_clk的周期為20us,即20us一個上升沿,則計數初值為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 血液系統疾病的護理
- 節能電池考試題及答案
- 江蘇保安考試題及答案
- 沙漠壓力測試題及答案
- EMC布線考試題及答案
- 林草局遴選試題及答案
- 弱電安防面試題及答案
- 2025年隔膜電解裝置項目申請報告模板
- 低碳城市規劃與城市綠色建筑運營維護實踐案例分析報告
- 2025年在線教育平臺用戶滿意度提升策略與商業模式創新報告
- 2023年黑龍江省文化和旅游系統事業單位人員招聘筆試模擬試題及答案解析
- 2023年江西新余市數字產業投資發展有限公司招聘筆試題庫含答案解析
- LY/T 3323-2022草原生態修復技術規程
- 部編版六年級語文下冊課件第1課《北京的春節》《臘八粥》
- 涂裝工模擬練習題含答案
- 2023-2024學年河南省永城市小學數學二年級下冊期末評估測試題
- 乳腺疾病的超聲診斷 (超聲科)
- 服務精神:馬里奧特之路
- 《建筑施工安全檢查標準》JGJ59-2011圖解
- 華為大學人才培養與發展實踐
- 醫療垃圾廢物處理課件
評論
0/150
提交評論