數字集成電路作為當今信息時(shí)代的基石,不僅在信息處理、工業(yè)控制等生產(chǎn)領(lǐng)域得到普及應用,并且在人們的日常生活中也是隨處可見(jiàn),極大的改變了人們的生活方式。面對如此巨大的市場(chǎng),要求數字集成電路的設計周期盡可能短、實(shí)驗成本盡可能低,最好能在實(shí)驗室直接驗證設計的準確性和可行性,因而出現了現場(chǎng)可編程邏輯門(mén)陣列FPGA。對于芯片設計而言,FPGA的易用性不僅使得設計更加簡(jiǎn)單、快捷,并且節省了反復流片驗證的巨額成本。對于某些小批量應用的場(chǎng)合,甚至可以直接利用FPGA實(shí)現,無(wú)需再去訂制專(zhuān)門(mén)的數字芯片。 文中著(zhù)重介紹了一種基于FPGA利用VHDL硬件描述語(yǔ)言的數字秒表設計方法,在設計過(guò)程中使用基于VHDL的EDA工具ModelSim對各個(gè)模塊仿真驗證,并給出了完整的源程序和仿真結果。 1 總體功能結構設計 一個(gè)完整的數字秒表應具有計時(shí)、相應的控制以及計時(shí)結果顯示功能,總體的功能結構如圖1所示。黑色線(xiàn)框內是計數模塊、使能轉化模塊和顯示譯碼模塊,左邊是輸入控制信號,右邊是顯示計時(shí)結果的數碼顯示管,用六位BCD七段數碼管顯示讀數,顯示格式如圖2,計時(shí)范圍為:1小時(shí),精度為0.01s。 輸入時(shí)鐘信號由32MHz的石英晶振提供,考慮到設計指標要求秒表精度為0.01秒,計數脈沖的時(shí)鐘輸入就應該是頻率為100Hz的脈沖,所以先要設計一個(gè)320000分頻器,分頻器的輸出可作計數器的輸入;其次計數模塊設計應綜合考慮秒表的計時(shí)范圍(1小時(shí))和顯示輸出(6位輸出),6位輸出中有兩位是六進(jìn)制輸出,其余四位是十進(jìn)制輸出,所以可通過(guò)設計4個(gè)模10計數器和2個(gè)模6計數器來(lái)實(shí)現,其中較低位的進(jìn)位輸出就是高位的計數輸入端。 控制模塊應包括開(kāi)始計時(shí)/停止計時(shí)、復位兩個(gè)按鈕,即電路設計經(jīng)常用到的使能端和清零端,這兩個(gè)控制端口直接接到計數器的清零和史能端即可實(shí)現復位、開(kāi)始計時(shí)/停止計時(shí);但是外圍使能輸入需要經(jīng)過(guò)使能轉換電路后,才可變?yōu)橛嫈灯骺捎玫氖鼓芸刂菩盘。因此在輸入使能信號和計數器使能輸入之間需設計一個(gè)信號轉換模塊。 顯示計數結果的模塊實(shí)現較為簡(jiǎn)單,只需將六位計數結果通過(guò)七段譯碼電路接到輸出即可點(diǎn)亮數碼管,無(wú)需時(shí)序控制,直接用組合邏輯電路就可以實(shí)現。數碼管顯示可以采用掃描顯示,用一個(gè)頻率1KHz的信號掃描一個(gè)多路選擇器,實(shí)現對六位已經(jīng)鎖存的計數結果的掃描輸出。 2 各功能模塊設計 2.1 分頻器模塊 分頻器的功能是提供標準時(shí)鐘控制信號以精確控制計數器的開(kāi)閉,提供的標準信號是32MHz,根據設計精度0.01s的要求,輸出信號是100Hz,所以該分頻器實(shí)現的功能是320000分頻,具體的VHDL源程序: process(clk) begin if(clk'event and clk='1')then if (q=159999)then q<=0; count_temp<=not count_temp; else q<=q 1; end if; end if; end process; 2.2 計數模塊 該計數器要實(shí)現最大計數值為59分59秒99的計數,而且為了數碼管顯示方便,該模塊必須通過(guò)計數器的級聯(lián)來(lái)實(shí)現,即首先分別設計一個(gè)模6計數器和一個(gè)模10計數器,然后將他們級聯(lián),其中調用4次模10計數器、2次模6計數器,這樣可以比直接設計模100 的計數器和模60的計數器節省資源。級聯(lián)時(shí)低位的計數進(jìn)位輸出接高位的計數輸入端,如圖3所示。再考慮到控制模塊的要求,每個(gè)計數器有三個(gè)輸入端:時(shí)鐘、使能和清零,兩個(gè)輸出端:計數輸出和進(jìn)位輸出,采用同步使能異步清零的設計方法,每個(gè)計數器的使能和清零端都與外圍的使能和清零端相聯(lián)。 ![]() 該模塊的源程序以及ModelSim仿真輸出結果如下: ![]() 模6計數器的VHDL源程序如下: process(clear,clk) begin if (clear='1') then tmp<="0000"; carryout<='0'; elsif(clk'event and clk='1') then if (rst='0') then if (tmp="0101") then carryout<='1'; tmp<="0000"; else tmp<=tmp 1; carryout<='0'; end if; end if; end if; 模10計數器的VHDL源程序與模6計數器類(lèi)似,為節省篇幅,不再給出。 2.3 使能信號轉換模塊 數字秒表輸入的開(kāi)始和停止信號是單個(gè)脈沖信號,而計數器要持續計數所需的使能信號是持續的高電平,所以需要通過(guò)使能控制電路實(shí)現使能信號的轉換。該模塊的VHDL源程序以及ModelSim仿真輸出結果如下: 該模塊源程序: process(enablein) begin if(enablein'event and enablein='1')then temp<= not temp; end if ; end process; 2.4 譯碼顯示模塊 由上面的設計可知,計數器輸出為二進(jìn)制碼,不能直接點(diǎn)亮數碼管,要想將計數結果通過(guò)數碼管顯示必須再設計一個(gè)七段譯碼電路,以便將計數結果輸出。通過(guò)分析可知該譯碼器是一個(gè)4輸入,7輸出元件,其真值表如表1所示: ![]() 根據以上真值表可寫(xiě)出譯碼電路VHDL源程序如下: process(datainput) begin case datainput is when "0000"=>dataoutput<="0000010"; when "0001"=>dataoutput<="1001111"; when "0010"=>dataoutput<="0010001"; when "0011"=>dataoutput<="0000101"; when "0100"=>dataoutput<="1001100"; when "0101"=>dataoutput<="0100100"; when "0110"=>dataoutput<="0100000"; when "0111"=>dataoutput<="0001111"; when "1000"=>dataoutput<="0000000"; when "1001"=>dataoutput<="0000100"; when others=>dataoutput<="1111111"; end case; end process; 3 功能驗證以及下載實(shí)現 完成以上各個(gè)子模塊的設計后,該數字秒表的模塊設計就基本完成了,剩下的工作就是通過(guò)一個(gè)頂層文件將各個(gè)子模塊連接起來(lái)。在頂層文件中可以將以上各個(gè)子模塊看作一個(gè)個(gè)黑匣子,只將其輸入輸出端對應相連就可以了。下面是該頂層文件的VHDL源程序: architecture Behavioral of topfile is signal clk:std_logic:='0'; signal enableout:std_logic:='0'; signal data0,data1,data2, data3,data4,data5:std_logic_vector(3 downto 0):="0000"; component abc port(clk:in std_logic; dout: out std_logic); end component; component enable port(enablein:in std_logic; enableout: out std_logic); end component; component highlevel port(rst,clk,clear:in std_logic; output1,output2,output3, output4,output5,output6: out std_logic_vector(3 downto 0); carryout: out std_logic); end component; component yima port(datainput:in std_logic_vector(3 downto 0); dataoutput: out std_logic_vector(6 downto 0)); end component; begin u0:abc port map(clkin,clk); u1:enable port map(enablein,enableout); u2:highlevel port map(enableout,clk,clear,data0,data1,data2,data3,data4,data5); u3:yima port map(data0,dataout0); u4:yima port map(data1,dataout1); u5:yima port map(data2,dataout2); u6:yima port map(data3,dataout3); u7:yima port map(data4,dataout4); u8:yima port map(data5,dataout5); end Behavioral; 由于各個(gè)子模塊都已經(jīng)經(jīng)過(guò)驗證無(wú)誤,并且頂層文件中不涉及復雜的時(shí)序關(guān)系,相當于只是將各個(gè)模塊用導線(xiàn)連接起來(lái),只要各個(gè)端口的連接對應正確即可,所以不需寫(xiě)專(zhuān)門(mén)的test bench進(jìn)行驗證。完成以上設計后,即可進(jìn)行邏輯綜合,綜合無(wú)誤后進(jìn)行管腳適配,生成.bit文件然后下載到實(shí)驗板上測試。經(jīng)過(guò)反復多次測試,以上設計完全滿(mǎn)足了預期的設計指標,開(kāi)始/停止按鍵和清零按鍵都能準確的控制秒表的運行,七段顯示數碼管也能夠準確的顯示計時(shí)結果。通過(guò)與標準秒表對比,該設計的計時(shí)誤差在0.03s以?xún),而這其中也包括實(shí)驗板上晶振由于長(cháng)期使用所帶來(lái)的誤差。 4 結束語(yǔ) 本文所介紹數字秒表設計方法,采用了當下最流行的EDA設計手段。在Xinlinx FPGA開(kāi)發(fā)環(huán)境下,采用至上而下的模塊化設計方法,使得系統開(kāi)發(fā)速度快、成本低、系統性能大幅度提升。通過(guò)實(shí)驗驗證,本文設計的數字秒表計時(shí)準確、性能穩定,可以很容易嵌入其他復雜的數字系統,充當計時(shí)模塊。 利用EDA設計工具,結合基于FPGA的可編程實(shí)驗板,輕松實(shí)現電子芯片的設計,現場(chǎng)觀(guān)察實(shí)驗結果,大大縮短了產(chǎn)品的設計周期和調試周期,提高了設計的可靠性和成功率,體現了邏輯器件在數字設計中優(yōu)越性。 來(lái)源:網(wǎng)絡(luò ) |