OpenCores
URL https://opencores.org/ocsvn/color_converter/color_converter/trunk

Subversion Repositories color_converter

[/] [color_converter/] [trunk/] [bench/] [vhdl/] [colorconv_tb.vhd] - Rev 3

Compare with Previous | Blame | View Log

-- ***** BEGIN LICENSE BLOCK *****
----------------------------------------------------------------------
----                                                              ----
----  Color Converter IP Core 					                  ----
----                                                              ----
---- This file is part of the matrix 3x3 multiplier project       ----
---- http://www.opencores.org/projects.cgi/web/color_converter/   ----
----                                                              ----
---- Description                                                  ----
---- True matrix 3x3 color converter							  ----
---- 		                                                      ----
---- To Do:                                                       ----
---- -                                                            ----
----                                                              ----
---- Author(s):                                                   ----
---- - Michael Tsvetkov, michland@opencores.org                   ----
---- - Vyacheslav Gulyaev, vv_gulyaev@opencores.org               ----	
----                                                              ----
----------------------------------------------------------------------
----                                                              ----
---- Copyright (C) 2006 Authors and OPENCORES.ORG                 ----
----                                                              ----
---- This source file may be used and distributed without         ----
---- restriction provided that this copyright statement is not    ----
---- removed from the file and that any derivative work contains  ----
---- the original copyright notice and the associated disclaimer. ----
----                                                              ----
---- This source file is free software; you can redistribute it   ----
---- and/or modify it under the terms of the GNU Lesser General   ----
---- Public License as published by the Free Software Foundation; ----
---- either version 2.1 of the License, or (at your option) any   ----
---- later version.                                               ----
----                                                              ----
---- This source is distributed in the hope that it will be       ----
---- useful, but WITHOUT ANY WARRANTY; without even the implied   ----
---- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ----
---- PURPOSE. See the GNU Lesser General Public License for more  ----
---- details.                                                     ----
----                                                              ----
---- You should have received a copy of the GNU Lesser General    ----
---- Public License along with this source; if not, download it   ----
---- from http://www.gnu.org/licenses/lgpl.txt or  write to the   ----
---- Free Software Foundation, Inc., 51 Franklin Street,          ----
---- Fifth Floor, Boston, MA  02110-1301  USA                     ----
----                                                              ----
----------------------------------------------------------------------
-- * ***** END LICENSE BLOCK ***** */
 
 
 
-----------------------------------------------------------------------
--
-- There is testbench for different color conversions by the mult3x3 component.
-- 
-- Input  stimulus are read from the "X.txt" file - pure ASCII coded data.
-- Output results are written to the "Y.txt" file - pure ASCII coded data.
-- See Matlab's m-file "read_image.m" in ./fv/ dir for generating input stimulus from
-- the real image. Also Matlab is used for formal verification: comparing mult3x3 results
-- with matlab's functions "rgb2ycbcr" and "ycbcr2rgb" for data_width = 8 bit and
-- conversions ComputerRGB_to_YCbCr601 and YCbCr601_to_ComputerRGB.
--
-- Simulator software - ModelSim 6.1.
--
-----------------------------------------------------------------------
 
LIBRARY ieee;
LIBRARY std_developerskit;
USE ieee.std_logic_1164.all;
USE std.textio.all;
USE IEEE.std_logic_arith.all;
USE std_developerskit.std_iopak.all;
use work.ccfactors_pkg.all;
entity tb is
end tb;
 
ARCHITECTURE a OF tb IS 
 
-- select matrix factors for predefined convertions. See ccfactors_pkg.
CONSTANT DATA_WIDTH		:	INTEGER :=8;
CONSTANT CONVERTION		:	COLOR_CONVERTION := ComputerRGB_to_YCbCr601;
 
SIGNAL FORMAT_STR		:	string(1 to 3) :="%2x";
 
