• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于FPGA的數字秒表設計與仿真

    基于FPGA的數字秒表設計與仿真

    作者: 時間:2012-12-27 來源:網絡 收藏

    數字集成電路作為當今信息時代的基石,不僅在信息處理、工業控制等生產領域得到普及應用,并且在人們的日常生活中也是隨處可見,極大的改變了人們的生活方式。面對如此巨大的市場,要求數字集成電路的周期盡可能短、實驗成本盡可能低,最好能在實驗室直接驗證的準確性和可行性,因而出現了現場可編程邏輯門陣列.對于芯片而言,的易用性不僅使得設計更加簡單、快捷,并且節省了反復流片驗證的巨額成本。對于某些小批量應用的場合,甚至可以直接利用實現,無需再去訂制專門的數字芯片。

    本文引用地址:http://www.czjhyjcfj.com/article/148164.htm

    文中著重介紹了一種FPGA利用VHDL硬件描述語言的設計方法,在設計過程中使用VHDL的EDA工具ModelSim對各個模塊驗證,并給出了完整的源程序和結果。

    1 總體功能結構設計

    一個完整的應具有計時、相應的控制以及計時結果顯示功能,總體的功能結構如圖1所示。黑色線框內是計數模塊、使能轉化模塊和顯示譯碼模塊,左邊是輸入控制信號,右邊是顯示計時結果的數碼顯示管,用六位BCD七段數碼管顯示讀數,顯示格式如圖2,計時范圍為:1小時,精度為0.01s.

    總體的功能結構

    輸入時鐘信號由32MHz的石英晶振提供,考慮到設計指標要求秒表精度為0.01秒,計數脈沖的時鐘輸入就應該是頻率為100Hz的脈沖,所以先要設計一個320000分頻器,分頻器的輸出可作計數器的輸入;其次計數模塊設計應綜合考慮秒表的計時范圍(1小時)和顯示輸出(6位輸出),6位輸出中有兩位是六進制輸出,其余四位是十進制輸出,所以可通過設計4個模10計數器和2個模6計數器來實現,其中較低位的進位輸出就是高位的計數輸入端。

    控制模塊應包括開始計時/停止計時、復位兩個按鈕,即電路設計經常用到的使能端和清零端,這兩個控制端口直接接到計數器的清零和史能端即可實現復位、開始計時/停止計時;但是外圍使能輸入需要經過使能轉換電路后,才可變為計數器可用的使能控制信號。因此在輸入使能信號和計數器使能輸入之間需設計一個信號轉換模塊。

    顯示計數結果的模塊實現較為簡單,只需將六位計數結果通過七段譯碼電路接到輸出即可點亮數碼管,無需時序控制,直接用組合邏輯電路就可以實現。數碼管顯示可以采用掃描顯示,用一個頻率1KHz的信號掃描一個多路選擇器,實現對六位已經鎖存的計數結果的掃描輸出。

    2 各功能模塊設計

    2.1 分頻器模塊

    分頻器的功能是提供標準時鐘控制信號以精確控制計數器的開閉,提供的標準信號是32MHz,根據設計精度0.01s的要求,輸出信號是100Hz,所以該分頻器實現的功能是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 計數模塊

    該計數器要實現最大計數值為59分59秒99的計數,而且為了數碼管顯示方便,該模塊必須通過計數器的級聯來實現,即首先分別設計一個模6計數器和一個模10計數器,然后將他們級聯,其中調用4次模10計數器、2次模6計數器,這樣可以比直接設計模100 的計數器和模60的計數器節省資源。級聯時低位的計數進位輸出接高位的計數輸入端,如圖3所示。再考慮到控制模塊的要求,每個計數器有三個輸入端:時鐘、使能和清零,兩個輸出端:計數輸出和進位輸出,采用同步使能異步清零的設計方法,每個計數器的使能和清零端都與外圍的使能和清零端相聯。

    計數模塊

    模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計數器類似,為節省篇幅,不再給出。

    2.3 使能信號轉換模塊

    輸入的開始和停止信號是單個脈沖信號,而計數器要持續計數所需的使能信號是持續的高電平,所以需要通過使能控制電路實現使能信號的轉換。該模塊的VHDL源程序以及ModelSim輸出結果如下:

    該模塊源程序:

    process(enablein)

    begin

    if(enablein'event and enablein='1‘)then

    temp= not temp;

    end if ;

    end process;

    2.4 譯碼顯示模塊

    由上面的設計可知,計數器輸出為二進制碼,不能直接點亮數碼管,要想將計數結果通過數碼管顯示必須再設計一個七段譯碼電路,以便將計數結果輸出。通過分析可知該譯碼器是一個4輸入,7輸出元件,其真值表如表1所示:

    真值表

    根據以上真值表可寫出譯碼電路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”;


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 辛集市| 广灵县| 瓦房店市| 蓝田县| 永福县| 穆棱市| 宁晋县| 拉萨市| 张家界市| 庆元县| 大安市| 冀州市| 阿图什市| 满城县| 定襄县| 定南县| 从江县| 西吉县| 额济纳旗| 易门县| 乐安县| 龙井市| 华阴市| 谢通门县| 印江| 衡水市| 南华县| 汝阳县| 科尔| 改则县| 通化县| 永福县| 邳州市| 雅安市| 灵武市| 阿坝| 都昌县| 丰镇市| 阜康市| 会宁县| 九龙县|