Verilog筆記——YUV2RGB的模塊測試

来源:http://www.cnblogs.com/hythink/archive/2016/02/28/5224569.html
-Advertisement-
Play Games

1 YUV2RGB的模塊如下: 1 module yuv2rgb( 2 clk, //時鐘輸入 3 rstn, //複位輸入,低電平複位 4 5 y_in, //變換前Y分量輸出 6 cb_in, //變換前Cb分量輸出 7 cr_in, //變換前Cr分量輸出 8 ena_in, //待變換數據使


1 YUV2RGB的模塊如下:

 1 module yuv2rgb(
 2     clk,        //時鐘輸入
 3     rstn,       //複位輸入,低電平複位
 4     
 5     y_in,       //變換前Y分量輸出
 6     cb_in,      //變換前Cb分量輸出
 7     cr_in,        //變換前Cr分量輸出
 8     ena_in,        //待變換數據使能,當它為高時,輸入數據有效
 9         
10     R_out,        //變換後R分量輸出
11     G_out,        //變換後G分量輸出
12     B_out,        //變換後B分量輸出
13     ena_out        //變換後數據使能輸出
14     );

    測試模塊功能的方法:

         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(1,Hs*Vs*Dim); yuvimout(1:3:Hs*Vs*Dim) = reshape(YUVimg(:,:,1)',1,Hs*Vs); %%Y yuvimout(2:3:Hs*Vs*Dim) = reshape(YUVimg(:,:,2)',1,Hs*Vs); %%U yuvimout(3:3:Hs*Vs*Dim) = reshape(YUVimg(:,:,3)',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~=0));

3 step2 用該模塊把YUV數據轉換成RGB數據並保存;

testbench的代碼如下:

`timescale 1ns / 1ps

module tb_yuv2rgb;
    // Inputs
    reg clk;
    reg rstn; //複位輸入,低電平複位
    reg [7:0] y_in;
    reg [7:0] cb_in;
    reg [7:0] cr_in;
    reg ena_in;
    // Outputs
    wire [7:0] R_out;
    wire [7:0] G_out;
    wire [7:0] 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 =(1920*1080*3);
localparam    PIXNUM_720P  =(1280*720*3);

    //read pixel from .txt file
    reg[7:0] mem_imgpixel[0:2**24];
    reg [31:0]  pixaddr;
    integer fid,i;
    initial begin  //讀取圖片的YUV數據
        $readmemh("Penguins_720p.txt",mem_imgpixel);
        pixaddr = 0;
        #PIXNUM_1080P begin //等待圖片的數據轉換完成
            fid =  $fopen("Penguins_720pRGBout.txt","w");    
            for(i=0; i<PIXNUM_720P; i=i+1)
                $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   <=  8'b0;
            cb_in  <=  8'b0;
            cr_in  <=  8'b0;
            ena_in <=  1'b0;
            pixaddr<=  0;
        end
        else begin
            y_in   <= mem_imgpixel[pixaddr];
            cb_in  <= mem_imgpixel[pixaddr+1];
            cr_in  <= mem_imgpixel[pixaddr+2];
            ena_in <= 1'b1;
            pixaddr<= pixaddr + 3;
        end
    end
    
    reg[31:0] outaddr;
    reg[7:0] mem_rgbout[0:2**24];//clk的下降沿讀取轉換的rgb數據
    always @(negedge clk or negedge rstn) begin
        if(!rstn) begin
            outaddr <= 0;
        end    
        else begin //存入對應下標
            mem_rgbout[outaddr]   <= R_out;
            mem_rgbout[outaddr+1] <= G_out;
            mem_rgbout[outaddr+2] <= B_out;
            outaddr <= outaddr + 3; //下標增加3
        end
    end
    
    initial begin
        // Initialize Inputs
        clk = 0;
        rstn = 1;
        y_in = 0;
        cb_in = 0;
        cr_in = 0;
        ena_in = 0;
        #2;
        rstn = 0;
        // Wait 100 ns for global reset to finish
        #100;
        rstn = 1;
        // Add stimulus here
    end
    always #2 clk =~clk;
endmodule
View Code

 

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 = 1280; imgwidth = 720;
len = length(rgbdat);
r = rgbdat(1:3:len);
r = reshape(r,imglen,imgwidth);
r = r';

g = rgbdat(2:3:len);
g = reshape(g,imglen,imgwidth);
g = g';

b = rgbdat(3:3:len);
b = reshape(b,imglen,imgwidth);
b = b';

rgbimg = cat(3,r,g,b);
imshow(rgbimg);

step3中rgb數據正確時顯示的圖片

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內容轉自 http://blog.csdn.net/pasic/article/details/7110134 Asp.net MVC中Controller返回值類型在mvc中所有的controller類都必須使用"Controller"尾碼來命名並且對Action也有一定的要求: 必須是一個pub
  • 對junit單元測試的報告:類似這樣的結果 ------------------------------------------------------- T E S T S ------------------------------------------------------- Runnin
  • 玩轉Windows服務系列彙總 [創建Windows服務][1] [Debug、Release版本的註冊和卸載及其原理][2] [無COM介面Windows服務啟動失敗原因及解決方案][3] [服務運行、停止流程淺析][4] [Windows服務小技巧][5] [命令行管理Windows服務][6]
  • Hadoop、Redis、Memcached、MongoDB、Spark、Storm、雲計算、R語言、機器學習、Nginx、Linux、MySQL、Java EE、.NET、PHP Memcached 視頻教程 大數據 高性能 集群 NoSQL 安裝 命令 使用
  • Hadoop、Redis、Memcached、MongoDB、Spark、Storm、雲計算、R語言、機器學習、Nginx、Linux、MySQL、Java EE、.NET、PHP MongoDB 權威 實戰 入門應用 視頻教程 大數據 高性能 集群 NoSQL
  • Hadoop、Redis、Memcached、MongoDB、Spark、Storm、雲計算、R語言、機器學習、Nginx、Linux、MySQL、Java EE、.NET、PHP R語言 視頻教程 實戰 數據分析 數據挖掘 入門編程 培訓 核心技術
  • 1.什麼叫做會話控制 允許伺服器根據客戶端做出的連續請求。 2.為什麼需要會話控制? 因為當你打開一個網站,並想訪問該網站的其他頁面的時候,如果沒有會話控制,當跳轉到其他頁面的 時候,就需要再次輸入賬戶和密碼。 3.Cookie的原理和作用 將客戶端的簡單信息保存在個人PC中,其他程式獲取PC的Co
  • java同步容器 在Java的集合容器框架中,主要有四大類別:List、Set、Queue、Map。List、Set、Queue介面分別繼承了Collection介面,Map本身是一個介面。註意Collection和Map是一個頂層介面,而List、Set、Queue則繼承了Collection介面
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...