-- for "onion.png" image from Matlab7 installation
CONSTANT IMAGE_WIDTH	:	INTEGER := 198;
CONSTANT ROW_NUMBER		:	INTEGER := 135;
CONSTANT CLOCK_PERIOD	:	TIME := 50 ns;
 
SIGNAL clk				:	STD_LOGIC;
SIGNAL rstn				:	STD_LOGIC;
 
SIGNAL x1,x2,x3			:	UNSIGNED(DATA_WIDTH-1 DOWNTO 0);
SIGNAL x1bv,x2bv,x3bv	:	BIT_VECTOR(DATA_WIDTH-1 DOWNTO 0);
 
SIGNAL y1,y2,y3			:	UNSIGNED(DATA_WIDTH-1 DOWNTO 0);
SIGNAL y1c,y2c,y3c		:	SIGNED(INT_FACTORS_PART-1 DOWNTO 0);
SIGNAL y1bv,y2bv,y3bv	:	BIT_VECTOR(DATA_WIDTH-1 DOWNTO 0);
 
SIGNAL DATA_ENA			:	STD_LOGIC;
SIGNAL DOUT_RDY			:	STD_LOGIC;
 
 
BEGIN
 
---------- READ_DATA FROM FILE PROCESS --------------------------
READ_DATA: PROCESS(CLK, RSTN)
	FILE file_in			:	ASCII_TEXT IS  "X.txt";
	VARIABLE digits_str1	:	string(1 to (DATA_WIDTH/4)+1);
	VARIABLE digits_str2	:	string(1 to (DATA_WIDTH/4)+1);
	VARIABLE digits_str3	:	string(1 to (DATA_WIDTH/4)+1);
BEGIN
 
	if RSTN = '0' THEN
		DATA_ENA <= '0';
	elsif rising_edge(clk) then
 
		if NOT endfile(file_in) THEN
 
			fscan (file_in, "%x %x %x", digits_str1, digits_str2, digits_str3);
 
			if digits_str1(1) /= NUL then
				x1bv <= From_HexString (digits_str1);
				x2bv <= From_HexString (digits_str2);
				x3bv <= From_HexString (digits_str3);
			end if;
 
			DATA_ENA <= '1';
 
		ELSE
			DATA_ENA <= '0';
		END IF;
END IF;
 
END PROCESS READ_DATA;
 
 
---------- WRITE_RESULT TO FILE PROCESS --------------------------
o2: IF DATA_WIDTH/4 = 2 GENERATE
    FORMAT_STR <= "%2x";
END GENERATE o2;
 
o3: IF DATA_WIDTH/4 = 3 GENERATE
    FORMAT_STR <= "%3x";
END GENERATE o3;
 
o4: IF DATA_WIDTH/4 = 4 GENERATE
    FORMAT_STR <= "%4x";
END GENERATE o4;
 
WRITE_RESULT: PROCESS(CLK, RSTN)
	FILE file_out			:	ASCII_TEXT IS OUT "Y.txt";
	VARIABLE digit_out1		:	string(1 to (DATA_WIDTH/4)):=(others=>'0');
	VARIABLE digit_out2		:	string(1 to (DATA_WIDTH/4)):=(others=>'0');
	VARIABLE digit_out3		:	string(1 to (DATA_WIDTH/4)):=(others=>'0');
	VARIABLE i,k			:	INTEGER;
BEGIN
 
	if RSTN = '0' THEN
		i := 0;k:=1;
		elsif rising_edge(clk) then
			if DOUT_RDY = '1' then
				if k<=ROW_NUMBER then
					i:=i+1;
 
					digit_out1 :=To_string(y1bv,FORMAT_STR);
					digit_out2 :=To_string(y2bv,FORMAT_STR);
					digit_out3 :=To_string(y3bv,FORMAT_STR);
 
					fprint(file_out,"%s %s %s ", digit_out1, digit_out2, digit_out3);
 
			end if;
 
			if i = IMAGE_WIDTH then
				i := 0; k:=k+1;
				fprint(file_out,"\n");
			end if;
		end if;
	end if;
