library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; --功能:利用4位共陰極動態數碼管實現模值為100的計數器,計數區間0~99,無進位輸出 --原理:動態掃描電路,時鍾分頻,段選位選 entity led is port ( clkin:in std_logic;--時鍾輸入,也是唯一的輸入 clkout:out std_logic_vector(6 downto 0);--段選輸出 enout:out std_logic_vector(3 downto 0)--位選輸出 ); end entity; architecture behav of led is signal q1: std_logic_vector(6 downto 0);--存儲1號管的選段(低位) signal q2: std_logic_vector(6 downto 0);--存儲2號管的選段(高位) signal qout: std_logic_vector(6 downto 0);--存儲2號管的選段(高位) constant led_num: integer := 2;--使用的數碼管數量,限選1~4位,這里使用2個 constant freq: integer := 1000 / led_num;--分頻公式,用於計算每秒多少次脈沖,這里以1KHz時鍾為准 begin process(clkin)--對時鍾脈沖進行處理 variable var_bit: integer range 0 to led_num+1:=0;--變量,用於選位,0代表初始化 variable var_cnt_bit1 : integer range 0 to freq:=0;--變量,用於1號管(低位)的時鍾計數 variable var_cnt_bit2 : integer range 0 to freq*10:=0;--變量,用於2號管(高位)的時鍾計數 variable var_num1 : integer range 0 to 10:=0;--變量,存儲1號(低位)管的值,格式為十進制 variable var_num2 : integer range 0 to 10:=0;--變量,存儲2號(高位)管的值,格式為十進制 begin if(clkin'event and clkin='1')then --開始等待和處理脈沖 --循環選位,從1開始,1-2交替------------ var_bit := var_bit + 1; if(var_bit=3) then var_bit := 1; end if; ------------------------------------ --進位時,更新高位數碼管的值------------ if(var_num1=10)then var_bit := 2; end if; ------------------------------------ --判斷位值--------------------------- case var_bit is when 1=> --低位管 enout <="0001"; var_cnt_bit1 := var_cnt_bit1 + 1; if(var_cnt_bit1=freq)then var_num1:= var_num1 + 1; case var_num1 is--低位計數,段選,實現譯碼功能 when 1=> q1<="0000110"; when 2=> q1<="1011011"; when 3=> q1<="1001111"; when 4=> q1<="1100110"; when 5=> q1<="1101101"; when 6=> q1<="1111101"; when 7=> q1<="0000111"; when 8=> q1<="1111111"; when 9=> q1<="1101111"; when 10=> q1<="0111111";var_num1:=0;--逢10歸0 when 0=> q1<="1111111";var_num1:=0;--這個0永遠不顯示,加上它是為了避免報錯 end case; var_cnt_bit1:=0;--時鍾計數清0 end if; qout <= q1;--clkout對外輸出 when 2=> --高位管 enout <="0010"; var_cnt_bit2 := var_cnt_bit2 + 1; if(var_cnt_bit2=freq*10 or var_num1=10)then var_num2:= var_num2 + 1; case var_num2 is--高位計數,段選,實現譯碼功能 when 1=> q2<="0000110"; when 2=> q2<="1011011"; when 3=> q2<="1001111"; when 4=> q2<="1100110"; when 5=> q2<="1101101"; when 6=> q2<="1111101"; when 7=> q2<="0000111"; when 8=> q2<="1111111"; when 9=> q2<="1101111"; when 10=> q2<="0111111";var_num2:=0;--逢10歸0 when 0=> q2<="1111111";var_num1:=0;--這個0永遠不顯示,加上它是為了避免報錯 end case; var_cnt_bit2:=0;--時鍾計數清0 end if; qout <= q2;--clkout對外輸出 when others=>var_bit:=var_bit;--防止報錯 end case; ---------------------------判斷位值-- end if; end process; clkout <= qout; end behav;