Цитата(BSV @ Nov 24 2009, 05:11)

В коде из Вашего крайнего поста не совсем понятно, почему данные защелкиваются по спаду WE (или это инвертированный сигнал AWEn?). Также было бы нелишним занести (if CS='0') then в тело (if falling_edge(WE) then) тогда это будет разрешение записи в регистр, а у Вас в терминах ПЛИС это получается непонятно что (весь код не приведен).
WE - обычный сигнал стробирования (активный 0)
по фронту WE почему-то некорректно работает - скорее всего из-за того что данные уже недостоверны - нужно увеличивать Hold Time
Цитата(BSV @ Nov 24 2009, 05:11)

Если асинхронно, я бы делал так
Код
process(AWEn)
begin
if (AWEn'event and AWEn = '1') then
if (CS='0' and A='0' and D(15 downto 12) = "0101") then
Y<=D(7 downto 0);
end if;
...
end if;
end process;
как быть если нужно опрашивать несколько регистров? номера регистров задаются в старших 4-х битах, остальные биты - содержимое
Цитата(BSV @ Nov 24 2009, 05:11)

Только при желаемых времянках (Tsetup=1clk, Twrite=1 clk, Thold =0 clk) нужно учитывать ИМХО, что например задержки от пинов CS, A, D(15:12) до триггеров должны быть не более 7,5 + (7,5 - 6) + 0,8 ns. Табличка с параметрами:
а вот это очень горько

хотелось бы Tsetup=1clk @133MHz
ещё вопрос.
как быть если нужно с одними и теме же объектами работать по фроту, спаду и уровню? vhdl ругается - пишит что не может имплементировать регистры
вот полный процесс(откомментировал).
процесс должен подсчитывать байты и вычислять адрес видеопамяти. увеличение по Х и У. когда A=1
и записывать в регистры когда A=0:
Код
process(WE)
begin
if falling_edge(WE) then
--Обработка регистров
if (CS='0' and A='0' and D(15 downto 12)="0000") then
R_D<=D(0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0001") then
R_M<=D(1 downto 0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0010") then
R_P<=D(0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0011") then
R_X0<=D(8 downto 0);
X<=D(8 downto 0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0100") then
R_X1<=D(8 downto 0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0101") then
R_Y0<=D(7 downto 0);
Y<=D(7 downto 0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0110") then
R_Y1<=D(7 downto 0);
end if;
if (CS='0' and A='0' and D(15 downto 12)="0111") then
R_C<=D(7 downto 0);
end if;
if (CS='0' and A='0' and D(15)='1') then
R_RGB(conv_integer(R_C))<=D(14 downto 0);
end if;
--Вычисление адреса в видеопамяти WriteAddress=320*y+x
if (CS='0' and A='1') then
WriteAddress<=("101000000"*Y)+X; --вычисление адреса из старых координат
if X=R_X1 then --новые координаты - X и Y увеличиваются, для следующего адреса
X<=R_X0;
if Y=R_Y1 then
Y<=R_Y0;
else
Y<=Y+1;
end if;
else
X<=X+1;
end if;
end if;
end if;
end process;
смысл этого процесса в установке прямоугольной области (R_X0,R_Y0,R_X1,R_Y1) на дисплее для того чтобы потом слева-направа сверху-вниз записывать данные
прошу покритиковать или дополнить