library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CLKDRI is
Port (
CLK : in STD_LOGIC;
RESET : in STD_LOGIC;
SECOND_PULSE: out STD_LOGIC
);
end CLKDRI;
architecture Behavioral of CLKDRI is
signal TIMER : STD_LOGIC_VECTOR(23 downto 0) := (others => '0');
begin
process(CLK, RESET)
begin
if RESET = '1' then
TIMER <= (others => '0');
SECOND_PULSE <= '0';
elsif rising_edge(CLK) then
TIMER <= TIMER + 1;
if TIMER = 50000000 then -- 50MHz时钟
SECOND_PULSE <= '1';
TIMER <= (others => '0');
else
SECOND_PULSE <= '0';
end if;
end if;
end process;
end Behavioral;library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL; -- 使用标准数值运算库
entity key is
Port (
CLK : in STD_LOGIC;
KEY_ROW : in STD_LOGIC_VECTOR(3 downto 0);
KEY_COL : out STD_LOGIC_VECTOR(3 downto 0);
KEY_VALUE : out STD_LOGIC_VECTOR(3 downto 0);
KEY_PRESSED : out STD_LOGIC
);
end key;
architecture Behavioral of key is
signal col_index : unsigned(1 downto 0) := "00"; -- 改为unsigned类型
signal debounce_cnt : integer range 0 to 499999 := 0; -- 10ms消抖计数器(50MHz时钟)
signal key_stable : STD_LOGIC := '0';
begin
process(CLK)
begin
if rising_edge(CLK) then
-- 列扫描输出
case col_index is
when "00" => KEY_COL <= "1110"; -- 激活第1列
when "01" => KEY_COL <= "1101"; -- 激活第2列
when "10" => KEY_COL <= "1011"; -- 激活第3列
when "11" => KEY_COL <= "0111"; -- 激活第4列
when others => KEY_COL <= "1111";
end case;
-- 按键消抖逻辑
if KEY_ROW /= "1111" then
if debounce_cnt < 499999 then
debounce_cnt <= debounce_cnt + 1;
else
key_stable <= '1';
end if;
else
debounce_cnt <= 0;
key_stable <= '0';
end if;
-- 按键检测与编码
KEY_PRESSED <= '0';
if key_stable = '1' then
KEY_PRESSED <= '1';
case col_index is
when "00" =>
case KEY_ROW is
when "1110" => KEY_VALUE <= "0001"; -- 1
when "1101" => KEY_VALUE <= "0100"; -- 4
when "1011" => KEY_VALUE <= "0111"; -- 7
when "0111" => KEY_VALUE <= "0000"; -- *
when others => null;
end case;
when "01" =>
case KEY_ROW is
when "1110" => KEY_VALUE <= "0010"; -- 2
when "1101" => KEY_VALUE <= "0101"; -- 5
when "1011" => KEY_VALUE <= "1000"; -- 8
when "0111" => KEY_VALUE <= "0000"; -- 0
when others => null;
end case;
when "10" =>
case KEY_ROW is
when "1110" => KEY_VALUE <= "0011"; -- 3
when "1101" => KEY_VALUE <= "0110"; -- 6
when "1011" => KEY_VALUE <= "1001"; -- 9
when "0111" => KEY_VALUE <= "1010"; -- #
when others => null;
end case;
when "11" =>
case KEY_ROW is
when "1110" => KEY_VALUE <= "1011"; -- A
when "1101" => KEY_VALUE <= "1100"; -- B
when "1011" => KEY_VALUE <= "1101"; -- C
when "0111" => KEY_VALUE <= "1110"; -- D
when others => null;
end case;
when others => null;
end case;
end if;
-- 列计数器递增
col_index <= col_index + 1; -- 现在可以正常工作
end if;
end process;
end Behavioral;library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity IR is
Port (
CLK : in STD_LOGIC;
IR_RX : in STD_LOGIC;
IR_CODE : out STD_LOGIC_VECTOR(7 downto 0);
IR_VALID : out STD_LOGIC
);
end IR;
architecture Behavioral of IR is
signal counter : STD_LOGIC_VECTOR(15 downto 0) := (others => '0');
begin
process(CLK)
begin
if rising_edge(CLK) then
if IR_RX = '0' then
counter <= counter + 1;
if counter = 65535 then
IR_VALID <= '1';
IR_CODE <= counter(7 downto 0); -- 简化处理
end if;
else
counter <= (others => '0');
IR_VALID <= '0';
end if;
end if;
end process;
end Behavioral;library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Control1 is
Port (
CLK : in STD_LOGIC;
RESET : in STD_LOGIC;
KEY_VALUE : in STD_LOGIC_VECTOR(3 downto 0);
KEY_PRESSED : in STD_LOGIC;
IR_CODE : in STD_LOGIC_VECTOR(7 downto 0);
IR_VALID : in STD_LOGIC;
SECOND_PULSE : in STD_LOGIC;
CURRENT_FLOOR: out STD_LOGIC_VECTOR(2 downto 0);
MODE : out STD_LOGIC_VECTOR(1 downto 0);
LED_UP : out STD_LOGIC;
LED_DOWN : out STD_LOGIC;
LED_OPEN : out STD_LOGIC;
BUZZER : out STD_LOGIC;
EMERGENCY_FLAG: out STD_LOGIC;
LOCK_TIMER : out STD_LOGIC_VECTOR(5 downto 0)
);
end Control1;
architecture Behavioral of Control1 is
type STATE_TYPE is (IDLE, MOVING_UP, MOVING_DOWN, DOOR_OPENING, DOOR_CLOSING, EMERGENCY);
signal CURRENT_STATE : STATE_TYPE := IDLE;
signal s_CURRENT_FLOOR : STD_LOGIC_VECTOR(2 downto 0) := "001";
signal TARGET_FLOOR : STD_LOGIC_VECTOR(2 downto 0) := "001";
signal REQ_UP : STD_LOGIC_VECTOR(5 downto 0) := "000000";
signal REQ_DOWN : STD_LOGIC_VECTOR(5 downto 0) := "000000";
signal REQ_INTERNAL : STD_LOGIC_VECTOR(5 downto 0) := "000000";
signal FLOOR_LOCKED : STD_LOGIC_VECTOR(5 downto 0) := "000000";
signal DIRECTION : STD_LOGIC := '0';
signal s_MODE : STD_LOGIC_VECTOR(1 downto 0) := "01";
signal s_EMERGENCY_FLAG: STD_LOGIC := '0';
signal s_LOCK_TIMER : STD_LOGIC_VECTOR(5 downto 0) := "000000";
begin
CURRENT_FLOOR <= s_CURRENT_FLOOR;
MODE <= s_MODE;
EMERGENCY_FLAG <= s_EMERGENCY_FLAG;
LOCK_TIMER <= s_LOCK_TIMER;
process(CLK, RESET)
variable has_request : STD_LOGIC;
begin
if RESET = '1' then
-- 复位所有信号
CURRENT_STATE <= IDLE;
s_CURRENT_FLOOR <= "001";
REQ_UP <= "000000";
REQ_DOWN <= "000000";
REQ_INTERNAL <= "000000";
FLOOR_LOCKED <= "000000";
s_MODE <= "01";
s_EMERGENCY_FLAG <= '0';
s_LOCK_TIMER <= "000000";
DIRECTION <= '0';
LED_UP <= '0';
LED_DOWN <= '0';
LED_OPEN <= '0';
BUZZER <= '0';
elsif rising_edge(CLK) then
-- 输入处理(键盘+红外)
if (KEY_PRESSED = '1' or IR_VALID = '1') and s_EMERGENCY_FLAG = '0' then
case KEY_VALUE is
when "0001" => -- 1层
if s_MODE = "10" then FLOOR_LOCKED(0) <= not FLOOR_LOCKED(0);
else REQ_INTERNAL(0) <= '1'; end if;
-- ... 其他楼层按键类似处理 ...
when "1101" => -- 紧急按钮
s_EMERGENCY_FLAG <= '1';
CURRENT_STATE <= EMERGENCY;
-- ... 其他功能按键 ...
end case;
end if;
-- 电梯状态机
case CURRENT_STATE is
when EMERGENCY =>
LED_OPEN <= '1';
BUZZER <= '1';
if SECOND_PULSE = '1' then
if s_LOCK_TIMER < "111110" then -- 30秒倒计时
s_LOCK_TIMER <= s_LOCK_TIMER + 1;
else
s_EMERGENCY_FLAG <= '0';
s_LOCK_TIMER <= "000000";
CURRENT_STATE <= DOOR_CLOSING;
end if;
end if;
-- ... 其他状态处理 ...
end case;
end if;
end process;
end Behavioral;library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL; -- 使用标准数值运算库
entity State is
Port (
CLK : in STD_LOGIC;
-- 控制信号
SAVE_CMD : in STD_LOGIC; -- 保存命令
RESTORE_CMD : in STD_LOGIC; -- 恢复命令
-- 状态输入
CURRENT_FLOOR : in STD_LOGIC_VECTOR(2 downto 0);
MODE : in STD_LOGIC_VECTOR(1 downto 0);
EMERGENCY_FLAG: in STD_LOGIC;
LOCK_TIMER : in STD_LOGIC_VECTOR(5 downto 0);
-- 状态输出
SAVED_FLOOR : out STD_LOGIC_VECTOR(2 downto 0);
SAVED_MODE : out STD_LOGIC_VECTOR(1 downto 0);
SAVED_EMERGENCY: out STD_LOGIC;
SAVED_TIMER : out STD_LOGIC_VECTOR(5 downto 0);
-- 状态指示
SAVE_ACTIVE : out STD_LOGIC -- 保存操作指示灯
);
end State;
architecture Behavioral of State is
-- 非易失存储寄存器(实际硬件中替换为EEPROM接口)
signal storage_floor : STD_LOGIC_VECTOR(2 downto 0) := "001";
signal storage_mode : STD_LOGIC_VECTOR(1 downto 0) := "01";
signal storage_emergency: STD_LOGIC := '0';
signal storage_timer : STD_LOGIC_VECTOR(5 downto 0) := "000000";
-- 消抖计数器
signal save_counter : unsigned(19 downto 0) := (others => '0');
signal restore_counter : unsigned(19 downto 0) := (others => '0');
-- 保存状态机状态
type state_type is (IDLE, SAVING, SAVED, RESTORING, RESTORED);
signal current_state : state_type := IDLE;
-- 定义消抖时间(20ms @ 50MHz)
constant DEBOUNCE_TIME : unsigned(19 downto 0) := to_unsigned(1000000, 20); -- 20ms
begin
-- 保存/恢复状态机
process(CLK)
begin
if rising_edge(CLK) then
SAVE_ACTIVE <= '0';
case current_state is
when IDLE =>
if SAVE_CMD = '1' then
current_state <= SAVING;
elsif RESTORE_CMD = '1' then
current_state <= RESTORING;
end if;
when SAVING =>
if save_counter < DEBOUNCE_TIME then
save_counter <= save_counter + 1;
else
-- 保存当前状态
storage_floor <= CURRENT_FLOOR;
storage_mode <= MODE;
storage_emergency <= EMERGENCY_FLAG;
storage_timer <= LOCK_TIMER;
SAVE_ACTIVE <= '1'; -- 激活指示灯
save_counter <= (others => '0');
current_state <= SAVED;
end if;
when SAVED =>
if SAVE_CMD = '0' then
current_state <= IDLE;
end if;
when RESTORING =>
if restore_counter < DEBOUNCE_TIME then
restore_counter <= restore_counter + 1;
else
-- 恢复保存状态
SAVED_FLOOR <= storage_floor;
SAVED_MODE <= storage_mode;
SAVED_EMERGENCY<= storage_emergency;
SAVED_TIMER <= storage_timer;
restore_counter <= (others => '0');
current_state <= RESTORED;
end if;
when RESTORED =>
if RESTORE_CMD = '0' then
current_state <= IDLE;
end if;
when others =>
current_state <= IDLE;
end case;
-- 复位计数器
if SAVE_CMD = '0' then
save_counter <= (others => '0');
end if;
if RESTORE_CMD = '0' then
restore_counter <= (others => '0');
end if;
end if;
end process;
end Behavioral;library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Top_main is
Port (
CLK : in STD_LOGIC;
RESET : in STD_LOGIC;
KEY_ROW : in STD_LOGIC_VECTOR(3 downto 0);
IR_RX : in STD_LOGIC;
SAVE_BUTTON : in STD_LOGIC;
RESTORE_BUTTON : in STD_LOGIC;
SAVE_STATE : out STD_LOGIC;
RESTORE_STATE: out STD_LOGIC;
SEG_DATA : out STD_LOGIC_VECTOR(7 downto 0);
SEG_SELECT : out STD_LOGIC_VECTOR(7 downto 0);
LED_UP : out STD_LOGIC;
LED_DOWN : out STD_LOGIC;
LED_OPEN : out STD_LOGIC;
BUZZER : out STD_LOGIC;
KEY_COL : out STD_LOGIC_VECTOR(3 downto 0)
);
end Top_main;
architecture Structural of Top_main is
-- 自定义函数将布尔值转换为std_logic
function bool_to_stdlogic(b: boolean) return STD_LOGIC is
begin
if b then
return '1';
else
return '0';
end if;
end function;
-- 组件声明
component ClkDri
Port (
CLK, RESET : in STD_LOGIC;
SECOND_PULSE : out STD_LOGIC
);
end component;
component Key
Port (
CLK : in STD_LOGIC;
KEY_ROW : in STD_LOGIC_VECTOR(3 downto 0);
KEY_COL : out STD_LOGIC_VECTOR(3 downto 0);
KEY_VALUE : out STD_LOGIC_VECTOR(3 downto 0);
KEY_PRESSED : out STD_LOGIC
);
end component;
component IR
Port (
CLK, IR_RX : in STD_LOGIC;
IR_CODE : out STD_LOGIC_VECTOR(7 downto 0);
IR_VALID : out STD_LOGIC
);
end component;
component Control
Port (
CLK, RESET, KEY_PRESSED, IR_VALID, SECOND_PULSE : in STD_LOGIC;
KEY_VALUE : in STD_LOGIC_VECTOR(3 downto 0);
IR_CODE : in STD_LOGIC_VECTOR(7 downto 0);
CURRENT_FLOOR : out STD_LOGIC_VECTOR(2 downto 0);
MODE : out STD_LOGIC_VECTOR(1 downto 0);
LED_UP, LED_DOWN, LED_OPEN, BUZZER, EMERGENCY_FLAG : out STD_LOGIC;
LOCK_TIMER : out STD_LOGIC_VECTOR(5 downto 0)
);
end component;
component Display
Port (
CLK, EMERGENCY_FLAG : in STD_LOGIC;
CURRENT_FLOOR : in STD_LOGIC_VECTOR(2 downto 0);
MODE : in STD_LOGIC_VECTOR(1 downto 0);
LOCK_TIMER : in STD_LOGIC_VECTOR(5 downto 0);
SEG_DATA : out STD_LOGIC_VECTOR(7 downto 0);
SEG_SELECT : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component State
Port (
CLK, SAVE_CMD, RESTORE_CMD, EMERGENCY_FLAG : in STD_LOGIC;
CURRENT_FLOOR : in STD_LOGIC_VECTOR(2 downto 0);
MODE : in STD_LOGIC_VECTOR(1 downto 0);
LOCK_TIMER : in STD_LOGIC_VECTOR(5 downto 0);
SAVED_FLOOR : out STD_LOGIC_VECTOR(2 downto 0);
SAVED_MODE : out STD_LOGIC_VECTOR(1 downto 0);
SAVED_EMERGENCY : out STD_LOGIC;
SAVED_TIMER : out STD_LOGIC_VECTOR(5 downto 0);
SAVE_ACTIVE : out STD_LOGIC
);
end component;
-- 内部连接信号
signal s_second_pulse : STD_LOGIC;
signal s_key_value : STD_LOGIC_VECTOR(3 downto 0);
signal s_key_pressed : STD_LOGIC;
signal s_ir_code : STD_LOGIC_VECTOR(7 downto 0);
signal s_ir_valid : STD_LOGIC;
signal s_current_floor : STD_LOGIC_VECTOR(2 downto 0);
signal s_mode : STD_LOGIC_VECTOR(1 downto 0);
signal s_emergency_flag : STD_LOGIC;
signal s_lock_timer : STD_LOGIC_VECTOR(5 downto 0);
signal s_saved_floor : STD_LOGIC_VECTOR(2 downto 0);
signal s_saved_mode : STD_LOGIC_VECTOR(1 downto 0);
signal s_saved_emergency : STD_LOGIC;
signal s_saved_timer : STD_LOGIC_VECTOR(5 downto 0);
signal s_save_cmd : STD_LOGIC;
signal s_restore_cmd : STD_LOGIC;
signal s_save_active : STD_LOGIC;
begin
-- 时钟分频
U1: ClkDri port map (
CLK => CLK, RESET => RESET,
SECOND_PULSE => s_second_pulse
);
-- 键盘扫描
U2: Key port map (
CLK => CLK, KEY_ROW => KEY_ROW,
KEY_COL => KEY_COL, KEY_VALUE => s_key_value,
KEY_PRESSED => s_key_pressed
);
-- 红外接收
U3: IR port map (
CLK => CLK, IR_RX => IR_RX,
IR_CODE => s_ir_code, IR_VALID => s_ir_valid
);
-- 保存命令组合
s_save_cmd <= SAVE_BUTTON or (s_key_pressed and bool_to_stdlogic(s_key_value = "1011"));
s_restore_cmd <= RESTORE_BUTTON or (s_key_pressed and bool_to_stdlogic(s_key_value = "1100"));
-- 电梯主控制器
U4: Control port map (
CLK => CLK, RESET => RESET,
KEY_VALUE => s_key_value, KEY_PRESSED => s_key_pressed,
IR_CODE => s_ir_code, IR_VALID => s_ir_valid,
SECOND_PULSE => s_second_pulse,
CURRENT_FLOOR => s_current_floor, MODE => s_mode,
LED_UP => LED_UP, LED_DOWN => LED_DOWN,
LED_OPEN => LED_OPEN, BUZZER => BUZZER,
EMERGENCY_FLAG => s_emergency_flag,
LOCK_TIMER => s_lock_timer
);
-- 状态保存
U5: State port map (
CLK => CLK,
SAVE_CMD => s_save_cmd,
RESTORE_CMD => s_restore_cmd,
EMERGENCY_FLAG => s_emergency_flag,
CURRENT_FLOOR => s_current_floor, MODE => s_mode,
LOCK_TIMER => s_lock_timer,
SAVED_FLOOR => s_saved_floor, SAVED_MODE => s_saved_mode,
SAVED_EMERGENCY => s_saved_emergency, SAVED_TIMER => s_saved_timer,
SAVE_ACTIVE => s_save_active
);
-- 显示控制
U6: Display port map (
CLK => CLK,
CURRENT_FLOOR => s_current_floor, MODE => s_mode,
EMERGENCY_FLAG => s_emergency_flag,
LOCK_TIMER => s_lock_timer,
SEG_DATA => SEG_DATA, SEG_SELECT => SEG_SELECT
);
-- 保存状态指示信号连接到顶层模块端口
SAVE_STATE <= s_save_active;
-- 恢复状态指示信号连接到顶层模块端口
RESTORE_STATE <= s_restore_cmd;
end Structural;library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity TOP_MAIN is -- 修改实体名称
Port (
CLK : in STD_LOGIC;
RESET : in STD_LOGIC;
KEY_ROW : in STD_LOGIC_VECTOR(3 downto 0);
IR_RX : in STD_LOGIC;
SAVE_BUTTON : in STD_LOGIC;
RESTORE_BUTTON : in STD_LOGIC;
SAVE_STATE : out STD_LOGIC;
RESTORE_STATE: out STD_LOGIC;
SEG_DATA : out STD_LOGIC_VECTOR(7 downto 0);
SEG_SELECT : out STD_LOGIC_VECTOR(7 downto 0);
LED_UP : out STD_LOGIC;
LED_DOWN : out STD_LOGIC;
LED_OPEN : out STD_LOGIC;
BUZZER : out STD_LOGIC;
KEY_COL : out STD_LOGIC_VECTOR(3 downto 0)
);
end TOP_MAIN;
architecture Structural of TOP_MAIN is -- 修改架构名称
-- 自定义函数将布尔值转换为std_logic
function bool_to_stdlogic(b: boolean) return STD_LOGIC is
begin
if b then
return '1';
else
return '0';
end if;
end function;
-- 组件声明
component ClkDri
Port (
CLK, RESET : in STD_LOGIC;
SECOND_PULSE : out STD_LOGIC
);
end component;
component Key
Port (
CLK : in STD_LOGIC;
KEY_ROW : in STD_LOGIC_VECTOR(3 downto 0);
KEY_COL : out STD_LOGIC_VECTOR(3 downto 0);
KEY_VALUE : out STD_LOGIC_VECTOR(3 downto 0);
KEY_PRESSED : out STD_LOGIC
);
end component;
component IR
Port (
CLK, IR_RX : in STD_LOGIC;
IR_CODE : out STD_LOGIC_VECTOR(7 downto 0);
IR_VALID : out STD_LOGIC
);
end component;
component Control
Port (
CLK, RESET, KEY_PRESSED, IR_VALID, SECOND_PULSE : in STD_LOGIC;
KEY_VALUE : in STD_LOGIC_VECTOR(3 downto 0);
IR_CODE : in STD_LOGIC_VECTOR(7 downto 0);
CURRENT_FLOOR : out STD_LOGIC_VECTOR(2 downto 0);
MODE : out STD_LOGIC_VECTOR(1 downto 0);
LED_UP, LED_DOWN, LED_OPEN, BUZZER, EMERGENCY_FLAG : out STD_LOGIC;
LOCK_TIMER : out STD_LOGIC_VECTOR(5 downto 0)
);
end component;
component Display
Port (
CLK, EMERGENCY_FLAG : in STD_LOGIC;
CURRENT_FLOOR : in STD_LOGIC_VECTOR(2 downto 0);
MODE : in STD_LOGIC_VECTOR(1 downto 0);
LOCK_TIMER : in STD_LOGIC_VECTOR(5 downto 0);
SEG_DATA : out STD_LOGIC_VECTOR(7 downto 0);
SEG_SELECT : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component State
Port (
CLK, SAVE_CMD, RESTORE_CMD, EMERGENCY_FLAG : in STD_LOGIC;
CURRENT_FLOOR : in STD_LOGIC_VECTOR(2 downto 0);
MODE : in STD_LOGIC_VECTOR(1 downto 0);
LOCK_TIMER : in STD_LOGIC_VECTOR(5 downto 0);
SAVED_FLOOR : out STD_LOGIC_VECTOR(2 downto 0);
SAVED_MODE : out STD_LOGIC_VECTOR(1 downto 0);
SAVED_EMERGENCY : out STD_LOGIC;
SAVED_TIMER : out STD_LOGIC_VECTOR(5 downto 0);
SAVE_ACTIVE : out STD_LOGIC
);
end component;
-- 内部连接信号
signal s_second_pulse : STD_LOGIC;
signal s_key_value : STD_LOGIC_VECTOR(3 downto 0);
signal s_key_pressed : STD_LOGIC;
signal s_ir_code : STD_LOGIC_VECTOR(7 downto 0);
signal s_ir_valid : STD_LOGIC;
signal s_current_floor : STD_LOGIC_VECTOR(2 downto 0);
signal s_mode : STD_LOGIC_VECTOR(1 downto 0);
signal s_emergency_flag : STD_LOGIC;
signal s_lock_timer : STD_LOGIC_VECTOR(5 downto 0);
signal s_saved_floor : STD_LOGIC_VECTOR(2 downto 0);
signal s_saved_mode : STD_LOGIC_VECTOR(1 downto 0);
signal s_saved_emergency : STD_LOGIC;
signal s_saved_timer : STD_LOGIC_VECTOR(5 downto 0);
signal s_save_cmd : STD_LOGIC;
signal s_restore_cmd : STD_LOGIC;
signal s_save_active : STD_LOGIC;
begin
-- 时钟分频
U1: ClkDri port map (
CLK => CLK, RESET => RESET,
SECOND_PULSE => s_second_pulse
);
-- 键盘扫描
U2: Key port map (
CLK => CLK, KEY_ROW => KEY_ROW,
KEY_COL => KEY_COL, KEY_VALUE => s_key_value,
KEY_PRESSED => s_key_pressed
);
-- 红外接收
U3: IR port map (
CLK => CLK, IR_RX => IR_RX,
IR_CODE => s_ir_code, IR_VALID => s_ir_valid
);
-- 保存命令组合
s_save_cmd <= SAVE_BUTTON or (s_key_pressed and bool_to_stdlogic(s_key_value = "1011"));
s_restore_cmd <= RESTORE_BUTTON or (s_key_pressed and bool_to_stdlogic(s_key_value = "1100"));
-- 电梯主控制器
U4: Control port map (
CLK => CLK, RESET => RESET,
KEY_VALUE => s_key_value, KEY_PRESSED => s_key_pressed,
IR_CODE => s_ir_code, IR_VALID => s_ir_valid,
SECOND_PULSE => s_second_pulse,
CURRENT_FLOOR => s_current_floor, MODE => s_mode,
LED_UP => LED_UP, LED_DOWN => LED_DOWN,
LED_OPEN => LED_OPEN, BUZZER => BUZZER,
EMERGENCY_FLAG => s_emergency_flag,
LOCK_TIMER => s_lock_timer
);
-- 状态保存
U5: State port map (
CLK => CLK,
SAVE_CMD => s_save_cmd,
RESTORE_CMD => s_restore_cmd,
EMERGENCY_FLAG => s_emergency_flag,
CURRENT_FLOOR => s_current_floor, MODE => s_mode,
LOCK_TIMER => s_lock_timer,
SAVED_FLOOR => s_saved_floor, SAVED_MODE => s_saved_mode,
SAVED_EMERGENCY => s_saved_emergency, SAVED_TIMER => s_saved_timer,
SAVE_ACTIVE => s_save_active
);
-- 显示控制
U6: Display port map (
CLK => CLK,
CURRENT_FLOOR => s_current_floor, MODE => s_mode,
EMERGENCY_FLAG => s_emergency_flag,
LOCK_TIMER => s_lock_timer,
SEG_DATA => SEG_DATA, SEG_SELECT => SEG_SELECT
);
-- 保存状态指示信号连接到顶层模块端口
SAVE_STATE <= s_save_active;
-- 恢复状态指示信号连接到顶层模块端口
RESTORE_STATE <= s_restore_cmd;
end Structural;帮我寻找问题出在哪,并且告诉我器件模块之间如何相连
最新发布