• 正文
  • 相关推荐
申请入驻 产业图谱

YUV422接口串行输入转换为内部并行YUV

08/17 08:19
132
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

本篇主要是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,   // 串行输入 ycbcr422  input   wire                ien,
  output  reg       [23:0]    odata,   // 并行输出   output  reg                 oen);
  reg               [1:0]     cnt;  reg               [31:0]    idata_buf;
  always @ (posedge clk) begin    if (rst_n == 1'b0)      cnt <= 'd0;    else      if (ien == 1'b1)        cnt <= cnt + 1'b1;      else        cnt <= 'd0;  end
  always @ (posedge clk) begin    if (ien == 1'b1)      idata_buf <= {idata_buf[23:0], idata};    else      idata_buf <= idata_buf;  end
  always @ (posedge clk) begin    if (cnt == 'd2)      odata <= {idata_buf[7:0], idata_buf[15:8], idata};    else      if (cnt == 'd3)        odata <= {idata, idata_buf[23:16], idata_buf[7:0]};      else        odata <= odata;  end
  always @ (posedge clk) begin    if (rst_n == 1'b0)      oen <= 1'b0;    else      if (cnt == 'd2 || cnt == 'd3)        oen <= 1'b1;      else        oen <= 1'b0;  end
endmodule 

编写testbench后,利用modelsim进行仿真,得出如下结果。

可以看出来,我们的设计是正确的。

YUV422还有其他的输入格式,可以根据其时序进行对应的调整;最终目的是将外部串行的YUV422格式,转换为内部并行的YUV(每个像素点输出一次,并行YUV);用以后续的图像处理或者存储。

 

想要了解更多信息,可以关注“郝旭帅电子设计团队”,想要获取源代码,可以联系作者。

本篇内容中有部分资源来源于网络,如有侵权,请联系作者。

相关推荐