⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tb_videocomposer_93.vhd

📁 &#65279 The purpose of this lab is to introduce the concept of FSMs with a datapath, and to stud
💻 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 + -