Пока ограничусь простым оверсэмплингом 5x: IDES10 принимаем по 2 бита
IDES10 des(
.D(screen_data),
.FCLK(des_fclk), // frame_clk * 20 * 5 / 2
.PCLK(des_clk), // frame_clk * 20 / 2
.RESET(!resetn),
.Q0(des_out[0]),
.Q1(des_out[1]),
.Q2(des_out[2]),
.Q3(des_out[3]),
.Q4(des_out[4]),
.Q5(des_out[5]),
.Q6(des_out[6]),
.Q7(des_out[7]),
.Q8(des_out[8]),
.Q9(des_out[9])
);
Oversample5to1 oversample0(
.clk(des_clk),
.D(des_out[4:0]),
.O(oversample_read[0])
);
Oversample5to1 oversample1(
.clk(des_clk),
.D(des_out[9:5]),
.O(oversample_read[1])
);
always @(posedge des_clk or negedge resetn) begin
if(~resetn) begin
frame_data <= 22'd0;
frame_cntr <= 4'd0;
end else begin
frame_data <= {oversample_read[1:0], frame_data[19:2] };
if (frame_cntr < 4'd9) begin
frame_cntr <= frame_cntr + 3'd1;
end else begin
frame_cntr <= 4'd0;
end
end
end
module Oversample5to1 (
input wire clk,
input wire [4:0] D,
output wire O);
assign O = ( D == 5'b00111 ) ||
( D == 5'b01110 ) ||
( D == 5'b11100 ) ||
( D == 5'b01111 ) ||
( D == 5'b11110 ) ||
( D == 5'b11111 );
endmodule
для захвата и разбора должно хватить, дальше найти паттерны перехода data/contol и синхронизироваться с началом слова
впринципе тоже что и оригинал делает:
When locking to REFCLK is complete, the serial input is monitored for a transition word. When a transition word is found, LOCK is driven low indicating valid output data, and the paral- lel rate clock recovered from the serial input is output on PCLK_OUT. PCLK_OUT is stretched on the change from REFCLK to recovered clock (or vice versa).
На первый взгляд для rgb данных выглядит как простое чередование прямого/инверсного слова