本篇主要是YUV422接口串行输入转换为内部并行YUV
按照下述的格式作为输入,转换为每个像素点都有自己的YCbCr(24位)。
外部按照上述格式输入(只输入422视频数据),假设输入为0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08。那么此时应该输出0x020103、0x040103、0x060507、0x080507四个像素点。
设计思路:缓存四个字节,作为一个循环;输入三个字节时,输出循环内的第一字节;输入第四个字节时,输出循环内的第二个字节;
设计代码如下:
module ycbcr422toycbcr444 (input wire clk,input wire rst_n,input wire [7:0] idata, // 串行输入 ycbcr422input wire ien,output reg [23:0] odata, // 并行输出output reg oen);reg [1:0] cnt;reg [31:0] idata_buf;always @ (posedge clk) beginif (rst_n == 1'b0)cnt <= 'd0;elseif (ien == 1'b1)cnt <= cnt + 1'b1;elsecnt <= 'd0;endalways @ (posedge clk) beginif (ien == 1'b1)idata_buf <= {idata_buf[23:0], idata};elseidata_buf <= idata_buf;endalways @ (posedge clk) beginif (cnt == 'd2)odata <= {idata_buf[7:0], idata_buf[15:8], idata};elseif (cnt == 'd3)odata <= {idata, idata_buf[23:16], idata_buf[7:0]};elseodata <= odata;endalways @ (posedge clk) beginif (rst_n == 1'b0)oen <= 1'b0;elseif (cnt == 'd2 || cnt == 'd3)oen <= 1'b1;elseoen <= 1'b0;endendmodule
编写testbench后,利用modelsim进行仿真,得出如下结果。
可以看出来,我们的设计是正确的。
YUV422还有其他的输入格式,可以根据其时序进行对应的调整;最终目的是将外部串行的YUV422格式,转换为内部并行的YUV(每个像素点输出一次,并行YUV);用以后续的图像处理或者存储。
想要了解更多信息,可以关注“郝旭帅电子设计团队”,想要获取源代码,可以联系作者。
本篇内容中有部分资源来源于网络,如有侵权,请联系作者。
阅读全文
132