`timescale 1ns / 1ps
module vx_img_resize_axis#(
parameter DATA_WIDTH = 64
)(
input wire axis_aclk,
input wire axis_aresetn,
input wire [7:0] zoom_coef, //0表示不做缩放,1表示缩放2倍,2表示缩放4倍,3表示缩放8倍 4表示缩放16倍
input wire s00_axis_tuser,
input wire [DATA_WIDTH-1 : 0] s00_axis_tdata,
input wire [7 : 0] s00_axis_tstrb,
input wire s00_axis_tlast,
input wire s00_axis_tvalid,
output reg s00_axis_tready,
output reg m00_axis_tuser,
output reg m00_axis_tvalid,
output reg [DATA_WIDTH-1 : 0] m00_axis_tdata,
output reg [7 : 0] m00_axis_tstrb,
output reg m00_axis_tlast,
input wire m00_axis_tready ,
output reg [31:0] line_data_cnt_r,
output reg [31:0] line_cnt_r
);
always @(posedge axis_aclk or negedge axis_aresetn) begin
if (~axis_aresetn) begin
line_data_cnt_r <= 'b0;
line_cnt_r <= 'b0;
end else begin
// line_data_cnt_r <= (s00_axis_tuser||s00_axis_tlast) ? 'b0 : s00_axis_tvalid ? (line_data_cnt_r + 1'b1) : line_data_cnt_r;
// line_cnt_r <= s00_axis_tuser ? 'b0 : s00_axis_tlast ? (line_cnt_r + 1'b1) : line_cnt_r;
line_data_cnt_r <= ( ( s00_axis_tuser && s00_axis_tvalid && m00_axis_tready ) || ( s00_axis_tlast && s00_axis_tvalid && m00_axis_tready )) ? 'b0 : ( s00_axis_tvalid && m00_axis_tready ) ? (line_data_cnt_r + 1'b1) : line_data_cnt_r;
line_cnt_r <= ( s00_axis_tuser && s00_axis_tvalid && m00_axis_tready ) ? 'b0 : ( s00_axis_tlast && s00_axis_tvalid && m00_axis_tready ) ? (line_cnt_r + 1'b1) : line_cnt_r;
end
end
reg s00_axis_tvalid_d1;
reg [63:0] s00_axis_tdata_d1;
reg s00_axis_tstrb_d1;
reg s00_axis_tlast_d1;
reg s00_axis_tuser_d1;
reg m00_axis_tready_d1;
//输出计算结果
always @(posedge axis_aclk or negedge axis_aresetn) begin
if (~axis_aresetn) begin
s00_axis_tready <= 'b0;
m00_axis_tuser <= 'b0;
m00_axis_tvalid <= 'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
m00_axis_tlast <= 'b0;
end else begin
m00_axis_tready_d1 <= m00_axis_tready;
s00_axis_tuser_d1 <= s00_axis_tuser;
s00_axis_tready <= m00_axis_tready_d1;
m00_axis_tuser <= s00_axis_tuser_d1;
s00_axis_tvalid_d1 <=s00_axis_tvalid;
s00_axis_tdata_d1 <=s00_axis_tdata ;
s00_axis_tstrb_d1 <=s00_axis_tstrb ;
s00_axis_tlast_d1 <=s00_axis_tlast ;
case(zoom_coef)
8'd0: begin
m00_axis_tvalid <=s00_axis_tvalid_d1;
m00_axis_tdata <= s00_axis_tdata_d1;
m00_axis_tstrb <= s00_axis_tstrb_d1;
m00_axis_tlast <= s00_axis_tlast_d1;
end
8'd1: begin
if ( line_cnt_r[0]== 1'b0) begin
m00_axis_tlast <= s00_axis_tlast_d1;
if(s00_axis_tvalid_d1 && ( line_data_cnt_r[0] == 'b0) ) begin
m00_axis_tvalid <= s00_axis_tvalid_d1;
m00_axis_tdata <= s00_axis_tdata_d1;
m00_axis_tstrb <= s00_axis_tstrb_d1;
end else begin
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end else begin
m00_axis_tlast <= 1'b0;
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end
8'd2: begin
if ( line_cnt_r[1:0]== 2'b0) begin
m00_axis_tlast <= s00_axis_tlast_d1;
if(s00_axis_tvalid_d1 && ( line_data_cnt_r[1:0] == 2'b0) ) begin
m00_axis_tvalid <= s00_axis_tvalid_d1;
m00_axis_tdata <= s00_axis_tdata_d1;
m00_axis_tstrb <= s00_axis_tstrb_d1;
end else begin
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end else begin
m00_axis_tlast <= 1'b0;
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end
8'd3: begin
if ( line_cnt_r[2:0]== 3'b0) begin
m00_axis_tlast <= s00_axis_tlast_d1;
if(s00_axis_tvalid_d1 && ( line_data_cnt_r[2:0] == 3'b0) ) begin
m00_axis_tvalid <= s00_axis_tvalid_d1;
m00_axis_tdata <= s00_axis_tdata_d1;
m00_axis_tstrb <= s00_axis_tstrb_d1;
end else begin
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end else begin
m00_axis_tlast <= 1'b0;
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end
8'd4: begin
if ( line_cnt_r[3:0]== 4'b0) begin
m00_axis_tlast <= s00_axis_tlast_d1;
if(s00_axis_tvalid_d1 && ( line_data_cnt_r[3:0] == 4'b0) ) begin
m00_axis_tvalid <= s00_axis_tvalid_d1;
m00_axis_tdata <= s00_axis_tdata_d1;
m00_axis_tstrb <= s00_axis_tstrb_d1;
end else begin
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end else begin
m00_axis_tlast <= 1'b0;
m00_axis_tvalid <= 1'b0;
m00_axis_tdata <= 'b0;
m00_axis_tstrb <= 'b0;
end
end
default :begin
m00_axis_tvalid <=s00_axis_tvalid_d1;
m00_axis_tdata <= s00_axis_tdata_d1;
m00_axis_tstrb <= s00_axis_tstrb_d1;
m00_axis_tlast <= s00_axis_tlast_d1;
end
endcase
end
end
endmodule