Цитата(DmitryR @ Dec 18 2009, 11:54)

когда вы одновременно пишете значение палитры и читаете его же, вы в зависимости от настроек памяти можете получить три разных вида значений, в том числе и неопределенное (что IMHO по умолчанию или даже без вариантов у Альтеры). Двухпортовая память может применяться, когда запись и чтение разделены по адресам. Так как чтение палитры использует случайные адреса - реализовать это, на мой взгляд можно только сделам палитру двустраничной, в неактивную страницу пишите - из активной читаете, потом меняете местами. Или все-таки писать палитру во время бланкинга - тогда хватит одной страницы.
лажу несёте, сударь, однако

эксперименты с палитрой показали, что если индекс палитры - всегда определённые биты (например биты 0 - 7 памяти), то палитра успешно отображается и на VGA и на ТВ:
здесь адрес меняется по фронту clk:
Код
if rising_edge(clk) then
R<rgb(conv_integer(sram(7..0)))(14..10);
G<rgb(conv_integer(sram(7..0)))(9..5);
B<rgb(conv_integer(sram(7..0)))(4..0);
end if;
если же на первом такте вычитывать биты 0-7 памяти, а на втором такте - биты 8-15 (ещё раз: биты 0-7 - это одна точка, биты 8-15 - вторая точка), то размытость на ТВ ожидаема. На VGA всё ОК
здесь адрес меняется по фронту clk/2:
Код
if rising_edge(clk) then
if shift='0' then
R<rgb(conv_integer(sram(7..0)))(14..10);
G<rgb(conv_integer(sram(7..0)))(9..5);
B<rgb(conv_integer(sram(7..0)))(4..0);
else
R<rgb(conv_integer(sram(15..8)))(14..10);
G<rgb(conv_integer(sram(15..8)))(9..5);
B<rgb(conv_integer(sram(15..8)))(4..0);
end if;
shift<=not shift;
end if;
Сообщение отредактировал %-) - Dec 19 2009, 06:02