module Crop_Pipeline #( parameter IN_WIDTH = 512, parameter IN_HEIGHT = 512, parameter OFFSET_X = 120, parameter OFFSET_Y = 256, // parameter TRANSLAYT_X = 120, // parameter TRANSLAYT_Y = 120, parameter OUT_WIDTH = 512, parameter OUT_HEIGHT = 512, parameter BLANK_COLOR = 6'h000000, parameter COLOR_DEPTH = 16 ) ( input wire clk, input wire reset, input wire [COLOR_DEPTH - 1:0] in_data [3], input wire [7:0] in_user, output reg [COLOR_DEPTH - 1:0] out_data [3], output wire [7:0] out_user, input wire in_valid, output reg out_valid, input wire in_ready, output wire out_ready ); wire in_fstart, in_hstart; reg out_fstart, out_hstart; assign in_fstart = in_user[1]; assign in_hstart = in_user[0]; localparam PIPELINE = 3; reg [5:0] pipeline_user[PIPELINE]; reg [PIPELINE-1:0] pipeline_valid; wire pipeline_running; assign pipeline_running = in_ready | ~pipeline_valid[PIPELINE-1]; reg [31:0] cnt_x, cnt_y, temp_x, temp_y; reg force_dis; reg [COLOR_DEPTH-1:0] data_cache0[3]; reg [COLOR_DEPTH-1:0] data_cache1[3]; //out_ready :只要本模块可以接收数据就一直拉高 assign out_ready = pipeline_running; //out_valid :只要本模块可以发出数据就一直拉高 assign out_valid = (pipeline_valid[PIPELINE-1] & ~force_dis); assign out_user = {pipeline_user[PIPELINE-1],out_fstart,out_hstart}; //分别表示当前像素: 显示;被裁掉;空。 reg flag_crop; localparam CROP_KEEP = 1'b0, CROP_GIVE_UP = 1'b1; integer i; always @(posedge clk) begin if(reset) for(i=0;i<3;i=i+1) data_cache0[i] <= 0; else if(pipeline_running & in_valid) for(i=0;i<3;i++) data_cache0[i] <= in_data[i]; else for(i=0;i<3;i=i+1) data_cache0[i] <= data_cache0[i]; end always @(posedge clk) begin if(reset) for(i=0;i<3;i=i+1) data_cache1[i] <= 0; else if(pipeline_running & pipeline_valid[0]) for(i=0;i<3;i++) data_cache1[i] <= data_cache0[i]; else for(i=0;i<3;i=i+1) data_cache1[i] <= data_cache1[i]; end always @(posedge clk) begin if(reset) begin pipeline_valid <= 0; cnt_x <= 0; cnt_y <= 0; for(i=0;i<3;i=i+1) out_data[i] <= 0; flag_crop <= 0; force_dis <= 0; out_hstart <= 0; out_fstart <= 0; temp_x <= 0; temp_y <= 0; for(i=0;i= OFFSET_Y); out_fstart <= (temp_x == OFFSET_X) && (temp_y == OFFSET_Y); case (flag_crop) CROP_KEEP : force_dis <= 1'b0; CROP_GIVE_UP : force_dis <= 1'b1; endcase end end end endmodule