1 YUV2RGB的模块如下:

 module yuv2rgb(
clk, //时钟输入
rstn, //复位输入,低电平复位 y_in, //变换前Y分量输出
cb_in, //变换前Cb分量输出
cr_in, //变换前Cr分量输出
ena_in, //待变换数据使能,当它为高时,输入数据有效 R_out, //变换后R分量输出
G_out, //变换后G分量输出
B_out, //变换后B分量输出
ena_out //变换后数据使能输出
);

测试模块功能的方法:

step1 用MATLAB读入一张RGB图片,将RGB转成YUV数据保存在txt文件中;

step2 用该模块把YUV数据转换成RGB数据并保存;

step3 用MATLAB读取模块转换的RGB数据做显示。

接下来详细说明step1~3的实现过程。

2 step1 用MATLAB读入一张RGB图片,将RGB转成YUV数据保存在txt文件中;

clc;close all;clear 
RGBimg =imread('Penguins_720p.jpg'); %%用画图软件重新调整像素大小得到的720p图片
figure;imshow(RGBimg);
YUVimg = rgb2ycbcr(RGBimg); %%matlab中的转换函数
figure;imshow(YUVimg); [Hs Vs Dim] = size(YUVimg);
yuvimout = zeros(,Hs*Vs*Dim);
yuvimout(::Hs*Vs*Dim) = reshape(YUVimg(:,:,)',1,Hs*Vs); %%Y
yuvimout(::Hs*Vs*Dim) = reshape(YUVimg(:,:,)',1,Hs*Vs); %%U
yuvimout(::Hs*Vs*Dim) = reshape(YUVimg(:,:,)',1,Hs*Vs); %%V
fid= fopen('Penguins_720p.txt','w'); %%YUV数据写入到txt
fprintf(fid,'%02x\n',yuvimout); %%2位十六进制格式
fclose(fid); fid= fopen('Penguins_720p.yuv','rb'); %%用“7yuv”专业软件转换得到的yuv数据
yuvdat = fread(fid,'uint8');
yuvdat = yuvdat';
fclose(fid);
subAB = yuvdat-yuvimout; %%比较下matlab转换的yuv数据
figure;stem(find(subAB~=));

3 step2 用该模块把YUV数据转换成RGB数据并保存;

testbench的代码如下:

`timescale 1ns / 1ps

module tb_yuv2rgb;
// Inputs
reg clk;
reg rstn; //复位输入,低电平复位
reg [:] y_in;
reg [:] cb_in;
reg [:] cr_in;
reg ena_in;
// Outputs
wire [:] R_out;
wire [:] G_out;
wire [:] B_out;
wire ena_out;
// Instantiate the Unit Under Test (UUT)
yuv2rgb uut (
.clk(clk),
.rstn(rstn),
.y_in(y_in),
.cb_in(cb_in),
.cr_in(cr_in),
.ena_in(ena_in),
.R_out(R_out),
.G_out(G_out),
.B_out(B_out),
.ena_out(ena_out)
); localparam PIXNUM_1080P =(**);
localparam PIXNUM_720P =(**); //read pixel from .txt file
reg[:] mem_imgpixel[:**];
reg [:] pixaddr;
integer fid,i;
initial begin //读取图片的YUV数据
$readmemh("Penguins_720p.txt",mem_imgpixel);
pixaddr = ;
#PIXNUM_1080P begin //等待图片的数据转换完成
fid = $fopen("Penguins_720pRGBout.txt","w");
for(i=; i<PIXNUM_720P; i=i+)
$fdisplay(fid,"%2x",mem_rgbout[i]);//输出转换的RGB数据
$fclose(fid);
$stop;
end
end
//clk的上升沿给输入的yuv数据
always @(posedge clk or negedge rstn) begin
if(!rstn) begin
y_in <= 'b0;
cb_in <= 'b0;
cr_in <= 'b0;
ena_in <= 'b0;
pixaddr<= ;
end
else begin
y_in <= mem_imgpixel[pixaddr];
cb_in <= mem_imgpixel[pixaddr+];
cr_in <= mem_imgpixel[pixaddr+];
ena_in <= 'b1;
pixaddr<= pixaddr + ;
end
end reg[:] outaddr;
reg[:] mem_rgbout[:**];//clk的下降沿读取转换的rgb数据
always @(negedge clk or negedge rstn) begin
if(!rstn) begin
outaddr <= ;
end
else begin //存入对应下标
mem_rgbout[outaddr] <= R_out;
mem_rgbout[outaddr+] <= G_out;
mem_rgbout[outaddr+] <= B_out;
outaddr <= outaddr + ; //下标增加3
end
end initial begin
// Initialize Inputs
clk = ;
rstn = ;
y_in = ;
cb_in = ;
cr_in = ;
ena_in = ;
#;
rstn = ;
// Wait 100 ns for global reset to finish
#;
rstn = ;
// Add stimulus here
end
always # clk =~clk;
endmodule

4 step3 用MATLAB读取模块转换的RGB数据做显示。

clc;close all;clear 

filename = 'Penguins_720pRGBout.txt';
fid = fopen(filename,'r');
rgbdat = fscanf(fid,'%x');
rgbdat = uint8(rgbdat'); %%转换为uint8
fclose(fid); imglen = ; imgwidth = ;
len = length(rgbdat);
r = rgbdat(::len);
r = reshape(r,imglen,imgwidth);
r = r'; g = rgbdat(::len);
g = reshape(g,imglen,imgwidth);
g = g'; b = rgbdat(::len);
b = reshape(b,imglen,imgwidth);
b = b'; rgbimg = cat(,r,g,b);
imshow(rgbimg);

step3中rgb数据正确时显示的图片

Verilog笔记——YUV2RGB的模块测试的更多相关文章

  1. Verilog笔记——Verilog数字系统设计(第二版)夏宇闻

    本片记录Verilog学习笔记,主要是和以往用的C语言的不同之处,以例子.代码的形式记录.学习以<Verilog数字系统设计>(第二版)为参考资料,援助作者夏宇闻. 1. C语言和Veri ...

  2. Verilog笔记.1.基本语法

    0.前 抽象模型分级: • 系统级(system):用高级语言结构实现设计模块的外部性能的模型.• 算法级(algorithm):用高级语言结构实现设计算法的模型.• RTL级(Register Tr ...

  3. Verilog笔记.三段式状态机

    之前都是用的一段式状态机,逻辑与输出混在一起,复杂点的就比较吃力了. 所以就开始着手三段式状态机. 组合逻辑与时序逻辑分开,这样就能简单许多了. 但是两者在思考方式上也有着很大的区别. 三段式,分作: ...

  4. Verilog笔记.6.FIFO

    FIFO,First In First Out ,是一种先进先出的数据缓存器. 没有外部读写地址线,只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成. 不能像普通存储器那样可以 ...

  5. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...

  6. Verilog笔记.4.inout端口

    inout是一个双向端口,实现为使用三态门,第三态为高阻态‘z’. 在实际电路中高阻态意味着响应的管脚悬空.断开. 当三态门的控制信号为真时,三态门选通,作输出端口使用:控制信号为假时,三态门是高阻态 ...

  7. Verilog笔记.3.有限状态机

    有限状态机有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是 ...

  8. Verilog笔记.2.数字逻辑电路

    1.数字逻辑电路的种类:1) 组合逻辑:输出只是当前输入逻辑电平的函数(有延时),与电路的原始状态无关的逻辑电路.也就是说,当输入信号中的任何一个发生变化时,输出都有可能会根据其变化而变化,但与电路目 ...

  9. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

随机推荐

  1. 如何利用excel中的数据源制作数据地图

    关于这个问题,制作数据地图的方法已不新奇,总体来说有这么几类方案: 一类方案:直接在excel里制作 优势:个人小数据量应用较为方便简单 缺点:需要熟悉VBA,且更强大的功能对VBA水平要求较高 1. ...

  2. Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...

  3. mysql简单复制服务搭建

    .安装mysql源(centos7中默认是不包含mysql源) wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm ...

  4. 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例

    基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...

  5. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  6. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  7. Map接口使用注意事项

    1,Map接口对象本身不能直接使用迭代进行输出的.因为map每个位置存放的是一对值. 而iterator每次只能找到一个值.如果一定要迭代输出,可以通过以下步骤.: 但是,Map接口只作为查找使用,输 ...

  8. git没有changId解决方法

    1.git branch work(从最新节点建立分支,相当于将自己的修改备份到新的分支) 2.git reset --hard HEAD~10(强制回滚多个节点) 3.git status 如果显示 ...

  9. typescript实现react中的批次式更新

    欢迎吐槽讨论 前言 笔者在React经常使用setState,在学习过程中作笔记以作总结,欢迎讨论. 关于setState的核心观点 1 . 执行setState不都是异步的. 2 . setStat ...

  10. echarts在.Net中使用实例(一) 简单的Demo

    前言 这个必须要有前言,即便很短,对于有强迫症的人来说不容易啊.言归正传,之前做图一直使用rdlc自带的格式,虽然任务完成,但是一直觉得不太美观, 空余时间开始找其他的插件,终于找到了Highchar ...