車保川
摘要:本文介紹了一種新型的基于FPGA的數字秒表的設計與實現方法,給出了頂層電路圖,和各模塊的設計,增加了消除抖動的控制方法,消除了開關按鍵的機械抖動。通過編輯、編譯和器件編程,用MODELSIM仿真軟件進行了仿真,并將編程器文件下載到ISP實驗板TB-BD-TS101開發(fā)板中,經實際電路測試驗證,達到了預期的設計要求,顯示結果準確無誤。
關鍵詞:FPGA;數字秒表;模塊;開關按鍵
中圖分類號:TN702 文獻標識碼:A
1前言
當今社會是數字化的社會,是數字集成電路廣泛應用的社會。數字集成電路本身在不斷更新換代,隨著電子技術的發(fā)展,設計人員更希望設計周期盡可能短,最好能在實驗室、調試現場完成對邏輯塊和連線的配置,并且立即投入實際應用之中,因而出現了現場可編程邏輯門陣列FPGA。
本文介紹了如何利用FPGA設計與實現數字秒表的全過程,利用了超高速硬件描述語言VHDL的EDA設計工具,采用的是Xinlinx 的低成本系列中的Spartan-3,型號為XC3S400-4PQ208C的芯片來實現系統功能,采用分模塊化思想編程,開關按鍵集計數、停止、清零與一體,節(jié)省資源,思路簡單,容易實現。
2秒表的功能要求
設計一個秒表stopwatch要求具有以下功能:有一個復位reset端子SW10,reset低電平有效;一個開關起、停、清零start/stop/clear端子SW7,系統啟動后,第一次按SW7,秒表開始計數,第二次按SW7,秒表停止計數,第三次按SW7秒表清零。其頂層模塊如圖1 所示。
板子的主頻時鐘我們用32MHZ,秒表動態(tài)的顯示在TS101板子的D5,D6,D7,D8 LED上,D5,D6表示分鐘位,D7,D8表示秒鐘,D6的小數點亮,表示分鐘和秒鐘的分隔。
3系統的模塊設計
圖2所示是數字秒表設計的頂層模塊圖,其中CLKIN是32MHz系統時鐘,RST是復位信號,可以對整個系統清零。
該模塊圖主要分為四個部分,第一部分是DCM(Digital Clock Manager)調用模塊。通過DCM的應用,可以去除時鐘歪斜、頻率綜合與相位調整。
第二部分是消抖模塊,因為開關按鍵為機械彈性開關,由于機械觸點的彈性作用,一個按鍵開關在按下的瞬間會有一連串的抖動,抖動的長短由機械特性所決定,一般為5~15ms,抖動引起電平信號波動,從而引起誤處理。為了確保一次按鍵動作只確認一次按鍵,必須消除抖動。
第三部分是計數模塊,計數模塊內部包括一個狀態(tài)控制進程,控制開關的三個不同狀態(tài);一個分頻進程,主要是把系統32MHz的時鐘分頻為1Hz:兩個6進制計數器,和兩個十進制計數器,這樣可以比直接使用60進制計數器節(jié)省資源,直接利用秒的個位(十制)的進位信號作為秒的十位的進位信號,秒的十位(6進制)的進位信號作為分得個位的進位信號,依此類推。部分計數程序如下:
……
---------CNT4---------秒的個位計數(10進制計數器)
process(CLK0_OUT,LOCKED_OUT)--系統復位
begin
if(LOCKED_OUT = '0') then
r_ct4 <="0000";
elsif(CLK0_OUT = '1' and CLK0_OUT'event) then
if(r_outp = "00") then --清零
r_ct4 <= "0000";
elsif(r_outp = "10")then --停止計數
r_ct4 <= r_ct4;
elsif(r_outp = "01")then --開始計數
if(r_ci3 = '1') then
if(r_ct4 = "1001") then
r_ct4 <= "0000";
else
r_ct4 <= r_ct4 + '1';
end if;
end if;
end if;
end if;
end process;
r_ci4<= '1' when ((r_ct4 = "1001") and
(r_ct3 = "11110") and
(r_ct2 = "1111100110") and
(r_ct1 = "1111100110")) else
'0';--r_ci4<='1'為 進位信號
CNT1 <= r_ct4;
----------------------------------------
……
第四部分是掃描顯示部分,計數器輸出的四個四位信號,分別是秒針個位、十位、分針、個位、十位。通過譯碼顯示程序,對應四個LED數碼管。另外還有一片選信號,選出不同的要顯示的數據,為了實現動態(tài)顯示,還要控制掃描頻率 ,可以通過一分頻器實現,經實驗得動態(tài)顯示頻率控制在200Hz左右可等到比較好得效果。部分譯碼程序如下:
……
process(s_data) begin
case s_data is
when "0000" =>s_ledout(7 downto 1) <="0111111";
when "0001" =>s_ledout(7 downto 1) <="0000110";
when "0010" =>s_ledout(7 downto 1) <="1011011";
when "0011" =>s_ledout(7 downto 1) <="1001111";
when "0100" =>s_ledout(7 downto 1) <="1100110";
when "0101" =>s_ledout(7 downto 1) <="1101101";
when "0110" =>s_ledout(7 downto 1) <="1111101";
when "0111" =>s_ledout(7 downto 1) <="0100111";
when "1000" =>s_ledout(7 downto 1) <="1111111";
when "1001" =>s_ledout(7 downto 1) <="1101111";
when others=> s_ledout(7 downto 1) <="XXXXXXX";
end case;
end process;
process(s_ledsel) begin
if (s_ledsel="1011")then --控制小數點點亮
s_ledout(0) <= '1' ;
else
s_ledout(0) <= '0' ;
end if;
end process;
……
4 設計仿真與下載驗證
上面數字秒表得模塊圖,采用VHDL語言編寫程序,把各程序經過編譯后,生成模塊,通過建立頂層文件,調用這些模塊,完成電路得連接。通過ISE綜合可得到完整得電路模塊圖。如圖3所示:
再通過Modelsim 軟件進行編譯、仿真,得到仿真圖形如圖4所示:
由仿真結果可知數字秒表實現了準確的計數功能。
最后將該設計下載到實驗、開發(fā)系統中進行驗證。經ISE綜合后生成相應的stopwatch.ucf文件,管腳鎖定如下:輸入信號CLKIN對應P76引腳,RST對應P120引腳, SW7對應P116引腳;輸出信號LEDOUT[7:4]對應P37~P34引腳,LEDOUT<3>對應P31, LEDOUT<2>對應P29, LEDOUT<1>對應P28, LEDOUT<0>對應P33, LEDSEL<3>對應P39,LEDSEL<2>對應P40,LEDSEL<1>對應P42,LEDSEL<0>對應P43。管腳鎖定后再進行編譯,生成可下載的stopwatch.mcs文件,將該文件下載到TS101芯片中,可實際驗證該設計的各種功能,復位、計數、暫停、清零等。
5 結束語
通過利用FPGA設計數字秒表可,進一步熟悉了FPGA的整套開發(fā)流程,即設計入口,仿真,綜合,布局布線。在Xinlinx FPGA 開發(fā)環(huán)境下,采用至上而下的設計方法有利于早期發(fā)現結構設計中的錯誤,避免不必要的重復設計。在結合基于FPGA的“在系統”可編程實驗板,輕輕松松就能實現電子產品的設計,現場觀察實
驗測試結果。大大縮短了產品的設計周期和調試周期,提高了設計的可靠性和成功率。充分體現了可編程邏輯器件在數字電路設計中的優(yōu)越性。
參考文獻:
[1]王振紅.VHDL數字電路設計與應用實踐教程[M],北京:機械工業(yè)出版社,2003(6).
[2]張淑驊.基于FPGA的數字秒表的VHDL設計[J],大眾科技,2006(5):7-78.
[3]詹小杏,林浩泉.用CPLD器件設計數字秒表[J],大眾科技,2004(10):2.
[4]韓芝俠.基于FPGA的數字秒表設計 [J],陜西工學院學報,2004,20(4):22-23.
[5]陳耀和.VHDL語言設計技術[M],北京:電子工業(yè)出版社,2004(3).
[6]翟殿棠,田萬民,厲光偉.VHDL在數字設計中的應用研究[J],信息技術研究與應用,2004(3):44-45.