本文為大家帶來四種不同的vhdl數碼管動態掃描程序設計。
vhdl數碼管動態掃描一:循環滾動
實現的功能
循環滾動,始終點亮6個數碼管,左出右進。狀態為:012345-123450-234501-345012-450123-501234-012345
實現代碼:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL
PORT(CLK:IN STD_LOGIC;
SG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); BT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); END LED2;
ARCHITECTURE ACE OF LED2 IS component div_2K
port(clk_in:instd_logic; clk_out:outstd_logic);
end component;
SIGNAL CNT6:INTEGER RANGE 0 TO 5;
SIGNAL A:INTEGER RANGE 0 TO 5;
SIGNAL COUNT:INTEGER RANGE 0 TO 4999 := 0;
SIGNAl FLAG:INTEGER RANGE 0 TO 6 := 0;
SIGNAl FLAG_A:INTEGER RANGE 0 TO 5;
SIGNAL clk_tmp:STD_LOGIC;
BEGIN
u1:div_2k port map(clk_in=>CLK,clk_out=>clk_tmp);
P1:process(CNT6)
BEGIN
CASE CNT6 IS --3線至6線譯碼器
WHEN 0 => BT <= “011111” A <= 0 --A為位碼
WHEN 1 => BT<= “101111” A <= 1
WHEN 2 => BT<= “110111” A <= 2
WHEN 3 => BT<= “111011” A <= 3
WHEN 4 => BT<= “111101” A <= 4
WHEN 5 => BT<= “111110” A <= 5
WHEN OTHERS => NULL;
END CASE
END PROCESS P1;
P2:process(clk_tmp)
BEGIN
IF clk_tmp‘EVENT AND clk_tmp= ’1‘ THEN --實現模6計數器 if CNT6= 5 then CNT6<= 0; else
CNT6<=CNT6 + 1; end if;
IF (FLAG = 6) THEN --設置標志 FLAG <= 0;
END IF;
IF COUNT =4999 THEN
--相當于另一個時鐘
COUNT <= 0; --計數周期為5000
FLAG <=FLAG+1; --當記滿5000時左移動一位 ELSE
COUNT <=COUNT+1; --不滿5000繼續計數 END IF; END IF;
END PROCESS P2;
P3:process(A,FLAG,FLAG_A)
BEGIN
FLAG_A<=(( A + FLAG )mod 6) --使用求余運算實現移位
CASE FLAG_A IS --實現數碼管的顯示功能
WHEN 0=> SG <= “1111110”;
WHEN 1=> SG <= “0110000”;
WHEN 2=> SG <= “1101101”;
WHEN 3=> SG <= “1111001”;
WHEN 4=> SG <=“0110011”;
WHEN 5=> SG <= “1011011”;
WHEN OTHERS =>NULL
END CASE
END PROCESS P3;
END ACE;
代碼分析:
為實現移位,關鍵改動為新增一個計數器,技術周期遠遠大于掃描周期,這樣,在一個大的計數周期內,對于要顯示的6位數碼進行動態掃描(和實驗任務1中相同),顯示出6種移位狀態中的一種;在下一個大的周期內,利用FLAG標志,并使用求余運算將顯示位的數碼移位,比如,大的計數周期為0時,FLAG為0,顯示“012345”六位數碼,大的周期為1時,FALG為1,此時各位求余(即FLAG_A求余)對應的數碼為123450,顯示的數碼也就為“123450”。以此類推,實現循環移位。
vhdl數碼管動態掃描二:計數器數碼管動態顯示
電路的框架圖
電路的框架圖
頂層原理圖
動態顯示計數的VHDL語言描述
動態顯示譯碼模塊的VHDL語言的描述
vhdl數碼管動態掃描三:數字秒表動態顯示
本次設計選用的開發板在4位數碼管輸入方面只提供1個數據接口,用來動態顯示4位數據,在數據輸入信號方面要做到和勢能控制信號同頻率輸出,才能保證數碼顯示不會出錯或顯示移位。該模塊部分VHDL源程序如下:
仿真波形
vhdl數碼管動態掃描四:8位數碼管輸出任意數值的顯示電路
實驗設計注意事項
在EDA/SOPC裝置中,圖示數碼管顯示采用的是動態掃描方式,即當掃描選通電路74LS138輸入為000,(SEL2、SEL1、SEL0為000時,)Y0輸出低電平,8個數碼管中左邊第一個數碼管被選通,此時,應在數碼管輸入端輸入相應數據。其中,74LS245起輸出驅動作用。
人眼視覺暫留頻率在24Hz以上,如果大于該頻率,點亮單個七段顯示器,看上去能有8個同時顯示的效果,而且顯示也不閃爍。因此,選通頻率要大于24Hz以上。 依據實驗裝置電路,完成七段LED顯示譯碼器的設計應包含如下電路:
①分頻電路:將10MHz脈沖分頻到1kHz;
②七段譯碼電路;
③掃描計數電路:完成模8的計數電路,為掃描選通做準備;
④掃描選通電路:利用分時傳輸思想,將要顯示的數據依次傳入數碼管顯示電路。
VHDL代碼
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_arith.all;
USE IEEE.std_logic_unsigned.all;
ENTITY xianshi IS
PORT(clk:in std_logic;
smg:out std_logic_vector(7 downto 0);
sel:out std_logic_vector(2 downto 0));
END ENTITY;
ARCHITECTURE func OF xianshi IS
SIGNAL fp,tmp:std_logic;
SIGNAL count:std_logic_vector(9 downto 0);
SIGNAL sl:std_logic_vector(2 downto 0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk‘EVENT AND clk = ’1‘)
THEN IF(count = “1111100111”)
THEN count <= (OTHERS => ’0‘);
tmp <= NOT tmp; ELSE
count <= count + 1; END IF;
END IF; fp <= tmp;
END PROCESS;
PROCESS(fp)
BEGIN
IF(fp’EVENT AND fp = ‘1’)
THEN IF(sl = “111”)
THEN sl <= “000”;
ELSE
sl <= sl + 1; END IF;
END IF;
END PROCESS;
sel <= sl;
PROCESS(sl) BEGIN
CASE sl IS
WHEN “000” => smg <= “01000000”;
WHEN “001” => smg <= “01111001”;
WHEN “010” => smg <= “00100100”;
WHEN “011” => smg <= “00110000”;
WHEN “100” => smg <= “00011001”;
WHEN “101” => smg <= “00010010”;
WHEN “110” => smg <= “00000010”;
WHEN “111” => smg <= “01111000”;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END ARCHITECTURE;