根据输出端有效数据信号计数恢复
`timescale 1ns / 1ps
//恢复场同步信号
module recovery_vsync (
input clk, // 时钟信号
input reset, // 复位信号
input valid_i, // 输入数据有效信号
input [15:0] rgb_565_i, // 输入的16位RGB图像数据
input [10:0] img_width,
input [ 9:0] img_height,
output reg vsync_o, // 输出场同步信号
output reg valid_o, // 输出数据有效信号
output reg [15:0] rgb_565_o // 输出的16位RGB图像数据
);
reg [15:0] rgb_565_i_d1;
reg valid_i_d1;
reg [10:0] out_x_cnt;
reg [9:0] out_y_cnt;
always @(posedge clk or negedge reset) begin
if (!reset) begin
rgb_565_i_d1 <= 0;
valid_i_d1 <= 0;
rgb_565_o <= 0;
valid_o <= 0;
end else begin
rgb_565_i_d1 <= rgb_565_i;
valid_i_d1 <= valid_i;
rgb_565_o <= rgb_565_i_d1;
valid_o <= valid_i_d1;
end
end
always @(posedge clk or negedge reset) begin
if (!reset) begin
out_x_cnt <= 0;
out_y_cnt <= 0;
vsync_o <= 0;
end else begin
out_x_cnt <= valid_i ? ((out_x_cnt == img_width - 1) ? 0 : out_x_cnt + 1) : out_x_cnt;
out_y_cnt <=valid_i&&(out_x_cnt == img_width - 1) ? ((out_y_cnt == img_height - 1) ? 0 : out_y_cnt + 1) : out_y_cnt;
vsync_o <= (out_y_cnt == img_height - 1) ? 1 : 0;
end
end
endmodule