VHDL呼吸燈源碼解析

VHDL呼吸燈源碼解析

Date:2016/10/27

CSDN主頁

固有聲明使用IEEE庫和標準邏輯器件

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

申明器件實體,輸入和輸出接口
其中clkin爲時鐘輸入信號,clkout和clkout2爲呼吸燈輸出信號.異步輸出呼吸燈效果

entity led is 
port (
clkin:in std_logic;
clkout:out std_logic;
clkout2:out std_logic
);
end entity;

代碼實體部分,對接入引腳和輸出引腳進行邏輯定義,在這個過程中我首先對時鐘進行分頻
我在之前測試時鐘頻率的時候,發現在分頻2的24次方可以讓燈以一秒左右一閃的頻率閃動,可以由此反推時鐘頻率大概爲2的24次方左右也就是大概8MHz-12MHz左右.
我們需要定一個單次呼和單次吸的時間週期.既然是呼吸燈,自然不能週期太短.也就是說最後我們要實現的頻率不能比2的24次方短

architecture behave of led is 
signal mlow:std_logic_vector(9 downto 0);
signal mhigh:std_logic_vector(15 downto 0);
signal mcur:std_logic_vector(15 downto 0);
signal mtype:std_logic;
begin 
process(clkin)
begin
    if(clkin'event and clkin='1')then
        mcur<=mcur+1;
        if(mcur="1111111111111111")then 
        mhigh<=(others=>'0');
        mcur<=(others=>'0');
        end if;
        mlow <=mlow+1;
        if(mlow="1111111111")then
            mlow<=(others=>'0');
            mhigh<=mhigh+1;
        end if;
        if(  mhigh="1111111111111111")then
            mhigh<=(others=>'0');
            mtype<=not mtype;
        end if;
        if(mtype='1')then 
            if(mcur > mhigh)then 
            clkout<='1';
            clkout2<='0';
            else
            clkout<='0';
            clkout2<='1';
            end if;
        else
            if(mcur > mhigh)then 
            clkout<='0';
            clkout2<='1';
            else
            clkout<='1';
            clkout2<='0';
            end if;
        end if;
    end if;
    end process;
    --clkout<=t_o;
end behave;

完整代碼

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity led is 
port (
clkin:in std_logic;
clkout:out std_logic;
clkout2:out std_logic
);
end entity;
architecture behave of led is 
signal mlow:std_logic_vector(9 downto 0);
signal mhigh:std_logic_vector(15 downto 0);
signal mcur:std_logic_vector(15 downto 0);
signal mtype:std_logic;
begin 
process(clkin)
begin
    if(clkin'event and clkin='1')then
        mcur<=mcur+1;
        if(mcur="1111111111111111")then 
        mhigh<=(others=>'0');
        mcur<=(others=>'0');
        end if;
        mlow <=mlow+1;
        if(mlow="1111111111")then
            mlow<=(others=>'0');
            mhigh<=mhigh+1;
        end if;
        if(  mhigh="1111111111111111")then
            mhigh<=(others=>'0');
            mtype<=not mtype;
        end if;
        if(mtype='1')then 
            if(mcur > mhigh)then 
            clkout<='1';
            clkout2<='0';
            else
            clkout<='0';
            clkout2<='1';
            end if;
        else
            if(mcur > mhigh)then 
            clkout<='0';
            clkout2<='1';
            else
            clkout<='1';
            clkout2<='0';
            end if;
        end if;
    end if;
    end process;
    --clkout<=t_o;
end behave;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章