视频数据的行列计数
本文的代码用于AXI-Stream总线上面传输的视频数据进行行列计数,判断总线上传输的视频数据的有效行和有效列。
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: chensimin // // Create Date: 2018/06/28 15:17:37 // Design Name: // Module Name: video_cnt // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module video_cnt( input wire clk, input wire rst_n, input wire tvalid, input wire tready, input wire tlast, input wire tuser, output wire [15:0]pixel_num, output wire [15:0]row_num ); //----------------------------------------------------------------- reg [15:0]pixel_num_r = 0; always @(posedge clk or negedge rst_n) begin if(!rst_n) pixel_num_r <= 0; else if(tlast) // 传完最后一个视频数据后,pixel 计数器清零 pixel_num_r <= 0; else if(tvalid && tready) // 当满足 tvalid 和 tready 同时为高时, pixel 计数器开始计数 pixel_num_r <= pixel_num_r + 1'b1; end assign pixel_num = pixel_num_r; //----------------------------------------------------------------- reg [15:0]row_num_r = 0; always @(posedge clk or negedge rst_n) begin if(!rst_n) row_num_r <= 0; else if(tuser) // 在一帧的开头, row 计数器进行清零 row_num_r <= 0; else if(tlast && tvalid && tready) row_num_r <= row_num_r + 1'b1; // 在每一行传送完成后,并且满足 tvalid 和 tready 信号同时为高时, 行计数器加一 end assign row_num = row_num_r; endmodule /* add_force {/video_cnt/clk} -radix hex {1 0ns} {0 50000ps} -repeat_every 100000ps add_force {/video_cnt/rst_n} -radix hex {0 0ns} {1 200ns} add_force {/video_cnt/tvalid} -radix hex {1 0ns} {0 800ns} {1 1200ns} add_force {/video_cnt/tready} -radix hex {1 0ns} {0 2000ns} {1 2100ns} {0 3700ns} {1 3800ns} add_force {/video_cnt/tlast} -radix hex {0 0ns} {1 700ns} {0 1000ns} {1 9500ns} {0 9900ns} add_force {/video_cnt/tuser} -radix hex {0 0ns} {1 900ns} {0 1300ns} {1 11000ns} {0 11100ns} */
仿真结果: