проблема почти выявлена.
инкремент адреса иногда не срабатывает когда цвет близок к белому (большинство битов =1)
заземлил кабель наконец-то - ничего не дало.
действительно, после подъёма WE времянка укороченная. Удалось Tsetup=1, Twrite=1, Thold=0, тоесть 2 такта @150 МГц => 75МГц
но как только встречается белый цвет - всё глюкает - кадр крутится слеванаправо и сверхувниз...
уже мозг сломал, но причину ЯВНО не нашёл

на текущий момент:
Код
process(Port_WE,Port_CS)
variable W2:std_logic_vector(8 downto 0);
variable X0:std_logic_vector(8 downto 0);
variable X1:std_logic_vector(8 downto 0);
variable X:std_logic_vector(8 downto 0);
variable H2:std_logic_vector(7 downto 0);
variable Y0:std_logic_vector(7 downto 0);
variable Y1:std_logic_vector(7 downto 0);
variable Y:std_logic_vector(7 downto 0);
begin
if rising_edge(Port_WE) then
if Port_CS='0' then
--Register
if Port_A='0' then
case Port_D(15 downto 12) is
when "1000" =>
R_M:=Port_D(2 downto 0);
when "1001" =>
if ((R_M(2)='0' and VBlank='0') or (R_M(2)='1' and Blank='0')) then
R_P:=Port_D(0);
end if;
when "1010" =>
R_W:=Port_D(8 downto 0);
W2:='0'&R_W(8 downto 1);
X0:="010100000"-W2;
X1:="010011111"+W2;
X:=X0;
when "1011" =>
R_H:=Port_D(7 downto 0);
H2:='0'&R_H(7 downto 1);
Y0:="01111000"-H2;
Y1:="01110111"+H2;
Y:=Y0;
when others =>
null;
end case;
--VideoRAM
else
WriteAddress<=("101000000"*Y)+X;
if X=X1 then
X:=X0;
if Y=Y1 then
Y:=Y0;
else
Y:=Y+1;
end if;
else
X:=X+1;
end if;
end if;
end if;
end if;
end process;
Сообщение отредактировал %-) - Nov 27 2009, 09:04