`timescale 1ns / 1ps
module scaler_inact #(、
parameter SRC_IW = 640 ,
parameter SRC_IH = 480 ,
parameter DST_IW = 1280 ,
parameter DST_IH = 720
)
(
input clk ,
input rst ,
input pre_ready ,
output pre_req ,
input [7:0] pre_data ,
input post_clk ,
output reg post_ready ,
input post_req ,
output [7:0] post_data ,
output post_empty
);
reg [2:0] state ;
reg [2:0] state_r ;
reg src_de ;
reg [13:0] src_hcnt ;
reg [13:0] src_vcnt ;
reg dst_de ;
reg [13:0] dst_hcnt ;
reg [13:0] dst_vcnt ;
reg [15:0] expt_src_vcnt0 ;
reg [31:0] expt_src_vcnt1 ;
reg [25:0] expt_src_vcnt2 ;
reg [13:0] expt_src_vcnt3 ;
reg expt_src_vcnt_de ;
reg expt_src_vcntp1_de ;
reg expt_src_vcnt_de0 ;
reg expt_src_vcnt_de1 ;
reg expt_src_vcnt_de2 ;
reg expt_src_vcnt_de3 ;
reg [15:0] src_xf0 ;
reg [31:0] src_xf1 ;
reg [25:0] src_xf2 ;
reg [25:0] src_xf3 ;
reg [15:0] src_yf0 ;
reg [31:0] src_yf1 ;
reg [25:0] src_yf2 ;
reg [25:0] src_yf3 ;
reg [13:0] src_x0 ;
reg [13:0] src_x1 ;
reg [13:0] src_y0 ;
reg [13:0] src_y1 ;
wire full ;
wire [13:0] rd_data_count ;
wire [13:0] wr_data_count ;
localparam [15:0] sx = SRC_IW*4096/DST_IW ;
localparam [15:0] sy = SRC_IH*4096/DST_IH ;
localparam buf_line = 3;
always@(posedge clk)
if(rst)
begin
dst_de <= 0;
state <= 0;
end
else if(pre_ready==1'b1)
case(state)
0:
if(wr_data_count<DST_IW*buf_line-13)
begin
state <= 2;
end
else
begin
state <= state;
end
1:
if(src_hcnt==SRC_IW-1)
begin
state <= 2;
end
else
begin
state <= state;
end
2:
if(src_vcnt>=expt_src_vcnt3&&expt_src_vcnt_de3==1'b1)
begin
state <= 3;
end
else if(src_vcnt<expt_src_vcnt3&&expt_src_vcnt_de3==1'b1)
begin
state <= 1;
end
else
begin
state <= state;
end
3:
if(dst_hcnt==DST_IW-1)
begin
dst_de <= 0;
state <= 0;
end
else
begin
dst_de <= 1;
state <= state;
end
default:;
endcase
else
begin
dst_de <= 0;
state <= 0;
end
always@(posedge clk)
if(rst)
state_r <= 'd0;
else
state_r <= state;
always@(posedge clk)
if(rst)
expt_src_vcnt_de <= 1'b0;
else if(state_r!=2&&state==2)
expt_src_vcnt_de <= 1'b1;
else
expt_src_vcnt_de <= 1'b0;
always@(posedge clk)
if(rst)
expt_src_vcntp1_de <= 1'b0;
else if(state_r!=3&&state==3)
expt_src_vcntp1_de <= 1'b1;
else
expt_src_vcntp1_de <= 1'b0;
always@(posedge clk)
if(rst)
src_de <= 1'b0;
else if(src_hcnt==SRC_IW-1)
src_de <= 1'b0;
else if(state_r!=1&&state==1)
src_de <= 1'b1;
else if(src_vcnt<expt_src_vcnt3&&expt_src_vcnt_de3==1'b1&&state==3)
src_de <= 1'b1;
else
src_de <= src_de;
always@(posedge clk)
if(rst)
src_hcnt <= 'd0;
else if(src_hcnt==SRC_IW-1)
src_hcnt <= 'd0;
else if(src_de==1'b1)
src_hcnt <= src_hcnt + 1'b1;
else
src_hcnt <= src_hcnt;
always@(posedge clk)
if(rst)
src_vcnt <= 'd0;
else if(src_vcnt==SRC_IH&&dst_hcnt==DST_IW-1&&dst_vcnt==DST_IH-1)
src_vcnt <= 'd0;
else if(src_hcnt==SRC_IW-1)
src_vcnt <= src_vcnt + 1'b1;
else
src_vcnt <= src_vcnt;
assign pre_req = src_de;
reg [13:0] wr_addr_cnt ;
reg [1:0] wr_addr_sel ;
reg [11:0] pre_wr_addr [3:0] ;
wire wr_addr_de [3:0] ;
reg [11:0] wr_addr [3:0] ;
reg [11:0] rd_addr [3:0] ;
reg [11:0] rd_addr_w [3:0] ;
wire [7:0] douta [3:0] ;
wire [7:0] doutb [3:0] ;
always@(posedge clk)
if(rst)
wr_addr_sel <= 'd0;
else if(wr_addr_cnt==SRC_IW-1&&wr_addr_sel==3)
wr_addr_sel <= 'd0;
else if(wr_addr_cnt==SRC_IW-1)
wr_addr_sel <= wr_addr_sel + 1'b1;
else
wr_addr_sel <= wr_addr_sel;
always@(posedge clk)
if(rst)
wr_addr_cnt <= 'd0;
else if(wr_addr_cnt==SRC_IW-1)
wr_addr_cnt <= 'd0;
else if(pre_req==1'b1)
wr_addr_cnt <= wr_addr_cnt + 1'b1;
else
wr_addr_cnt <= wr_addr_cnt;
genvar i;
generate
for (i=0; i < 4; i=i+1)
begin: wr_src_data
assign wr_addr_de[i] = (pre_req==1'b1&&wr_addr_sel==i);
always@(posedge clk)
if(rst)
pre_wr_addr[i] <= 'd0;
else if(pre_wr_addr[i]==SRC_IW-1)
pre_wr_addr[i] <= 'd0;
else if(wr_addr_de[i]==1'b1)
pre_wr_addr[i] <= pre_wr_addr[i] + 1'b1;
else
pre_wr_addr[i] <= pre_wr_addr[i];
always@(*)
if(rst)
wr_addr[i] = 'd0;
else if(wr_addr_de[i]==1'b1)
wr_addr[i] = pre_wr_addr[i];
else
wr_addr[i] = rd_addr_w[i];
tdpram #(
.AW (12),
.DW (8 )
)
u1_tdpram
(
.clka (clk ),
.wea (wr_addr_de[i] ),
.addra (wr_addr[i] ),
.dina (pre_data ),
.douta (douta[i] ),
.clkb (clk ),
.web (1'b0 ),
.addrb (rd_addr[i] ),
.dinb (8'd0 ),
.doutb (doutb[i] )
);
end
endgenerate
always@(posedge clk)
if(rst)
dst_hcnt <= 'd0;
else if(dst_hcnt==DST_IW-1)
dst_hcnt <= 'd0;
else if(dst_de==1'b1)
dst_hcnt <= dst_hcnt + 1'b1;
else
dst_hcnt <= dst_hcnt;
always@(posedge clk)
if(rst)
dst_vcnt <= 'd0;
else if(dst_hcnt==DST_IW-1&&dst_vcnt==DST_IH-1)
dst_vcnt <= 'd0;
else if(dst_hcnt==DST_IW-1)
dst_vcnt <= dst_vcnt + 1'b1;
else
dst_vcnt <= dst_vcnt;
always@(posedge clk)
if(rst)
begin
expt_src_vcnt_de0 <= 1'b0;
expt_src_vcnt_de1 <= 1'b0;
expt_src_vcnt_de2 <= 1'b0;
expt_src_vcnt_de3 <= 1'b0;
end
else
begin
expt_src_vcnt_de0 <= expt_src_vcnt_de||expt_src_vcntp1_de;
expt_src_vcnt_de1 <= expt_src_vcnt_de0;
expt_src_vcnt_de2 <= expt_src_vcnt_de1;
expt_src_vcnt_de3 <= expt_src_vcnt_de2;
end
always@(posedge clk)
if(rst)
expt_src_vcnt0 <= 'd0;
else if(expt_src_vcnt_de==1'b1)
expt_src_vcnt0 <= {dst_vcnt,2'd0} + 2;
else if(expt_src_vcntp1_de==1'b1&&dst_vcnt<DST_IH-1)
expt_src_vcnt0 <= {dst_vcnt+1,2'd0} + 2;
else
expt_src_vcnt0 <= 'd0;
always@(posedge clk)
if(rst)
expt_src_vcnt1 <= 'd0;
else
expt_src_vcnt1 <= expt_src_vcnt0*sy;
always@(posedge clk)
if(rst)
expt_src_vcnt2 <= 'd0;
else
expt_src_vcnt2 <= expt_src_vcnt1[27:2] - 2048;
always@(posedge clk)
if(rst)
expt_src_vcnt3 <= 'd0;
else if(expt_src_vcnt2[25]==1'b1)
expt_src_vcnt3 <= 'd2;
else if(expt_src_vcnt2[25:12]>SRC_IH-2)
expt_src_vcnt3 <= SRC_IH;
else
expt_src_vcnt3 <= expt_src_vcnt2[25:12] + 2;
reg dst_de0 ;
reg dst_de1 ;
reg dst_de2 ;
reg src_xy_de ;
always@(posedge clk)
if(rst)
begin
dst_de0 <= 1'b0;
dst_de1 <= 1'b0;
dst_de2 <= 1'b0;
end
else
begin
dst_de0 <= dst_de;
dst_de1 <= dst_de0;
dst_de2 <= dst_de1;
end
always@(posedge clk)
if(rst)
src_xy_de <= 1'b0;
else
src_xy_de <= dst_de2;
always@(posedge clk)
if(rst)
src_xf0 <= 'd0;
else if(dst_de==1'b1)
src_xf0 <= {dst_hcnt,2'd0} + 2;
else
src_xf0 <= 'd0;
always@(posedge clk)
if(rst)
src_xf1 <= 'd0;
else
src_xf1 <= src_xf0*sx;
always@(posedge clk)
if(rst)
src_xf2 <= 'd0;
else
src_xf2 <= src_xf1[27:2] - 2048;
always@(posedge clk)
if(rst)
src_xf3 <= 'd0;
else
src_xf3 <= src_xf2;
always@(posedge clk)
if(rst)
src_x0 <= 'd0;
else if(src_xf2[25]==1'b1)
src_x0 <= 'd0;
else
src_x0 <= src_xf2[25:12];
always@(posedge clk)
if(rst)
src_x1 <= 'd0;
else if(src_xf2[25]==1'b1)
src_x1 <= 'd1;
else
src_x1 <= src_xf2[25:12] + 1'b1;
always@(posedge clk)
if(rst)
src_yf0 <= 'd0;
else if(dst_de==1'b1)
src_yf0 <= {dst_vcnt,2'd0} + 2;
else
src_yf0 <= 'd0;
always@(posedge clk)
if(rst)
src_yf1 <= 'd0;
else
src_yf1 <= src_yf0*sy;
always@(posedge clk)
if(rst)
src_yf2 <= 'd0;
else
src_yf2 <= src_yf1[27:2] - 2048;
always@(posedge clk)
if(rst)
src_yf3 <= 'd0;
else
src_yf3 <= src_yf2;
always@(posedge clk)
if(rst)
src_y0 <= 'd0;
else if(src_yf2[25]==1'b1)
src_y0 <= 'd0;
else
src_y0 <= src_yf2[25:12];
always@(posedge clk)
if(rst)
src_y1 <= 'd0;
else if(src_yf2[25]==1'b1)
src_y1 <= 'd1;
else
src_y1 <= src_yf2[25:12] + 1'b1;
reg [2:0] region_type ;
reg [2:0] region_type_r ;
reg [2:0] region_type_r1 ;
reg [2:0] region_type_r2 ;
reg [2:0] region_type_r3 ;
reg [2:0] region_type_r4 ;
always@(posedge clk)
if(rst)
region_type <= 0;
else if(src_x0>=SRC_IW-1&&src_y0>=SRC_IH-1&&src_xy_de==1'b1)
region_type <= 1;
else if(src_y0>=SRC_IH-1&&src_xy_de==1'b1)
region_type <= 2;
else if(src_x0>=SRC_IW-1&&src_xy_de==1'b1)
region_type <= 3;
else
region_type <= 4;
always@(posedge clk)
if(rst)
begin
region_type_r <= 'd0;
region_type_r1 <= 'd0;
region_type_r2 <= 'd0;
region_type_r3 <= 'd0;
region_type_r4 <= 'd0;
end
else
begin
region_type_r <= region_type ;
region_type_r1 <= region_type_r ;
region_type_r2 <= region_type_r1 ;
region_type_r3 <= region_type_r2 ;
region_type_r4 <= region_type_r3 ;
end
wire [1:0] src_mod ;
reg [1:0] src_mod_r ;
reg [1:0] src_mod_r1 ;
reg [1:0] src_mod_r2 ;
reg [7:0] data00 ;
reg [7:0] data01 ;
reg [7:0] data10 ;
reg [7:0] data11 ;
reg [7:0] data00_r ;
reg [7:0] data01_r ;
reg [7:0] data10_r ;
reg [7:0] data11_r ;
assign src_mod = src_y0%4;
always@(posedge clk)
if(rst)
begin
src_mod_r <= 'd0;
src_mod_r1 <= 'd0;
src_mod_r2 <= 'd0;
end
else
begin
src_mod_r <= src_mod ;
src_mod_r1 <= src_mod_r ;
src_mod_r2 <= src_mod_r1 ;
end
reg [7:0] multi_data_de;
always@(posedge clk)
if(rst)
multi_data_de <= 'd0;
else
multi_data_de <= {multi_data_de[6:0],src_xy_de};
wire rd_addr_de ;
assign rd_addr_de = multi_data_de[0];
always@(posedge clk)
case(src_mod)
0:
begin
rd_addr_w[0] <= src_x0;
rd_addr[0] <= src_x1;
rd_addr_w[1] <= src_x0;
rd_addr[1] <= src_x1;
end
1:
begin
rd_addr_w[1] <= src_x0;
rd_addr[1] <= src_x1;
rd_addr_w[2] <= src_x0;
rd_addr[2] <= src_x1;
end
2:
begin
rd_addr_w[2] <= src_x0;
rd_addr[2] <= src_x1;
rd_addr_w[3] <= src_x0;
rd_addr[3] <= src_x1;
end
3:
begin
rd_addr_w[3] <= src_x0;
rd_addr[3] <= src_x1;
rd_addr_w[0] <= src_x0;
rd_addr[0] <= src_x1;
end
default:;
endcase
wire data_de ;
assign data_de = multi_data_de[2];
always@(posedge clk)
case(src_mod_r1)
0:
begin
data00 <= douta[0];
data01 <= doutb[0];
data10 <= douta[1];
data11 <= doutb[1];
end
1:
begin
data00 <= douta[1];
data01 <= doutb[1];
data10 <= douta[2];
data11 <= doutb[2];
end
2:
begin
data00 <= douta[2];
data01 <= doutb[2];
data10 <= douta[3];
data11 <= doutb[3];
end
3:
begin
data00 <= douta[3];
data01 <= doutb[3];
data10 <= douta[0];
data11 <= doutb[0];
end
default:;
endcase
wire data_de_r ;
assign data_de_r = multi_data_de[3];
always@(posedge clk)
if(rst)
begin
data00_r <= 'd0;
data01_r <= 'd0;
data10_r <= 'd0;
data11_r <= 'd0;
end
else
begin
data00_r <= data00;
data01_r <= data01;
data10_r <= data10;
data11_r <= data11;
end
reg [25:0] v ;
reg [13:0] v_r ;
reg [13:0] v_r1 ;
reg [13:0] rv ;
reg [25:0] u ;
reg [13:0] u_r ;
reg [13:0] u_r1 ;
reg [13:0] ru ;
reg [27:0] ru_rv ;
reg [27:0] ru_v ;
reg [27:0] u_rv ;
reg [27:0] u_v ;
wire u_v_de ;
assign u_v_de = multi_data_de[2];
reg [13:0] u_v_hcnt ;
reg [13:0] u_v_vcnt ;
always@(posedge clk)
if(rst)
u_v_hcnt <= 'd0;
else if(u_v_hcnt==DST_IW-1)
u_v_hcnt <= 'd0;
else if(u_v_de==1'b1)
u_v_hcnt <= u_v_hcnt + 1'b1;
else
u_v_hcnt <= u_v_hcnt;
always@(posedge clk)
if(rst)
u_v_vcnt <= 'd0;
else if(u_v_hcnt==DST_IW-1&&u_v_vcnt==DST_IH-1)
u_v_vcnt <= 'd0;
else if(u_v_hcnt==DST_IW-1)
u_v_vcnt <= u_v_vcnt + 1'b1;
else
u_v_vcnt <= u_v_vcnt;
always@(posedge clk)
if(rst)
v <= 'd0;
else
v <= $signed(src_xf3) - $signed({src_x0,12'd0});
always@(posedge clk)
if(rst)
rv <= 'd0;
else
rv <= $signed({1'b0,1'b1,12'd0}) - $signed(v_r);
always@(posedge clk)
if(rst)
u <= 'd0;
else
u <= $signed(src_yf3) - $signed({src_y0,12'd0});
always@(posedge clk)
if(rst)
ru <= 'd0;
else
ru <= $signed({1'b0,1'b1,12'd0}) - $signed(u_r);
always@(posedge clk)
if(rst)
begin
v_r <= 'd0;
v_r1 <= 'd0;
end
else
begin
v_r <= v[13:0];
v_r1 <= v_r;
end
always@(posedge clk)
if(rst)
begin
u_r <= 'd0;
u_r1 <= 'd0;
end
else
begin
u_r <= u[13:0];
u_r1 <= u_r;
end
wire uv_de ;
assign uv_de = multi_data_de[3];
always@(posedge clk)
if(rst)
begin
ru_rv <= 'd0;
ru_v <= 'd0;
u_rv <= 'd0;
u_v <= 'd0;
end
else
begin
ru_rv <= $signed(ru )*$signed(rv );
ru_v <= $signed(ru )*$signed(v_r1);
u_rv <= $signed(u_r1)*$signed(rv );
u_v <= $signed(u_r1)*$signed(v_r1);
end
reg [22:0] line_data11 = 0;
reg [22:0] line_data21 = 0;
reg [22:0] line_data22 = 0;
reg [22:0] line_data31 = 0;
reg [22:0] line_data32 = 0;
reg [22:0] line_data41 = 0;
reg [22:0] line_data42 = 0;
reg [22:0] line_data43 = 0;
reg [22:0] line_data44 = 0;
reg [23:0] line_data11_11 = 0;
reg [23:0] line_data21_22 = 0;
reg [23:0] line_data31_32 = 0;
reg [23:0] line_data41_42 = 0;
reg [23:0] line_data43_44 = 0;
reg [24:0] line_data = 0;
wire line_de ;
assign line_de = multi_data_de[4];
always@(posedge clk)
case(region_type_r2)
1:
begin
line_data11 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
end
2:
begin
line_data21 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
line_data22 <= $signed(ru_v[25:12])*$signed({1'b0,data01_r});
end
3:
begin
line_data31 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
line_data32 <= $signed(u_rv[25:12])*$signed({1'b0,data10_r});
end
4:
begin
line_data41 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
line_data42 <= $signed(ru_v[25:12])*$signed({1'b0,data01_r});
line_data43 <= $signed(u_rv[25:12])*$signed({1'b0,data10_r});
line_data44 <= $signed(u_v[25:12])*$signed({1'b0,data11_r});
end
default:;
endcase
wire line2_de ;
assign line2_de = multi_data_de[5];
always@(posedge clk)
case(region_type_r3)
1:
begin
line_data11_11 <= $signed(line_data11);
end
2:
begin
line_data21_22 <= $signed(line_data21) + $signed(line_data22);
end
3:
begin
line_data31_32 <= $signed(line_data31) + $signed(line_data32);
end
4:
begin
line_data41_42 <= $signed(line_data41) + $signed(line_data42);
line_data43_44 <= $signed(line_data43) + $signed(line_data44);
end
default:;
endcase
wire line4_de ;
assign line4_de = multi_data_de[6];
always@(posedge clk)
case(region_type_r4)
1:
begin
line_data <= $signed(line_data11_11);
end
2:
begin
line_data <= $signed(line_data21_22);
end
3:
begin
line_data <= $signed(line_data31_32);
end
4:
begin
line_data <= $signed(line_data41_42) + $signed(line_data43_44);
end
default:;
endcase
wire cast_de ;
reg [7:0] cast_data ;
reg [13:0] cast_hcnt ;
reg [13:0] cast_vcnt ;
assign cast_de = multi_data_de[7];
always@(posedge clk)
if(rst)
cast_data <= 'd0;
else if(line_data[24]==1'b1)
cast_data <= 0;
else if(line_data[22:12]>=255)
cast_data <= 255;
else
cast_data <= line_data[11] ? line_data[19:12] + 1'b1 : line_data[19:12];
always@(posedge clk)
if(rst)
cast_hcnt <= 'd0;
else if(cast_hcnt==DST_IW-1)
cast_hcnt <= 'd0;
else if(cast_de==1'b1)
cast_hcnt <= cast_hcnt + 1'b1;
else
cast_hcnt <= cast_hcnt;
always@(posedge clk)
if(rst)
cast_vcnt <= 'd0;
else if(cast_hcnt==DST_IW-1&&cast_vcnt==DST_IH-1)
cast_vcnt <= 'd0;
else if(cast_hcnt==DST_IW-1)
cast_vcnt <= cast_vcnt + 1'b1;
else
cast_vcnt <= cast_vcnt;
xpm_asfifo #(
.FIFO_MEMORY_TYPE ("block"),
.WRITE_DATA_WIDTH (8 ),
.FIFO_WRITE_DEPTH (16384 ),
.WR_DATA_COUNT_WIDTH (15 ),
.READ_MODE ("fwft" ),
.READ_DATA_WIDTH (8 ),
.RD_DATA_COUNT_WIDTH (15 ),
.FIFO_READ_LATENCY (0 )
)
u1_xpm_asfifo
(
.rst (1'b0 ),
.wr_clk (clk ),
.rd_clk (post_clk ),
.din (cast_data ),
.wr_en (cast_de ),
.rd_en (post_req ),
.dout (post_data ),
.full (full ),
.empty (post_empty ),
.rd_data_count (rd_data_count ),
.wr_data_count (wr_data_count )
);
always@(posedge post_clk)
if(rst)
post_ready <= 1'b0;
else if(rd_data_count>=DST_IW*buf_line)
post_ready <= 1'b1;
else
post_ready <= post_ready;
endmodule
`timescale 1ns / 1ps
module scaler_act #(
parameter SRC_IW = 640 ,
parameter SRC_IH = 480 ,
parameter DST_IW = 320 ,
parameter DST_IH = 240
)
(
input clk ,
input rst ,
input pre_vs ,
input pre_de ,
input [7:0] pre_data ,
output reg cast_vs ,
output cast_de ,
output reg [7:0] cast_data
);
reg [2:0] state ;
reg [2:0] state_r ;
reg [13:0] src_hcnt ;
reg [13:0] src_vcnt ;
reg dst_de ;
reg [13:0] dst_hcnt ;
reg [13:0] dst_vcnt ;
reg [15:0] expt_src_vcnt0 ;
reg [31:0] expt_src_vcnt1 ;
reg [25:0] expt_src_vcnt2 ;
reg [13:0] expt_src_vcnt3 ;
reg expt_src_vcnt_de ;
reg expt_src_vcntp1_de ;
reg expt_src_vcnt_de0 ;
reg expt_src_vcnt_de1 ;
reg expt_src_vcnt_de2 ;
reg expt_src_vcnt_de3 ;
reg [15:0] src_xf0 ;
reg [31:0] src_xf1 ;
reg [25:0] src_xf2 ;
reg [25:0] src_xf3 ;
reg [15:0] src_yf0 ;
reg [31:0] src_yf1 ;
reg [25:0] src_yf2 ;
reg [25:0] src_yf3 ;
reg [13:0] src_x0 ;
reg [13:0] src_x1 ;
reg [13:0] src_y0 ;
reg [13:0] src_y1 ;
localparam [15:0] sx_recip = SRC_IW*4096/DST_IW ;
localparam [15:0] sy_recip = SRC_IH*4096/DST_IH ;
always@(posedge clk)
if(rst)
begin
dst_de <= 0;
state <= 0;
end
else
case(state)
0:
begin
state <= 1;
end
1:
begin
state <= 2;
end
2:
if(src_vcnt>=expt_src_vcnt3&&expt_src_vcnt_de3==1'b1)
begin
state <= 3;
end
else if(src_vcnt<expt_src_vcnt3&&expt_src_vcnt_de3==1'b1)
begin
state <= 1;
end
else
begin
state <= state;
end
3:
if(dst_hcnt==DST_IW-1)
begin
dst_de <= 0;
state <= 1;
end
else
begin
dst_de <= 1;
state <= state;
end
default:;
endcase
always@(posedge clk)
if(rst)
state_r <= 'd0;
else
state_r <= state;
always@(posedge clk)
if(rst)
expt_src_vcnt_de <= 1'b0;
else if(state_r!=2&&state==2)
expt_src_vcnt_de <= 1'b1;
else
expt_src_vcnt_de <= 1'b0;
always@(posedge clk)
if(rst)
expt_src_vcntp1_de <= 1'b0;
else if(state_r!=3&&state==3)
expt_src_vcntp1_de <= 1'b1;
else
expt_src_vcntp1_de <= 1'b0;
always@(posedge clk)
if(rst)
src_hcnt <= 'd0;
else if(src_hcnt==SRC_IW-1)
src_hcnt <= 'd0;
else if(pre_de==1'b1)
src_hcnt <= src_hcnt + 1'b1;
else
src_hcnt <= src_hcnt;
always@(posedge clk)
if(rst)
src_vcnt <= 'd0;
else if(src_vcnt==SRC_IH&&dst_hcnt==DST_IW-1&&dst_vcnt==DST_IH-1)
src_vcnt <= 'd0;
else if(src_hcnt==SRC_IW-1)
src_vcnt <= src_vcnt + 1'b1;
else
src_vcnt <= src_vcnt;
reg [13:0] wr_addr_cnt ;
reg [1:0] wr_addr_sel ;
reg [11:0] pre_wr_addr [3:0] ;
wire wr_addr_de [3:0] ;
reg [11:0] wr_addr [3:0] ;
reg [11:0] rd_addr [3:0] ;
reg [11:0] rd_addr_w [3:0] ;
wire [7:0] douta [3:0] ;
wire [7:0] doutb [3:0] ;
always@(posedge clk)
if(rst)
wr_addr_sel <= 'd0;
else if(wr_addr_cnt==SRC_IW-1&&wr_addr_sel==3)
wr_addr_sel <= 'd0;
else if(wr_addr_cnt==SRC_IW-1)
wr_addr_sel <= wr_addr_sel + 1'b1;
else
wr_addr_sel <= wr_addr_sel;
always@(posedge clk)
if(rst)
wr_addr_cnt <= 'd0;
else if(wr_addr_cnt==SRC_IW-1)
wr_addr_cnt <= 'd0;
else if(pre_de==1'b1)
wr_addr_cnt <= wr_addr_cnt + 1'b1;
else
wr_addr_cnt <= wr_addr_cnt;
genvar i;
generate
for (i=0; i < 4; i=i+1)
begin: wr_src_data
assign wr_addr_de[i] = (pre_de==1'b1&&wr_addr_sel==i);
always@(posedge clk)
if(rst)
pre_wr_addr[i] <= 'd0;
else if(pre_wr_addr[i]==SRC_IW-1)
pre_wr_addr[i] <= 'd0;
else if(wr_addr_de[i]==1'b1)
pre_wr_addr[i] <= pre_wr_addr[i] + 1'b1;
else
pre_wr_addr[i] <= pre_wr_addr[i];
always@(*)
if(rst)
wr_addr[i] = 'd0;
else if(wr_addr_de[i]==1'b1)
wr_addr[i] = pre_wr_addr[i];
else
wr_addr[i] = rd_addr_w[i];
tdpram #(
.AW (12),
.DW (8 )
)
u1_tdpram
(
.clka (clk ),
.wea (wr_addr_de[i] ),
.addra (wr_addr[i] ),
.dina (pre_data ),
.douta (douta[i] ),
.clkb (clk ),
.web (1'b0 ),
.addrb (rd_addr[i] ),
.dinb (8'd0 ),
.doutb (doutb[i] )
);
end
endgenerate
always@(posedge clk)
if(rst)
dst_hcnt <= 'd0;
else if(dst_hcnt==DST_IW-1)
dst_hcnt <= 'd0;
else if(dst_de==1'b1)
dst_hcnt <= dst_hcnt + 1'b1;
else
dst_hcnt <= dst_hcnt;
always@(posedge clk)
if(rst)
dst_vcnt <= 'd0;
else if(dst_hcnt==DST_IW-1&&dst_vcnt==DST_IH-1)
dst_vcnt <= 'd0;
else if(dst_hcnt==DST_IW-1)
dst_vcnt <= dst_vcnt + 1'b1;
else
dst_vcnt <= dst_vcnt;
always@(posedge clk)
if(rst)
begin
expt_src_vcnt_de0 <= 1'b0;
expt_src_vcnt_de1 <= 1'b0;
expt_src_vcnt_de2 <= 1'b0;
expt_src_vcnt_de3 <= 1'b0;
end
else
begin
expt_src_vcnt_de0 <= expt_src_vcnt_de||expt_src_vcntp1_de;
expt_src_vcnt_de1 <= expt_src_vcnt_de0;
expt_src_vcnt_de2 <= expt_src_vcnt_de1;
expt_src_vcnt_de3 <= expt_src_vcnt_de2;
end
always@(posedge clk)
if(rst)
expt_src_vcnt0 <= 'd0;
else if(expt_src_vcnt_de==1'b1)
expt_src_vcnt0 <= {dst_vcnt,2'd0} + 2;
else if(expt_src_vcntp1_de==1'b1&&dst_vcnt<DST_IH-1)
expt_src_vcnt0 <= {dst_vcnt+1,2'd0} + 2;
else
expt_src_vcnt0 <= 'd0;
always@(posedge clk)
if(rst)
expt_src_vcnt1 <= 'd0;
else
expt_src_vcnt1 <= expt_src_vcnt0*sy_recip;
always@(posedge clk)
if(rst)
expt_src_vcnt2 <= 'd0;
else
expt_src_vcnt2 <= expt_src_vcnt1[27:2] - 2048;
always@(posedge clk)
if(rst)
expt_src_vcnt3 <= 'd0;
else if(expt_src_vcnt2[25]==1'b1)
expt_src_vcnt3 <= 'd2;
else if(expt_src_vcnt2[25:12]>SRC_IH-2)
expt_src_vcnt3 <= SRC_IH;
else
expt_src_vcnt3 <= expt_src_vcnt2[25:12] + 2;
reg dst_de0 ;
reg dst_de1 ;
reg dst_de2 ;
reg src_xy_de ;
always@(posedge clk)
if(rst)
begin
dst_de0 <= 1'b0;
dst_de1 <= 1'b0;
dst_de2 <= 1'b0;
end
else
begin
dst_de0 <= dst_de;
dst_de1 <= dst_de0;
dst_de2 <= dst_de1;
end
always@(posedge clk)
if(rst)
src_xy_de <= 1'b0;
else
src_xy_de <= dst_de2;
always@(posedge clk)
if(rst)
src_xf0 <= 'd0;
else if(dst_de==1'b1)
src_xf0 <= {dst_hcnt,2'd0} + 2;
else
src_xf0 <= 'd0;
always@(posedge clk)
if(rst)
src_xf1 <= 'd0;
else
src_xf1 <= src_xf0*sx_recip;
always@(posedge clk)
if(rst)
src_xf2 <= 'd0;
else
src_xf2 <= src_xf1[27:2] - 2048;
always@(posedge clk)
if(rst)
src_xf3 <= 'd0;
else
src_xf3 <= src_xf2;
always@(posedge clk)
if(rst)
src_x0 <= 'd0;
else if(src_xf2[25]==1'b1)
src_x0 <= 'd0;
else
src_x0 <= src_xf2[25:12];
always@(posedge clk)
if(rst)
src_x1 <= 'd0;
else if(src_xf2[25]==1'b1)
src_x1 <= 'd1;
else
src_x1 <= src_xf2[25:12] + 1'b1;
always@(posedge clk)
if(rst)
src_yf0 <= 'd0;
else if(dst_de==1'b1)
src_yf0 <= {dst_vcnt,2'd0} + 2;
else
src_yf0 <= 'd0;
always@(posedge clk)
if(rst)
src_yf1 <= 'd0;
else
src_yf1 <= src_yf0*sy_recip;
always@(posedge clk)
if(rst)
src_yf2 <= 'd0;
else
src_yf2 <= src_yf1[27:2] - 2048;
always@(posedge clk)
if(rst)
src_yf3 <= 'd0;
else
src_yf3 <= src_yf2;
always@(posedge clk)
if(rst)
src_y0 <= 'd0;
else if(src_yf2[25]==1'b1)
src_y0 <= 'd0;
else
src_y0 <= src_yf2[25:12];
always@(posedge clk)
if(rst)
src_y1 <= 'd0;
else if(src_yf2[25]==1'b1)
src_y1 <= 'd1;
else
src_y1 <= src_yf2[25:12] + 1'b1;
reg [2:0] region_type ;
reg [2:0] region_type_r ;
reg [2:0] region_type_r1 ;
reg [2:0] region_type_r2 ;
reg [2:0] region_type_r3 ;
reg [2:0] region_type_r4 ;
always@(posedge clk)
if(rst)
region_type <= 0;
else if(src_x0>=SRC_IW-1&&src_y0>=SRC_IH-1&&src_xy_de==1'b1)
region_type <= 1;
else if(src_y0>=SRC_IH-1&&src_xy_de==1'b1)
region_type <= 2;
else if(src_x0>=SRC_IW-1&&src_xy_de==1'b1)
region_type <= 3;
else
region_type <= 4;
always@(posedge clk)
if(rst)
begin
region_type_r <= 'd0;
region_type_r1 <= 'd0;
region_type_r2 <= 'd0;
region_type_r3 <= 'd0;
region_type_r4 <= 'd0;
end
else
begin
region_type_r <= region_type ;
region_type_r1 <= region_type_r ;
region_type_r2 <= region_type_r1 ;
region_type_r3 <= region_type_r2 ;
region_type_r4 <= region_type_r3 ;
end
wire [1:0] src_mod ;
reg [1:0] src_mod_r ;
reg [1:0] src_mod_r1 ;
reg [1:0] src_mod_r2 ;
reg [7:0] data00 ;
reg [7:0] data01 ;
reg [7:0] data10 ;
reg [7:0] data11 ;
reg [7:0] data00_r ;
reg [7:0] data01_r ;
reg [7:0] data10_r ;
reg [7:0] data11_r ;
assign src_mod = src_y0%4;
always@(posedge clk)
if(rst)
begin
src_mod_r <= 'd0;
src_mod_r1 <= 'd0;
src_mod_r2 <= 'd0;
end
else
begin
src_mod_r <= src_mod ;
src_mod_r1 <= src_mod_r ;
src_mod_r2 <= src_mod_r1 ;
end
reg [7:0] multi_data_de;
always@(posedge clk)
if(rst)
multi_data_de <= 'd0;
else
multi_data_de <= {multi_data_de[6:0],src_xy_de};
wire rd_addr_de ;
assign rd_addr_de = multi_data_de[0];
always@(posedge clk)
case(src_mod)
0:
begin
rd_addr_w[0] <= src_x0;
rd_addr[0] <= src_x1;
rd_addr_w[1] <= src_x0;
rd_addr[1] <= src_x1;
end
1:
begin
rd_addr_w[1] <= src_x0;
rd_addr[1] <= src_x1;
rd_addr_w[2] <= src_x0;
rd_addr[2] <= src_x1;
end
2:
begin
rd_addr_w[2] <= src_x0;
rd_addr[2] <= src_x1;
rd_addr_w[3] <= src_x0;
rd_addr[3] <= src_x1;
end
3:
begin
rd_addr_w[3] <= src_x0;
rd_addr[3] <= src_x1;
rd_addr_w[0] <= src_x0;
rd_addr[0] <= src_x1;
end
default:;
endcase
wire data_de ;
assign data_de = multi_data_de[2];
always@(posedge clk)
case(src_mod_r1)
0:
begin
data00 <= douta[0];
data01 <= doutb[0];
data10 <= douta[1];
data11 <= doutb[1];
end
1:
begin
data00 <= douta[1];
data01 <= doutb[1];
data10 <= douta[2];
data11 <= doutb[2];
end
2:
begin
data00 <= douta[2];
data01 <= doutb[2];
data10 <= douta[3];
data11 <= doutb[3];
end
3:
begin
data00 <= douta[3];
data01 <= doutb[3];
data10 <= douta[0];
data11 <= doutb[0];
end
default:;
endcase
wire data_de_r ;
assign data_de_r = multi_data_de[3];
always@(posedge clk)
if(rst)
begin
data00_r <= 'd0;
data01_r <= 'd0;
data10_r <= 'd0;
data11_r <= 'd0;
end
else
begin
data00_r <= data00;
data01_r <= data01;
data10_r <= data10;
data11_r <= data11;
end
reg [25:0] v ;
reg [13:0] v_r ;
reg [13:0] v_r1 ;
reg [13:0] rv ;
reg [25:0] u ;
reg [13:0] u_r ;
reg [13:0] u_r1 ;
reg [13:0] ru ;
reg [27:0] ru_rv ;
reg [27:0] ru_v ;
reg [27:0] u_rv ;
reg [27:0] u_v ;
wire u_v_de ;
assign u_v_de = multi_data_de[2];
reg [13:0] u_v_hcnt ;
reg [13:0] u_v_vcnt ;
always@(posedge clk)
if(rst)
u_v_hcnt <= 'd0;
else if(u_v_hcnt==DST_IW-1)
u_v_hcnt <= 'd0;
else if(u_v_de==1'b1)
u_v_hcnt <= u_v_hcnt + 1'b1;
else
u_v_hcnt <= u_v_hcnt;
always@(posedge clk)
if(rst)
u_v_vcnt <= 'd0;
else if(u_v_hcnt==DST_IW-1&&u_v_vcnt==DST_IH-1)
u_v_vcnt <= 'd0;
else if(u_v_hcnt==DST_IW-1)
u_v_vcnt <= u_v_vcnt + 1'b1;
else
u_v_vcnt <= u_v_vcnt;
always@(posedge clk)
if(rst)
v <= 'd0;
else
v <= $signed(src_xf3) - $signed({src_x0,12'd0});
always@(posedge clk)
if(rst)
rv <= 'd0;
else
rv <= $signed({1'b0,1'b1,12'd0}) - $signed(v_r);
always@(posedge clk)
if(rst)
u <= 'd0;
else
u <= $signed(src_yf3) - $signed({src_y0,12'd0});
always@(posedge clk)
if(rst)
ru <= 'd0;
else
ru <= $signed({1'b0,1'b1,12'd0}) - $signed(u_r);
always@(posedge clk)
if(rst)
begin
v_r <= 'd0;
v_r1 <= 'd0;
end
else
begin
v_r <= v[13:0];
v_r1 <= v_r;
end
always@(posedge clk)
if(rst)
begin
u_r <= 'd0;
u_r1 <= 'd0;
end
else
begin
u_r <= u[13:0];
u_r1 <= u_r;
end
wire uv_de ;
assign uv_de = multi_data_de[3];
always@(posedge clk)
if(rst)
begin
ru_rv <= 'd0;
ru_v <= 'd0;
u_rv <= 'd0;
u_v <= 'd0;
end
else
begin
ru_rv <= $signed(ru )*$signed(rv );
ru_v <= $signed(ru )*$signed(v_r1);
u_rv <= $signed(u_r1)*$signed(rv );
u_v <= $signed(u_r1)*$signed(v_r1);
end
reg [22:0] line_data11 = 0;
reg [22:0] line_data21 = 0;
reg [22:0] line_data22 = 0;
reg [22:0] line_data31 = 0;
reg [22:0] line_data32 = 0;
reg [22:0] line_data41 = 0;
reg [22:0] line_data42 = 0;
reg [22:0] line_data43 = 0;
reg [22:0] line_data44 = 0;
reg [23:0] line_data11_11 = 0;
reg [23:0] line_data21_22 = 0;
reg [23:0] line_data31_32 = 0;
reg [23:0] line_data41_42 = 0;
reg [23:0] line_data43_44 = 0;
reg [24:0] line_data = 0;
wire line_de ;
assign line_de = multi_data_de[4];
always@(posedge clk)
case(region_type_r2)
1:
begin
line_data11 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
end
2:
begin
line_data21 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
line_data22 <= $signed(ru_v[25:12])*$signed({1'b0,data01_r});
end
3:
begin
line_data31 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
line_data32 <= $signed(u_rv[25:12])*$signed({1'b0,data10_r});
end
4:
begin
line_data41 <= $signed(ru_rv[25:12])*$signed({1'b0,data00_r});
line_data42 <= $signed(ru_v[25:12])*$signed({1'b0,data01_r});
line_data43 <= $signed(u_rv[25:12])*$signed({1'b0,data10_r});
line_data44 <= $signed(u_v[25:12])*$signed({1'b0,data11_r});
end
default:;
endcase
wire line2_de ;
assign line2_de = multi_data_de[5];
always@(posedge clk)
case(region_type_r3)
1:
begin
line_data11_11 <= $signed(line_data11);
end
2:
begin
line_data21_22 <= $signed(line_data21) + $signed(line_data22);
end
3:
begin
line_data31_32 <= $signed(line_data31) + $signed(line_data32);
end
4:
begin
line_data41_42 <= $signed(line_data41) + $signed(line_data42);
line_data43_44 <= $signed(line_data43) + $signed(line_data44);
end
default:;
endcase
wire line4_de ;
assign line4_de = multi_data_de[6];
always@(posedge clk)
case(region_type_r4)
1:
begin
line_data <= $signed(line_data11_11);
end
2:
begin
line_data <= $signed(line_data21_22);
end
3:
begin
line_data <= $signed(line_data31_32);
end
4:
begin
line_data <= $signed(line_data41_42) + $signed(line_data43_44);
end
default:;
endcase
reg [13:0] cast_hcnt ;
reg [13:0] cast_vcnt ;
always@(posedge clk)
if(rst)
cast_vs <= 1'b0;
else
cast_vs <= pre_vs;
assign cast_de = multi_data_de[7];
always@(posedge clk)
if(rst)
cast_data <= 'd0;
else if(line_data[24]==1'b1)
cast_data <= 0;
else if(line_data[22:12]>=255)
cast_data <= 255;
else
cast_data <= line_data[11] ? line_data[19:12] + 1'b1 : line_data[19:12];
always@(posedge clk)
if(rst)
cast_hcnt <= 'd0;
else if(cast_hcnt==DST_IW-1)
cast_hcnt <= 'd0;
else if(cast_de==1'b1)
cast_hcnt <= cast_hcnt + 1'b1;
else
cast_hcnt <= cast_hcnt;
always@(posedge clk)
if(rst)
cast_vcnt <= 'd0;
else if(cast_hcnt==DST_IW-1&&cast_vcnt==DST_IH-1)
cast_vcnt <= 'd0;
else if(cast_hcnt==DST_IW-1)
cast_vcnt <= cast_vcnt + 1'b1;
else
cast_vcnt <= cast_vcnt;
endmodule