"конечный автомат" реализованный любым способом, чем нагляднее - тем меньше места ошибке.
Ниже не самый лучший вариант, но для примера сгодится.
Сигналы ready и AD_out совпадают с точностью до полярности. Так получается, что автомат готов именно тогда, когда не пишет в память.
Код
type state_t is (
st_idle,
st_setup_1,
st_setup_2,
st_write_1,
st_write_2,
st_hold
);
signal state : state_t;
begin
RD <= '0';
process(reset, clk)
begin
if (reset='1') then
state <= st_idle;
CS_out <= '1';
AD_out <= '0';
nWE_out <= '1';
ready <= '0';
elsif rising_edge(clk) then
AD_out <= '1';
ready <= '0';
CS_out <= '1';
case state is
when st_idle =>
if cmd_write='1' then
state <= st_setup_1;
else
AD_out <= '0';
ready <= '1';
end if;
when st_setup_1 =>
state <= st_setup_2;
when st_setup_2 =>
state <= st_write_1;
when st_write_1 =>
CS_out <= '0';
state <= st_write_2;
when st_write_2 =>
CS_out <= '0';
state <= st_hold;
when st_hold =>
ready <= '1';
state <= st_idle;
end case;
end if;
end process;