有一块板子,我在之上搞了一个视频输入、输出,本人初接FPGA,完全以cpu、dsp方式看FPGA,对于IP类极不适应,看别人弄FPGA鼠标轻点,一会功夫就建立起来一个系统,真是羡慕啊。
我模仿也搭建一个:

输入输出完全是手工编码:

输入:
always@(posedge rx_clk or negedge rst_n) //实用
begin
if ((rst_n == 0) || (M_AXI_ARESETN == 0 ))begin
rx_df <= `F_SDE;
ptr_fd <= 3'd0;
d_page <= 2'd0;
linebytes<=32'd0;
linebyte <=32'd0;
d_pages <=32'd0;
r1234 <= 3'd1;
f_width <= 'h308;
f_higth <= 'd288;
ptr_d <= 'd0;
len_con_a <= 'd0;
rx_1234 <= 'd1;
end else begin
rx_dv_er = 1'b0;
if ((rx_dv == 1'b1) & (rx_er == 1'b0)) begin
rxd = rx_d;
rx_dv_er = 1'b1;
if (rx_df == `F_SDE) begin
case (ptr_fd)
3'd0:begin
if ( (rxd == 16'hc54a) || (rxd == 16'hc53a) ) begin
if (rxd == 16'hc54a)
ptr_fd = ptr_fd + 3'd1;
else ptr_fd = ptr_fd + 3'd3;
end
else ptr_fd = 3'd0;
end
3'd1:
if (rxd == 16'ha34c) //a34c
ptr_fd = ptr_fd + 3'd1;
else ptr_fd = 3'd0;
3'd2: begin
if (rxd == 16'hc54a) begin//c54a
ptr_fd = ptr_fd + 3'd3;
isDL = 1'd1;
end
else ptr_fd = 3'd0;
end
3'd3:
if (rxd == 16'ha35c) //a34c
ptr_fd = ptr_fd + 3'd1;
else ptr_fd = 3'd0;
3'd4: begin
if (rxd == 16'hc53a) begin//c54a
ptr_fd = ptr_fd + 3'd1;
isDL = 1'd0;
end
else ptr_fd = 3'd0;
end
3'd5: begin
if ((rxd >= 16'h5009 ) && (rxd <= 16'h500c)) begin
rx_1234 = rxd-16'h5008;
ptr_fd = ptr_fd + 3'd1;
end else ptr_fd = 3'd0;
end
3'd6: begin
if (((rxd & 16'hf000)==16'd0) && (rxd >= 16'd10)) begin //3072 = 0xc00 0xfff
length = rxd;
ptr_fd = ptr_fd + 3'd1;
end else ptr_fd = 3'd0;
end
3'd7:begin
if ((rxd & 16'hf800)==16'd0) begin
//len_con_a = 'd8;//rxd;
ptr_fd = 3'd0;
rx_df = `F_DATA;
ptr_d = 'd0;
end else ptr_fd = 3'd0;
end
default: begin
ptr_fd = 3'd0;
end
endcase
end else begin //rx_df == `F_DATA;
if (rx_1234==3'd1) begin
led1_t = 1;
if (ptr_d < 5 ) begin
d_attr[ptr_d] = rxd;
ptr_d = ptr_d + 1'd1;
end else begin
if (isDL) begin
f_width = 768;//d_attr[0]-14;
f_higth = 288;//d_attr[1]-8; //208= 520 实际 512
end else begin
f_width = 960;
f_higth = 512;//
end
len_con_a = 0;
rx_df = `F_SDE;
ptr_d = 0;
end
end else begin
if (ptr_d<'d1024) oneline[ptr_d] = rxd;
ptr_d = ptr_d +1'd1;
if (ptr_d < (f_width-1)) begin
if (ptr_d == f_width/2 ) led1_t = 1'b0;
if (ptr_d == f_width/2) INIT_AXI_TXN = 1'b0; // led1_t = 1'b0;
end else begin
ptr_d = 'd0; //注意 一定要清 0
rx_df = `F_SDE;
linebyte = len_con_a*2;
len_con_a = len_con_a + 1'd1; //
if (linebyte >= (f_higth)) begin //
linebyte = linebyte - (f_higth)+1;
end
linebyte = linebyte << C_MASTER_LENGTH;
linebyte = linebyte+d_pages;
//linebyte = linebyte+32'h10_0000;
linebytes = linebyte+C_M_TARGET_SLAVE_BASE_ADDR ;
//for (i=0;i<1024;i=i+1) oneline[i]=i;
//led1_t =1'd1;
INIT_AXI_TXN = 1'b1;
if( (len_con_a > ( f_higth-1) ) || ( rx_1234==4 ) ) begin
d_page = d_page+1'd1; //0,1,2,3
if (d_page == 'd6) begin
d_page = 'd0;
end
frame = d_page >> 1;
d_pages = d_page;
d_pages = d_pages << 20;
len_con_a = 0;
end
end
end
end
end
end
end
输出:
always@(negedge en_clk) //仿真用
begin
if ((rst_n==0))begin
//cols = 11'd0;
//row = 10'd0;
data = 8'd0;
hsvs = 0;
oe = 0;
end else begin
hsvs = ~hsvs;
if (cols <= 11'd283) begin
if (cols < 11'd3) begin
case (cols)
0:begin
data = 8'hff; //0
if (video) begin
if (row>=335) begin
row_n = (row - 335)+ 288;
end
else
row_n = (row-22) ;
end
end
1:begin
data = 8'h00; //1
if (video) begin
// 0 1 2 3 4 5 6 7 .... 284 285 286 287 288 289 290 291 .. .572 573 574 575
// 0_0 1_0 0_144 1_144 0_1 1_1 0_145 1_145 .... 0_143 1_143 0_287 1_287
// 0_0 1_0 0_1 1_1 0_2 1_2 0_3 1_3 ...
// row_n = row_n / 2; //0 0 1 1 2 2
rlinebyte = (row_n /2) ;
end
end
2:begin
data = 8'h00; //2
if (video) begin
//if (row_n[0] == 1) rlinebyte = rlinebyte+144;
rlinebyte = rlinebyte << C_MASTER_LENGTH;// 11; //*1024; //2^10, *2048:11
end
end
endcase
end else begin
case (cols)
3: begin
data = EAV(row); //3
if (video) begin
if (oe) rlinebyte = rlinebyte + 32'h10_0000;
//rlinebyte = rlinebyte + 'h10_0000;
if (frame==0) row_n = 2; //借用
else row_n = frame - 1;
end
end
4: begin
data = 8'h80;
if (video) begin
rlinebyte = rlinebyte + (32'h20_0000 * row_n);
end
end
5: begin
data = 8'h10;
if (video) begin
rlinebytes = rlinebyte+C_M_TARGET_SLAVE_BASE_ADDR;
INIT_AXI_TXN_R = 1'b1;
end
end
6: begin
data = 8'h80;
INIT_AXI_TXN_R = 1'b0;
end
default: begin
data = (cols[0] == 0) ? 8'h80 : 8'h10; //4~283
end
endcase
end
end else begin
if (cols < 11'd287) begin
case (cols)
284:begin
data = 8'hff; //284
end
285:begin
data = 8'h00; //285
end
286:begin
data = 8'h00; //286
end
endcase
end else begin
if (cols==11'd287) begin
data = SAV(row); //287
end else begin
//if ((row >= 22 && row <= 309) || (row >= 335 && row <= 622))
if (video)
data = colorValue(cols); //288~1727
else
data = (cols[0] == 0) ? 8'h80 : 8'h10; //288~1727
end
end
end
if (cols < 11'd1727) begin
cols = cols + 1'b1;
end
else begin
cols = 11'd0;
hsvs = 0;
if (row < 10'd624) begin
row = row + 1'b1;
oe = ~oe;
end else begin
row = 10'd0;
oe = 0;
end
if (((row >= 22 && row <= 309)) || ((row >= 335 && row <= 622))) begin
video = 1;
end else video = 0;
end
end
end
最后我见到视频出来了:
