【正文】
15 DOWNTO 12)=0000 THEN QOU(23 DOWNTO 20)=1111。 QOU(19 DOWNTO 16)=1111。 QOU(15 DOWNTO 12)=1111。 QOU(11 DOWNTO 0)=DIN(11 DOWNTO 0)。 END IF。 IF DIN(23 DOWNTO 20)=0000 AND DIN(19 DOWNTO 16)=0000 AND DIN(15 DOWNTO 12)=0000 AND DIN(11 DOWNTO 8)=0000 THEN QOU(23 DOWNTO 20)=1111。 QOU(19 DOWNTO 16)=1111。 QOU(15 DOWNTO 12)=1111。 QOU(11 DOWNTO 8)=1111。 QOU(7 DOWNTO 0)=DIN(7 DOWNTO 0)。 END IF。 END IF。 END PROCESS。end Behavioral。該段代碼的編寫的主要原理是首先判斷小數(shù)點的位置,然后對小數(shù)點前的高位數(shù)從高到低依次進行判斷,如果高位為零則將數(shù)據(jù)取反,在后續(xù)譯碼中將不再顯示,從而實現(xiàn)高位無意義零的自動消隱。代碼編寫完成后保存編譯生成圖形文件符號如上圖:然后我們編寫數(shù)據(jù)顯示輸出文件,代碼如下:library IEEE。use 。use 。use 。entity DISPLAY1 is Port ( SEL : in STD_LOGIC_VECTOR (2 downto 0)。 OVERIN : IN STD_LOGIC。 DATAIN : in STD_LOGIC_VECTOR (23 downto 0)。 SEG : OUT STD_LOGIC_VECTOR (6 DOWNTO 0))。END DISPLAY1。architecture Behavioral of DISPLAY1 isSIGNAL DATA: STD_LOGIC_VECTOR (3 DOWNTO 0):=0000。BEGIN PROCESS(SEL,OVERIN) IS BEGIN CASE SEL IS 對位選信號進行判斷,對應(yīng)每一位分別提取數(shù)據(jù)中的不同位置的數(shù)據(jù)賦給中間信號DATA WHEN 000=DATA=DATAIN(3 DOWNTO 0)。 WHEN 001=DATA=DATAIN(7 DOWNTO 4)。 WHEN 010=DATA=DATAIN(11 DOWNTO 8)。 WHEN 011=DATA=DATAIN(15 DOWNTO 12)。 WHEN 100=DATA=DATAIN(19 DOWNTO 16)。 WHEN 101=DATA=DATAIN(23 DOWNTO 20)。 WHEN OTHERS=DATA=0000。 END CASE。 CASE DATA IS 對中間信號DATA進行譯碼,SEG為數(shù)碼管的數(shù)據(jù)顯示輸出,從而使不同位置上有不同的數(shù)字顯示 WHEN 0000=SEG=1000000。 WHEN 0001=SEG=1111001。 WHEN 0010=SEG=0100100。 WHEN 0011=SEG=0110000。 WHEN 0100=SEG=0011001。 WHEN 0101=SEG=0010010。 WHEN 0110=SEG=0000010。 WHEN 0111=SEG=1111000。 WHEN 1000=SEG=0000000。 WHEN 1001=SEG=0010000。 WHEN OTHERS=SEG=1111111。 END CASE。 if OVERIN=39。139。 THEN 判斷溢出,若溢出則令輸出全部不顯示 SEG=1111111。 END IF。 END PROCESS。end Behavioral。代碼編寫完成后保存編譯生成圖形文件符號如圖:,按照下圖連接各元件,保存編譯生成圖形文件符號如下圖:該模塊的輸入數(shù)據(jù)量太大難以仿真,故這里只對其中的掃描信號生成文件進行仿真,仿真文件代碼如下:LIBRARY ieee。USE 。USE 。USE 。ENTITY TBCTRLS_vhd ISEND TBCTRLS_vhd。ARCHITECTURE behavior OF TBCTRLS_vhd IS COMPONENT CTRLS PORT(CLK : IN std_logic。 SEL : OUT std_logic_vector(2 downto 0))。 END COMPONENT。 SIGNAL CLK : std_logic := 39。039。 SIGNAL SEL : std_logic_vector(2 downto 0)。BEGIN uut: CTRLS PORT MAP( CLK = CLK, SEL = SEL)。 tb : PROCESS BEGIN CLK=39。039。 WAIT FOR 100 NS。 CLK=39。139。 WAIT FOR 100 NS。 END PROCESS。END。結(jié)果如下:有仿真結(jié)果我們可以看出程序運行正常,邏輯上沒有任何問題。至此所有的單元電路全部完成。三、設(shè)計實現(xiàn) 頂層文件: ,按照下圖連接各模塊生成的圖形文件符號,完成后保存編譯。 管腳分配:由系統(tǒng)的頂層文件可以看到該系統(tǒng)的輸入端共有5個,輸出端有11個,:NET CLKIN LOC = T8。NET DCLK LOC = C16。NET DP LOC = C11。NET NECT LOC = D7。NET SE1 LOC = L6。NET SE10 LOC = N5。NET SE100 LOC = L7。NET SEG0 LOC = B14。NET SEG1 LOC = A13。NET SEG2 LOC = C13。NET SEG3 LOC = C12。NET SEG4 LOC = A12。NET SEG5 LOC = B12。NET SEG6 LOC = A11。NET SEL0 LOC = F8。NET SEL1 LOC = D8。NET SEL2 LOC = E7。 下載過程:光標(biāo)移至【Generate Programing File】后單擊鼠標(biāo)右鍵,然后單擊【Properties】在打開的對話框的左側(cè)欄選中【Configuration Options】將右側(cè)的Unused IOB Pins這一項改為Pull Up,單擊OK。在界面的左下角雙擊【 Generate Programing File】。將彈出的對話框關(guān)掉,雙擊【 Generate Prom, ACE,or JTAG File】在彈出的對話框中點擊Finish,然后點擊打開,在隨后的對話框中點擊Bypass。右鍵單擊左邊圖標(biāo)選擇Program,在隨后的對話框中單擊OK,文件將自動下載到開發(fā)板上,成功后,接入函數(shù)發(fā)生器進行測試。四、測試結(jié)果及結(jié)論經(jīng)過了前三步,最后我們將所完成的工程下載到了板子上,連接好函數(shù)發(fā)生器,并設(shè)定好了函數(shù)發(fā)生器的輸出信號電平(5Vpp),就可以進行使用了。 最后結(jié)果顯示程序工作正常,讀數(shù)清晰穩(wěn)定,完全符合開始時的要求。 誤差分析:我將函數(shù)發(fā)生器的頻率調(diào)節(jié)到999,999HZ時,頻率計不顯示,即產(chǎn)生了計數(shù)溢出,然后我進行了進一步的調(diào)節(jié),將函數(shù)發(fā)生器的頻率調(diào)節(jié)到999,單位為KHZ。由此可知相對誤差為177。%,誤差很小。所以本次實驗圓滿成功。通過對數(shù)字頻率計的設(shè)計實現(xiàn),我深入的學(xué)習(xí)了ise軟件的使用,VHDL語言的編寫規(guī)范,語法結(jié)構(gòu)等。在本次試驗中我回顧了在《數(shù)字電路》課程中學(xué)過的關(guān)于數(shù)字電路的設(shè)計的部分,了解了VHDL和Verilog語言的區(qū)別與聯(lián)系,以及它們的優(yōu)缺點,以及它們主要針對的設(shè)計對象。我覺得我通過本次試驗學(xué)會了很