【正文】
end Behavioral。 end if。 numout5=numin5。 numout3=numin3。 numout1=numin1。 end latch。 numout5 : out std_logic_vector(3 downto 0)。 numout3 : out std_logic_vector(3 downto 0)。 numout1 : out std_logic_vector(3 downto 0)。 numin6 : in std_logic_vector(3 downto 0)。 numin4 : in std_logic_vector(3 downto 0)。 numin2 : in std_logic_vector(3 downto 0)。 overin : in std_logic。 use 。 use 。 end structure。 end process。 elsif rising_edge(csignal) then 附錄 34 over1 = carry6 or over1。 then over1= 39。 process (clear,csignal) begin if clear = 39。 U5 : counter Port map ( rst = clear, clk = Csignal, carry_in = carry4, carry_out = carry5, count_out = result5 )。 U3 : counter Port map ( rst = clear, clk = Csignal, carry_in = carry2, carry_out = carry3, count_out = result3 )。 begin U1 : counter Port map ( rst = clear, clk = Csignal, carry_in = count_en, carry_out = carry1, count_out = result1 )。 signal carry1,carry2,carry3,carry4,carry5,carry6: std_logic。 附錄 33 count_out : out std_logic_vector(3 downto 0))。 carry_in : in std_logic。 end counter6。 result5 : out std_logic_vector(3 downto 0)。 result3 : out std_logic_vector(3 downto 0)。 result1 : out std_logic_vector(3 downto 0)。 count_en : in std_logic。 entity counter6 is port(Csignal : in std_logic。 use 。 附 錄 附錄 1. 計數(shù)器級聯(lián)程序 library IEEE。如本來可以實現(xiàn)測量檔 位的自動切換。 VHDL 語言來實現(xiàn)基于 FPGA 的實際工程項目, 理論和實踐沒有有機的聯(lián)系起來,理論沒有起到應(yīng)有的指導(dǎo)作用。 附錄 32 心得體會: 我認為本次實驗讓我對高層次的電路設(shè)計有了一個更加深刻的理解和認識,實驗中的主要困難在于程序的鏈接調(diào)試,實驗之后感覺自己已經(jīng)能夠適應(yīng)這種 設(shè)計方式了。但當(dāng)被測信號頻率較低時,測試精度較低,誤差變大。詳細介紹了測量原理,設(shè)計方案以及各模塊的設(shè)計過程及其實現(xiàn)的功能,并對設(shè)計中遇到的問題作了分析和處理;利用 ISE 和 ModelSim 對設(shè)計進行了仿真,分析,綜合, 并最終下載到SpartanII 系列芯片中,實現(xiàn)了對頻率的測量。 測量結(jié)果表明該設(shè)計達到了最初的提出的所有設(shè)計要求。在做高頻的對比測量時 發(fā)現(xiàn) , 頻率計的讀數(shù)誤差較大,約有萬分之一左右 。 測試結(jié)果 在成功下載并運行后,為評估該設(shè)計系統(tǒng)的實際測量效果,做了一次對比實驗,選用F40 型數(shù)字合成函數(shù)信號發(fā)生器 /計數(shù)器提供輸入信號 。需要注意的是一些端口是固定的,不能胡亂的連接。 圖 424 頂層原理圖仿真的局部放大 附錄 31 圖 425 頂層原理圖仿真圖整體 分配引腳和下載實現(xiàn) 全部 仿真通過后,就運行 ISE 的設(shè)計實現(xiàn),然后再打開 XILINX PACE,在里面分配引腳,即實現(xiàn)設(shè)計的輸入輸出端口與實際芯片的輸入輸出端口的對應(yīng)連接。在仿真圖上可以看出程序的綜合的確達到了我們的要求。原理圖過大,可參考附錄。 仿真結(jié)果如下: 附錄 30 圖 423 顯示譯碼控制模塊的仿真 圖 第四章 數(shù)字式頻率計的實現(xiàn) 頂層原理圖 將各程序生成的模塊按我們的要求連接就形成了頂層原理圖。 end process。 when others = null。139。139。139。039。 end if。 then hide = 39。 and freq_value5 = 0000 and freq_value4 = 0000 and freq_value3 = 0000 and dp1 /= 39。 when 011 = if q_over = 39。139。039。 end if。 and freq_value5 = 0000 then hide = 39。 case sel is 附錄 29 when 101 = if q_over = 39。 hide_zero:process (sel,q_over,dp1,dp2,freq_value5,freq_value4,freq_value3,freq_value2) begin hide = 39。 end case。 when 101 = out5 = led。 when 011 = out3 = led。 when 001 = out1 = led。 out5=1111111。 out3=1111111。 out1=1111111。 end process。 end case。 when 1001 = led = 0000100。 when 0111 = led = 0001111。 when 0101 = led = 0100100。 when 0011 = led = 0000110。 when 0001 = led = 1001111。139。 附錄 28 bcd2led : process (hide,data) begin led = 1111111。 end case。 when 100 = data = freq_value4。 when 010 = data = freq_value2。 mux:process(sel,freq_value0,freq_value1,freq_value2,freq_value3,freq_value4,freq_value5) begin case sel is when 000 = data = freq_value0。 end if。 else sel = sel + 1。 signal led : std_logic_vector(6 downto 0)。 signal hide : std_logic。 end multi。 freq_value4,freq_value5 : in std_logic_vector(3 downto 0)。 freq_value0,freq_value1 : in std_logic_vector(3 downto 0)。 entity multi is port(f1khz,q_over : in std_logic。 use 。 其生成模塊如下: 圖 422 顯示譯碼控制模塊 附錄 27 其源程序如下 : library IEEE。實現(xiàn)最終結(jié)果的數(shù)字顯示。同時本模塊還實現(xiàn)了無意義零的消隱。這樣就可以用一個譯碼器來實現(xiàn)對六個 4 位二進制數(shù)的譯碼。具體程序參考附錄。其生成的功能模塊如圖所示: 圖 421 鎖存器模塊 這模塊實現(xiàn)了對六位計數(shù)結(jié)果和溢出信號 over 的鎖存功能。級聯(lián)成六位計數(shù)器的 仿真圖如下: 圖 420 六位計數(shù)器的仿真圖 鎖存器 如果計數(shù)器輸出直接與譯碼器相連接,那么在計數(shù)過程中輸出端則隨輸入脈沖數(shù)的增加而不斷跳變,那么顯示數(shù)碼管則也會不斷閃爍跳變,讓人不能看到穩(wěn)定的輸出,設(shè)鎖存器后,則不再跳變,便可清晰讀出計數(shù)結(jié)果。計數(shù)器輸出端與鎖存器輸入端對接,而進位輸出端則依次接到下一位計數(shù)器的保持端 cout_en,惟第六位即最高位的進位輸出作為溢出標志用over 來表示,用以顯示計數(shù)器計數(shù)是否溢出,溢出了就更換大一級的檔位。 被測信號接至此計數(shù)器的 Csignal。 仿真圖如下圖所示: 圖 418 單個計數(shù)器的仿真圖 附錄 25 由仿真圖可以看出,程序的綜合出來的這個計數(shù)器的確實現(xiàn)我們預(yù)定的要求。039。139。139。 count_out=count。 end if。 else null。 else count = 0000。139。139。 elsif clk39。139。 architecture Behavioral of counter is signal count: std_logic_vector(3 downto 0):=0000。 count_out : out std_logic_vector(3 downto 0))。 carry_in : in std_logic。 use 。 use 。 Count_out 是計數(shù)結(jié)果輸出,carry_out 是進位信號。高質(zhì)量的測頻控制信號發(fā)生器的設(shè)計十分重要,設(shè)計中要對其進行仔細的實時仿真,防止可能產(chǎn)生的毛刺。由圖可見,在計數(shù)完成后,即計數(shù)使能信號 Gate 在 1S 的高電平后,利用其反相值產(chǎn)生一個鎖存信號latch,由于反相器的器件延時,鎖存信號的上升沿是在計數(shù)使能信號即閘門信號 Gate 的下降沿之后,即是計數(shù)完了才鎖存的,符合我們的設(shè)計要求。 圖 416 測頻控制器的仿真圖 如果閘門信號 Gate 的頻率取 1Hz,那么信號 Gate 的脈寬恰好為 1S,可以用作計數(shù)閘門信號。 end Behavioral。 latch=G2。 end process。 if falling_edge(bsignal) then G2=not G1。 begin process(Bsignal,G1) begin if rising_edge(Bsignal) then G1=not G1。 architecture Behavioral of control is signal G1,G2: std_logic:=39。 latch : out std_logic)。 Gate : out std_logic。 use 。 use 。鎖存信號之后,必須有一清零信號 Reset 對計數(shù)器進行清零,為下 1 秒鐘的計數(shù)操作準備。在