_n) begin
if(rst_n == 0)
cam_fifo_data_rd_en <= 0;
else if(rd_data_count >= LINE_LENGTH/2)//当cam_fifo里的数据大于400个的时候,就进行读取
cam_fifo_data_rd_en <= 1;
else if(rd_data_count <= 2) //当cam_fifo里的数据小于两个的时候,就暂停读取
cam_fifo_data_rd_en <= 0;
else
cam_fifo_data_rd_en <= cam_fifo_data_rd_en;
end
always @(posedge m_clk) cam_fifo_data_rd_en_r <= cam_fifo_data_rd_en; //延一拍,作为写入同步fifo的写信号
always@(posedge m_clk or negedge rst_n) begin
if(rst_n == 0)
m_axis_act <= 0;
else if(fifo_data_count0 >= LINE_LENGTH/2 - 1 ) //当同步fifo0的数据有400个的时候就使axi_stream接口活动
m_axis_act <= 1;
else if(fifo_data_count1 <= 1 )//当同步fifo1的数据小于1个的时候就使axi_stream接口暂停活动
m_axis_act <= 0;
else
m_axis_act <= m_axis_act;
end
always@(posedge m_clk) m_axis_tvalid <= m_axis_act;//延一拍作为tvalid信号与数据同步
always@(posedge m_clk or negedge rst_n) begin//每行数据的最后一个拉高tlast信号
if(rst_n == 0)
m_axis_tlast <= 0;
else if(out_data_count == LINE_LENGTH - 2 & m_axis_tvalid)
m_axis_tlast <= 1;
else
m_axis_tlast <= 0;
end
always@(posedge m_clk or negedge rst_n) begin//场计数器,为给出帧同步信号而设置的。
if(rst_n == 0)
line_cnt <= 0;
else if(line_cnt == LINE_NUM - 1 & out_data_count == LINE_LENGTH - 1)
line_cnt <= 0;
else if(out_data_count == LINE_LENGTH - 1)
line_cnt <= line_cnt + 1'b1;
else
line_cnt <= line_cnt;
end
always@(posedge m_clk or negedge rst_n) begin//输出计数器,为给出tlast,切换fifo,给出帧同步信号而设置的。
if(rst_n == 0)
out_data_count <= 0;
else if(out_data_count == LINE_LENGTH - 1)
out_data_count <= 0;
else if(m_axis_tvalid & m_axis_tready)
out_data_count <= out_data_count + 1'b1;
else
out_data_count <= out_data_count;
end
always@(posedge m_clk or negedge rst_n) begin
if(rst_n == 0)
line_end <= 0;
else if(line_cnt == LINE_NUM - 1 & out_data_count == LINE_LENGTH - 1)
line_end <= 1;
else
line_end <= 0;
end
assign m_axis_tuser = (out_data_count == 0 & m_axis_tvalid & m_axis_tready & line_cnt == 0)? 1:0; //每个帧的第一个数据拉高tuser,也就是帧同步信号
//-------------------------------------------图像灰度算法------------------------------------------------------
assign sum = {cam_fifo_data_out[15:11],3'b0} + {cam_fifo_data_out[10:5],2'b0} + {cam_fifo_data_out[4:0],3'b0};
always@(posedge m_clk or negedge rst_n)
begin
if(rst_n == 0)
gray_r <= 16'd0;
else if(cam_fifo_data_rd_en_r)
gray_r <= (sum << 6)+(sum << 4)+(sum << 2)+ sum;
else
gray_r <= 16'd0;
end
assign gray_8b_o = gray_r[15:8];
always@(posedge m_clk)
begin
gray_valid <= cam_fifo_data_rd_en_r;
end
//------------------------------------------同步fifo的数据切换--------------------------------------------------
always@(posedge m_clk or negedge rst_n)
begin
if(rst_n == 0)
fifo_flag <= 0;
else if(out_data_count >= LINE_LENGTH - 1)
fifo_flag <= 0;
else if(out_data_count >= LINE_LENGTH/2 - 1)
fifo_flag <= 1;
else
fifo_flag <= fifo_flag;
end
assign m_axis_tdata = (fifo_flag) ? fifo_data1 : fifo_data0;
//----------------------------------------------------------------------------------------------------------
fifo_generator_1 cam_data_fifo (
.rst(~rst_n), // input wire rst
.wr_clk(pclk), // input wire wr_clk
.rd_clk(m_clk), // input wire rd_clk
.din(cam_data), // input wire [15 : 0] din
.wr_en(data_valid), // input wire wr_ |