END PROCESS WRITE_RESULT;
 
 
x1 <= UNSIGNED(TO_STDLOGICVECTOR(x1bv));
x2 <= UNSIGNED(TO_STDLOGICVECTOR(x2bv));
x3 <= UNSIGNED(TO_STDLOGICVECTOR(x3bv));
 
y1bv<=To_Bitvector(STD_LOGIC_VECTOR(y1));
y2bv<=To_Bitvector(STD_LOGIC_VECTOR(y2));
y3bv<=To_Bitvector(STD_LOGIC_VECTOR(y3));
 
--------------------------------------------------------------------
-- instantiate the mult3x3_fullcomponent
--------------------------------------------------------------------
 
gen1:IF  CONVERTION = ComputerRGB_to_YCbCr601 GENERATE
 
	cconv : entity work.colorconv(a)
	GENERIC MAP( DATA_WIDTH)
	PORT MAP(
		clk	 => clk,
		rstn	 => rstn,
		data_ena => DATA_ENA,
		dout_rdy => DOUT_RDY,
		x1  => x1,
		x2  => x2,
		x3  => x3,
		a11 => crgb2ycbcr601_a11,
		a12 => crgb2ycbcr601_a12,
		a13 => crgb2ycbcr601_a13,
		a21 => crgb2ycbcr601_a21,
		a22 => crgb2ycbcr601_a22,
		a23 => crgb2ycbcr601_a23,
		a31 => crgb2ycbcr601_a31,
		a32 => crgb2ycbcr601_a32,
		a33 => crgb2ycbcr601_a33,
		b1x => crgb2ycbcr601_b1x,
		b2x => crgb2ycbcr601_b2x,
		b3x => crgb2ycbcr601_b3x,
		b1y => crgb2ycbcr601_b1y,
		b2y => crgb2ycbcr601_b2y,
		b3y => crgb2ycbcr601_b3y,
		y1c => y1c,
		y2c => y2c,
		y3c => y3c,
		y1  => y1,
		y2  => y2,
		y3  => y3
	);
END GENERATE gen1;
 
gen2:IF CONVERTION = YCbCr601_to_ComputerRGB GENERATE
 
	cconv : entity work.colorconv(a)
	GENERIC MAP( DATA_WIDTH )
	PORT MAP(
		clk	 => clk,
		rstn	 => rstn,
		data_ena => DATA_ENA,
		dout_rdy => DOUT_RDY,        
		x1  => x1,
		x2  => x2,
		x3  => x3,
		a11 => ycbcr601_crgb_a11,
		a12 => ycbcr601_crgb_a12,
		a13 => ycbcr601_crgb_a13,
		a21 => ycbcr601_crgb_a21,
		a22 => ycbcr601_crgb_a22,
		a23 => ycbcr601_crgb_a23,
		a31 => ycbcr601_crgb_a31,
		a32 => ycbcr601_crgb_a32,
		a33 => ycbcr601_crgb_a33,
		b1x => ycbcr601_crgb_b1x,
		b2x => ycbcr601_crgb_b2x,
		b3x => ycbcr601_crgb_b3x,
		b1y => ycbcr601_crgb_b1y,
		b2y => ycbcr601_crgb_b2y, 
		b3y => ycbcr601_crgb_b3y,
		y1c => y1c,
		y2c => y2c,
		y3c => y3c,
		y1  => y1,
		y2  => y2,
		y3  => y3
	);
 
END GENERATE gen2;
--------------------------------------------------------------------
-- clock and reset stuff
--------------------------------------------------------------------
CLOCK : PROCESS
BEGIN
	clk  <= '1'  ;
	wait for CLOCK_PERIOD/2;
	clk  <= '0'  ;
	wait for CLOCK_PERIOD/2 ;     
END PROCESS CLOCK;
 
RESET : PROCESS
BEGIN
	rstn<='0';
	wait for 10*CLOCK_PERIOD;
	rstn<='1';
	wait;
END PROCESS RESET;
 
END a;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.