📄 35_486_bus.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
entity i486_bus is
generic ( --下面的时间特性基于I486DX 50
constant t6_max : time := 12 ns;
constant t10_max : time := 12 ns;
constant t10_min : time := 3 ns;
constant t11_max : time := 18 ns;
constant t16_min : time := 5 ns;
constant t17_min : time := 3 ns;
constant t22_min : time := 5 ns;
constant t23_min : time := 3 ns);
port ( --内部总线接口
abus : out bit_vector (31 downto 0);
dbus : inout std_logic_vector (31 downto 0);-- := (others =>'Z');
w_rb,ads_b : out bit := '1';
rdy_b,clk : in bit;
--外部总线接口
address,w_data : in bit_vector(31 downto 0);
r_data : out bit_vector(31 downto 0);
wr,br : in bit;
std,done : out bit);
end i486_bus;
architecture simple_486_bus of i486_bus is
type state_t is (ti,t1,t2);
signal state,next_state : state_t := ti;
begin
--下面的进程用于产生控制信号和处理器在读写操作时的地址信号
--进程根据操作的类型给总线设定相应状态
--在读写操作时done信号为低,当总线就绪接受下一请求时done信号为高
comb_logic : process
begin
std <= '0';
case (state) is
when ti =>
done <='1';
if (br='1') then next_state <= t1;
else next_state <= ti;
end if;
dbus <= transport (others =>'Z') after t10_min;
when t1 =>
done <='0';
ads_b <= transport '0' after t6_max;
w_rb <= transport wr after t6_max;
abus <= transport address after t6_max;
dbus <= transport (others =>'Z') after t10_min;
next_state <=t2;
when t2 =>
ads_b <= transport '1' after t6_max;
--读操作
if (wr='0') then
if (rdy_b ='0') then
r_data <= to_bitvector(dbus);
std <= '1';
done <='1';
if (br = '0') then next_state <= ti;
else next_state <= t1;
end if;
else next_state <= t2;
end if;
--写操作
else
dbus <= transport to_stdlogicvector(w_data) after t10_max;
if (rdy_b= '0') then
done <='1';
if (br = '0') then next_state <= ti;
else next_state <=t1;
end if;
else next_state <=t2;
end if;
end if;
end case;
wait on state,rdy_b,br,dbus;
end process comb_logic;
--本进程用于在每一个时钟上升沿更新当前状态
seq_logic : process (clk)
begin
if (clk='1') then state <= next_state; end if;
end process seq_logic;
--本进程用于检查所有的建立和保持时间是否与
--所有的输入控制信号相匹配
wave_check : process (clk,dbus,rdy_b)
variable clk_last_rise : time := 0 ns;
begin
if (now /= 0 ns) then
--检查信号建立时间
if clk'event and clk ='1' then
--下面的assert语句中假定RDY的建立时间
--大于或等于data的建立时间
assert (rdy_b /= '0') or (wr /='0') or (now - dbus'last_event >= t22_min)
report "i486 bus : data setup too short"
severity warning;
assert (rdy_b'last_event >= t16_min)
report "i486 bus : rdy setup too short"
severity warning;
end if;
--检查保持时间
if (dbus'event) then
--下面的assert语句中假定RDY的保持时间
--大于或等于data的保持时间
assert (rdy_b /= '0') or (wr /='0') or (now - clk_last_rise >= t23_min)
report "i486 bus : data hold too short"
severity warning;
end if;
if (rdy_b'event) then
assert (now - clk_last_rise >= t17_min)
report "i486 bus : rdy signal hold too short"
severity warning;
end if;
end if;
end process wave_check;
end simple_486_bus;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -