Я сам этим вопросом интересуюсь.
Код:
always @(posedge clk24) begin
if (iports_write & ~WR_n & cpu_ce) begin
video_palette_value <= DO;
video_palette_wren <= 1'b1;
end
else
video_palette_wren <= 1'b0;
end
Поскольку video_palette_wren (ну и value) -- это регистры, запись в них происходит по clk24. В ОЗУ палитры запись произойдет на один клок позже.
Код:
wire [3:0] paletteram_adr = (retrace/*|video_palette_wren*/) ? video_border_index : coloridx;
palette_ram paletteram(paletteram_adr, video_palette_value, clk24, clk24, video_palette_wren, realcolor2buf);
Тут интересней paletteram_adr, который в основном равен coloridx и именно от момента перещелкивания coloridx зависит то, куда ж мы запишем реальную цифирь. Тактом раньше -- записали в цвет предыдущего пикселя, тактом позже -- в цвет следующего. Это при том, что отображаться может один и тот же в этот момент.
Для храбрых, coloridx берется из модуля video.v и обновляется примерно вот так:
Код:
reg [3:0] xcoloridx;
wire [3:0] coloridx_modeless;
always @(negedge clk24) begin
if (mode512) begin
if (ce6)
xcoloridx <= {2'b00, coloridx_modeless[2], coloridx_modeless[3]};
else
xcoloridx <= {2'b00, coloridx_modeless[1], coloridx_modeless[0]};
end
else
xcoloridx <= coloridx_modeless;
end
// coloridx is an output port, address of colour in the palette ram
assign coloridx = border ? border_idx : xcoloridx;
На спаде клока, что занятно. Сейчас трудно сообразить, но скорее всего это означает, что индекс цвета, то есть адрес палитры, обновляется раньше, чем формируется сигнал записи в ОЗУ палитры.
Из всего этого я пока делаю вывод, что ширина отрезка от инструкции out $0c до out $0c короче быть вряд ли способна. А вот то, что она все out-ы сдвинуты по фазе "влево" -- это похоже на правду.
К анализу кода приглашаются все желающие, на то он и открытый =)