[FPGA]基於FPGA的數字跑表

版權編程

基於FPGA的數字跑表的設計與實現
1、設計要求
用FPGA設計並實現一個數字跑表,範圍爲0~59分59.99秒。能夠實現數字跑表進行啓動、中止計時和顯示讀數三個操做,能夠在數碼管上顯示讀數。
2、設計任務
2.1基本部分
(1)瞭解FPGA開發板,瞭解數字跑表的功能。
(2)VHDL語言編程實現數字跑表系統的功能模塊,數字跑表進行啓動、中止、顯示讀數操做,並具備計時清零功能;
(3)程序編譯正確,在Modelsim中仿真正確;
(4)採用FPGA開發板做爲開發平臺,可以下載驗證。
2.2提升部分
可以採用原理圖設計法設計。
3、設計原理
圖3.1系統框圖
在這裏插入圖片描述
如圖,若是要實現計時範圍爲0~59分59.99秒的數字跑表並在數碼管上顯示讀數,那麼須要設計時鐘電路、分頻電路、計數器電路、譯碼顯示1電路。將DE1-SOC開發套件中提供的50MHZ時鐘進行分頻至100HZ後送入100進制計數器,計數器計滿100後發出進位信號送入計秒模塊的60進制計數器,計數器滿60後發出進位信號送入計分模塊的60進制計數器,每一個計數器分別鏈接不一樣的數碼管顯示電路,實時顯示計時效果。所以使用原理圖輸入設計法,使用QuartusII軟件編寫元件代碼和繪製原理圖,然後進行綜合仿真。
4、設計方案
4.1 硬件設計
本設計須要用到一個穩定的50MHZ的時鐘,一個500000分頻的分頻器,一個100進制計數器,兩個60進制計數器,兩個撥碼開關,六個7段數碼管。綜上所述,DE1-SOC開發套件提供的FPGA芯片可知足對分頻器和計數器的設計需求,豐富的外部設備可知足對數碼管和撥碼開關的需求。
圖4.1 DE1-SOC開發板實物圖spa

4.2 軟件設計
一百進制計數器採用兩個十進制計數器級聯的方式實現,六十進制計數器採用十進制和六進制計數器級聯的方式實現。在這裏插入圖片描述
4.2.1 分頻器設計

`LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CLOCK IS
PORT(CLK:IN STD_LOGIC;
      CLKOUT:OUT STD_LOGIC);
END CLOCK;
ARCHITECTURE RTL OF CLOCK IS
SIGNAL CLK_1_REG: STD_LOGIC := '1';
BEGIN
CLKOUT<=CLK_1_REG;
PROCESS(CLK)
VARIABLE COUNT :INTEGER RANGE 0 TO 500000;
BEGIN
    IF(CLK'EVENT AND CLK='1')THEN
        IF COUNT = 500000 THEN
            COUNT:=0;
            CLK_1_REG<=NOT CLK_1_REG;
        ELSE
            COUNT:=COUNT+1;
        END IF;
    END IF;
 END PROCESS;
 END RTL;` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25

4.2.2 數碼管顯示電路3d

`LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY HEX IS
PORT(    HEXIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
        HEXOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END HEX;  
ARCHITECTURE RTL OF HEX IS
BEGIN
PROCESS(HEXIN)
BEGIN
    CASE HEXIN IS
        WHEN "0000" => HEXOUT <="1000000";
       WHEN "0001" => HEXOUT <="1111001";
        WHEN "0010" => HEXOUT <="0100100";
        WHEN "0011" => HEXOUT <="0110000";
        WHEN "0100" => HEXOUT <="0011001";
        WHEN "0101" => HEXOUT <="0010010";
        WHEN "0110" => HEXOUT <="0000010";
        WHEN "0111" => HEXOUT <="1011000";
        WHEN "1000" => HEXOUT <="0000000";
        WHEN "1001" => HEXOUT <="0010000";
        WHEN "1010" => HEXOUT <="0001000";
        WHEN "1011" => HEXOUT <="0000011";
        WHEN "1100" => HEXOUT <="1000110";
        WHEN "1101" => HEXOUT <="0100001";
        WHEN "1110" => HEXOUT <="0000110";
        WHEN OTHERS => HEXOUT <="1000000";
    END CASE;
 END PROCESS;
END RTL;` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26
*   27
*   28
*   29
*   30

4.2.3 十進制計數器code

`LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER10 IS
    PORT(CLK,CLR,EN: IN STD_LOGIC;
         DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
         COUT : OUT STD_LOGIC);
END COUNTER10;
ARCHITECTURE RTL OF COUNTER10 IS
BEGIN
    PROCESS(CLK,CLR,EN)
        VARIABLE Q : STD_LOGIC_VECTOR (3 DOWNTO 0);
    BEGIN
    IF CLR = '1' THEN Q := (OTHERS => '0');
    ELSIF CLK'EVENT AND CLK = '1' THEN
            IF EN = '1' THEN 
                IF Q < 9 THEN Q := Q + 1;
                ELSE Q := (OTHERS => '0');
                END IF;
            END IF;END IF;
    IF Q = "0000" THEN COUT <= '1';
    ELSE COUT <= '0'; 
    END IF;
    DOUT <= Q;    
    END PROCESS;
END RTL;` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26

4.2.4 六進制計數器blog

`LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER6 IS
PORT(CLK,CLR,EN: IN STD_LOGIC;
     DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
     CO : OUT STD_LOGIC);
END COUNTER6;
ARCHITECTURE RTL OF COUNTER6 IS
BEGIN
PROCESS(CLK,CLR,EN)
VARIABLE Q : STD_LOGIC_VECTOR (3 DOWNTO 0);
BEGIN
IF(CLR='1')THEN
    Q:="0000";
    CO<='0';
ELSIF(CLK'EVENT AND CLK = '1') THEN
    IF(EN='1')THEN
        IF(Q <5)THEN
            Q := Q + 1;
        ELSE
            Q := (OTHERS => '0');
        END IF;
    END IF;
END IF;
IF Q = "0000" THEN 
    CO <= '1';
ELSE
    CO <= '0'; 
END IF;
DOUT <= Q;
END PROCESS;
END RTL;` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20
*   21
*   22
*   23
*   24
*   25
*   26
*   27
*   28
*   29
*   30
*   31
*   32
*   33

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

相關文章
相關標籤/搜索