版權編程
基於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