4位共陰極數碼管的動態掃描電路VHDL設計


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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM