?? exm_self.vhd
字號:
--這些檢測包括:
--1. 在發出交連信號前檢測A3輸出信號:
-- 發出"打開倉門"信號,讀"打開倉門"輸出返回信號;
-- 發出"允許投放"信號,讀"允許投放"輸出返回信號;
-- 發出"戰術投放"信號,讀"戰術投放"輸出返回信號;
--啟動自檢:上電后,在RST上升沿開始,等待CPU在SA=X"C007"寫0X55。
-- 同時點亮"CPU錯"。
--最后,如果測試全部通過,在p1.7-p1.0寫0x55。
--如果有出錯,則在p1.7-p1.0寫0xf0。
library ieee;
use ieee.std_logic_1164.ALL;
ENTITY exm_self is port(
rst : in std_logic;
p1mhz : in std_logic;
open_out_drv : out std_logic;
allow_out_drv : out std_logic;
fight_put_out_drv : out std_logic;
rd_rio_a3a : out std_logic;
sa : in std_logic_vector(15 downto 0);
sd_in : in std_logic_vector(7 downto 0);
iow : in std_logic;
cpu_err_drv : out std_logic;
ad_err_drv : out std_logic;
rio_err_drv : out std_logic
);
end entity;
architecture exm of exm_self is
signal st : integer range 0 to 63;
constant st_idle : integer := 0;
constant st_cpu_err_delay : integer := 1;
constant st_test_ad : integer := 2;
--constant st_test_ad : integer := 3;
signal beg_test,end_test : std_logic;
signal delay_time : integer range 0 to 2100;
begin
main : process(rst,p1mhz)
begin
if rst='0' then
st <= st_idle;
end_test <= '0';
delay_time <= 0;
open_out_drv <= '0';
allow_out_drv <= '0';
fight_put_out_drv <= '0';
else
if rising_edge(p1mhz) then
case st is
when st_idle =>
cpu_err_drv <= '0';--點亮"CPU錯"
if sa=x"c007" and sd_in=x"55" and iow='0' then
st <= st_cpu_err_delay;
else
st <= st_idle;
end if;
when st_cpu_err_delay =>
if delay_time < 2000 then
st <= st_cpu_err_delay;
delay_time <= delay_time + 1;
else
st <= st_test_ad;
delay_time <= 0;
end if;
when st_test_ad =>
-- when st_test_a3_relay =>
-- when st_test_delay =>
-- if delay_time < 10 then
-- delay_time <= delay_time + 1;
-- st <= st_test_delay;
-- else
-- st <= st_test_read_ret_data;
-- end if;
-- when st_test_read_ret_data =>
-- if
-- end_test <= '1';
-- st <= st_end_test;
-- when st_end_test =>
-- end_test <= '0';
st <= st_idle;
when others =>
st <= st_idle;
end case;
end if;
end if;
end process;
end architecture ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -