📄 bell.vhd
字号:
Library IEEE ;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY bell IS
PORT(
alarmtime : IN STD_LOGIC_VECTOR(23 DOWNTO 0); --闹铃时间
time : IN STD_LOGIC_VECTOR(23 DOWNTO 0); --当前时间
alarmon : IN STD_LOGIC; --闹钟开关状态
houralarmon : IN STD_LOGIC; --整点报时开关状态
clk : IN STD_LOGIC; --时钟
alarm_signal : OUT STD_LOGIC); --蜂鸣器驱动
END bell;
ARCHITECTURE rtl OF bell IS
SIGNAL alarm : STD_LOGIC; --闹钟引起的铃声
SIGNAL houralarm : STD_LOGIC; --整点报时引起的铃声
TYPE state IS(s0,s1,s2,s3,s4); --状态机状态
SIGNAL present_state : state := s0;
SIGNAL next_state : state :=s0 ;
BEGIN
--状态机用于产生闹钟引起的铃声
--状态更新和状态机复位
PROCESS(clk)
BEGIN
IF(alarmon='0')THEN
present_state <= s0;
ELSIF(clk'event AND clk='1')THEN
present_state <= next_state;
END IF;
END PROCESS;
--状态译码
PROCESS(present_state,time,alarmtime)
BEGIN
CASE present_state IS
WHEN s0 =>
IF(alarmtime=time)THEN
next_state <= s1;
ELSE
next_state <= present_state;
END IF;
WHEN s1 =>
IF(time(6)='1')THEN
next_state <= s2;
ELSE
next_state <= present_state;
END IF;
WHEN s2 =>
IF(time(6)='0')THEN
next_state <= s3;
ELSE
next_state <= present_state;
END IF;
WHEN s3 =>
IF(time(6)='1')THEN
next_state <= s4;
ELSE
next_state <= present_state;
END IF;
WHEN s4 =>
IF(time(6)='0')THEN
next_state <= s0;
ELSE
next_state <= present_state;
END IF;
WHEN OTHERS =>
next_state <= s0;
END CASE;
END PROCESS;
--输出译码
PROCESS(present_state)
BEGIN
IF((present_state=s3 OR present_state=s4))THEN
alarm <= '1';
ELSE
alarm <= '0';
END IF;
END PROCESS;
--整点报时铃声产生
PROCESS(houralarmon,time)
BEGIN
IF(houralarmon='1' AND time(15 DOWNTO 0)="0000000000000000")THEN
houralarm <= '1';
ELSE
houralarm <= '0';
END IF;
END PROCESS;
--最终的铃声等于闹钟铃声和整点报时铃声的或
alarm_signal <= alarm OR houralarm;
END rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -