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;