📄 tb_videocomposer_93.vhd
字号:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all; -- contains some conversion functions
USE IEEE.std_logic_arith.all;
USE Std.TextIO.ALL;
library DATAPATH_LIB; -- contains Datapath entities and
use DATAPATH_LIB.all; -- architectures
use DATAPATH_LIB.package_MicroAssemblyCode.all;
USE WORK.ALL;
ENTITY tb_videoComposer_93 IS
END tb_videoComposer_93;
ARCHITECTURE tb_behaviour OF tb_videoComposer_93 IS
CONSTANT read_from_file : BOOLEAN := FALSE;
COMPONENT videoComposer
GENERIC (
Size : INTEGER; -- # bits in word
ASize : INTEGER -- # bits in address
);
PORT (
Clk : IN STD_LOGIC;
Reset : IN STD_LOGIC;
DataIn : IN STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
DataInReady : IN STD_LOGIC;
DataInRead : OUT STD_LOGIC;
DataOut : OUT STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
DataOutReady : OUT STD_LOGIC;
DataOutRead : IN STD_LOGIC
);
END COMPONENT;
PROCEDURE ReadHeader(
FILE FileIn : Std.TextIO.Text;
FILE FileOut : Std.TextIO.Text
) IS
VARIABLE buf : STRING(1 DOWNTO 1); -- The read character i.e. one char of the string.
VARIABLE len : INTEGER; -- A "dummy" var. for getting the READ syntax right
VARIABLE char : CHARACTER; -- A temporary character
VARIABLE int : INTEGER RANGE 0 TO 255; -- The integer value of a the read ASCII character
VARIABLE lf_count : INTEGER := 0;
VARIABLE state : INTEGER := 0;
BEGIN
LOOP
READ(FileIn, buf, len); -- Read 1 character from the input file
WRITE(FileOut, buf); -- Write the character char to the output file
char := buf(1); -- Extraction of curr. read character
int := CHARACTER'POS(char);
CASE state IS
WHEN 0 => IF int = 50 THEN
state := 1;
ELSE
state := 0;
END IF;
WHEN 1 => IF int = 53 THEN
state := 2;
ELSIF int = 2 THEN
state := 1;
ELSE
state := 0;
END IF;
WHEN 2 => IF int = 53 THEN
state := 3;
ELSIF int = 2 THEN
state := 1;
ELSE
state := 0;
END IF;
WHEN 3 => IF int = 10 THEN
EXIT;
ELSIF int = 2 THEN
state := 1;
ELSE
state := 0;
END IF;
WHEN OTHERS => null;
END CASE;
END LOOP;
END ReadHeader;
PROCEDURE ReadData(
SIGNAL data_in : OUT STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
SIGNAL count : IN INTEGER
) IS
BEGIN
data_in <= RGBDataIn(count);
END ReadData;
PROCEDURE ReadData(
SIGNAL data_in : OUT STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
FILE FileIn : Std.TextIO.Text
) IS
VARIABLE buf : STRING(1 DOWNTO 1); -- The read character i.e. one char of the string.
VARIABLE len : INTEGER; -- A "dummy" var. for getting the READ syntax right
VARIABLE char : CHARACTER; -- A temporary character
VARIABLE int : INTEGER RANGE 0 TO 255; -- The integer value of a the read ASCII character
BEGIN
FOR i IN 3 DOWNTO 1 LOOP
READ(FileIn, buf, len); -- Read 1 character from the input file
char := buf(1); -- Extraction of curr. read character
int := CHARACTER'POS(char);
data_in(Size*i-1 DOWNTO Size*(i-1)) <= CONV_STD_LOGIC_VECTOR(int,8);
END LOOP;
END ReadData;
PROCEDURE WriteData(
SIGNAL data_out : IN STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
SIGNAL RGBDataOut : OUT RGBData_Type(RGBDataIn'RANGE);
SIGNAL count : INOUT INTEGER
) IS
BEGIN
RGBDataOut(count) <= data_out;
count <= count +1;
END WriteData;
PROCEDURE WriteData(
SIGNAL data_out : IN STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
FILE FileOut : Std.TextIO.Text
) IS
VARIABLE buf : STRING(1 DOWNTO 1); -- The read character, i.e., one char of the string.
VARIABLE char : CHARACTER; -- A temporary character
VARIABLE int : INTEGER RANGE 0 TO 255; -- The integer value of the read ASCII character
USE IEEE.std_logic_signed.all;
BEGIN
FOR i IN 3 DOWNTO 1 LOOP
int := CONV_INTEGER(UNSIGNED(data_out(Size*i-1 DOWNTO Size*(i-1))));
char := character'val(int);
buf(1) := char;
WRITE(FileOut, buf); -- Write the character char to the output file
END LOOP;
END WriteData;
FILE FileIn : Text OPEN Read_Mode IS "DATAIN.PPM";
FILE FileOut : Text OPEN Write_Mode IS "DATAOUT.PPM";
SIGNAL clk : STD_LOGIC := '0';
SIGNAL reset : STD_LOGIC := '1';
SIGNAL data_in : STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
SIGNAL data_in_ready : STD_LOGIC := '0';
SIGNAL data_in_read : STD_LOGIC;
SIGNAL data_out : STD_LOGIC_VECTOR(Size*3-1 DOWNTO 0);
SIGNAL data_out_ready : STD_LOGIC;
SIGNAL data_out_read : STD_LOGIC := '0';
SIGNAL rgb_data_out : RGBData_Type(RGBDataIn'RANGE);
SIGNAL count : INTEGER := 0;
SIGNAL clk_enable : STD_LOGIC := '1';
BEGIN
clk <= NOT(clk) AND clk_enable AFTER 10 ns;
PROCESS
BEGIN
clk_enable <= '1';
IF read_from_file THEN
ReadHeader(FileIn, FileOut);
WHILE NOT Endfile(FileIn) LOOP
ReadData(data_in, FileIn);
data_in_ready <= '1';
WAIT UNTIL data_in_read = '1';
data_out_read <= '0';
data_in_ready <= '0';
WAIT UNTIL data_out_ready = '1';
WriteData(data_out,FileOut);
data_out_read <= '1';
END LOOP;
FILE_CLOSE(FileOut);
clk_enable <= '0';
WAIT;
ELSE
FOR i IN RGBDataIn'RANGE LOOP
ReadData(data_in,count);
data_in_ready <= '1';
WAIT UNTIL data_in_read = '1';
data_out_read <= '0';
data_in_ready <= '0';
WAIT UNTIL data_out_ready = '1';
WriteData(data_out,rgb_data_out,count);
WAIT ON count;
data_out_read <= '1';
END LOOP;
clk_enable <= '0';
WAIT;
END IF;
END PROCESS;
U_videoComposer: videoComposer
GENERIC MAP(Size => Size,
ASize => ASize
)
PORT MAP(Clk => clk,
Reset => reset,
DataIn => data_in,
DataInReady => data_in_ready,
DataInRead => data_in_read,
DataOut => data_out,
DataOutReady => data_out_ready,
DataOutRead => data_out_read
);
END tb_behaviour;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -