add testbench
This commit is contained in:
		
							parent
							
								
									e45c7180cf
								
							
						
					
					
						commit
						6a2d616d8a
					
				
							
								
								
									
										208
									
								
								dvi_tb.vhd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								dvi_tb.vhd
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,208 @@
 | 
			
		||||
library ieee;
 | 
			
		||||
use ieee.std_logic_1164.all;
 | 
			
		||||
use ieee.numeric_std.all;
 | 
			
		||||
use work.dvi_package.all;
 | 
			
		||||
 | 
			
		||||
library UNISIM;
 | 
			
		||||
use UNISIM.Vcomponents.all;
 | 
			
		||||
 | 
			
		||||
ENTITY dvi_tb IS
 | 
			
		||||
END dvi_tb;
 | 
			
		||||
 | 
			
		||||
ARCHITECTURE rtl OF dvi_tb IS
 | 
			
		||||
	constant CLK_PERIOD  : time :=  20.0 ns;
 | 
			
		||||
	constant CLK1_PERIOD : time :=  10.0 ns;
 | 
			
		||||
	constant CLK2_PERIOD : time :=   2.0 ns;
 | 
			
		||||
	signal clk          : std_logic;
 | 
			
		||||
	signal clk1         : std_logic;
 | 
			
		||||
	signal clk2         : std_logic;
 | 
			
		||||
	signal rst          : std_logic;
 | 
			
		||||
	signal rst_n        : std_logic;
 | 
			
		||||
 | 
			
		||||
	signal en_stb_i     : std_logic;
 | 
			
		||||
	signal hsync_o      : std_logic;
 | 
			
		||||
	signal vsync_o      : std_logic;
 | 
			
		||||
	signal color_en_o   : std_logic;
 | 
			
		||||
	signal color_o      : color_t(COLOR_CNT-1 downto 0);
 | 
			
		||||
 | 
			
		||||
	signal en_stb_iq    : std_logic;
 | 
			
		||||
	signal hsync_oq     : std_logic;
 | 
			
		||||
	signal vsync_oq     : std_logic;
 | 
			
		||||
	signal color_en_oq  : std_logic;
 | 
			
		||||
	signal color_oq     : color_t(COLOR_CNT-1 downto 0);
 | 
			
		||||
 | 
			
		||||
	-- dvi encoder
 | 
			
		||||
	signal pclk                     : std_logic;
 | 
			
		||||
	signal pclk_buf                 : std_logic;
 | 
			
		||||
	signal tx_pclkx2                : std_logic;
 | 
			
		||||
	signal tx_pclkx10               : std_logic;
 | 
			
		||||
	signal tx_reset_n               : std_logic;
 | 
			
		||||
	signal tx_serdesstrobe          : std_logic;
 | 
			
		||||
	signal tx_clkfbout              : std_logic;
 | 
			
		||||
	signal tx_clkfbin               : std_logic;
 | 
			
		||||
	signal tx_plllckd               : std_logic;
 | 
			
		||||
	signal tx_pllclk0               : std_logic;
 | 
			
		||||
	signal tx_pllclk2               : std_logic;
 | 
			
		||||
	signal tx_bufpll_lock           : std_logic;
 | 
			
		||||
	signal tx_tmds                  : std_logic_vector(3 downto 0);
 | 
			
		||||
	signal tx_tmds_n                : std_logic_vector(3 downto 0);
 | 
			
		||||
 | 
			
		||||
	-- dvi decoder
 | 
			
		||||
	signal rx_pll_lckd              : std_logic;
 | 
			
		||||
	signal rx_rst_n                 : std_logic;
 | 
			
		||||
	signal rx_pclk                  : std_logic;
 | 
			
		||||
	signal rx_hsync                 : std_logic;
 | 
			
		||||
	signal rx_vsync                 : std_logic;
 | 
			
		||||
	signal rx_color                 : color_t(COLOR_CNT-1 downto 0);
 | 
			
		||||
	signal rx_color_en              : std_logic;
 | 
			
		||||
BEGIN
 | 
			
		||||
	rst   <= transport '1', '0' after (4 * CLK_PERIOD);
 | 
			
		||||
	rst_n <= not rst;
 | 
			
		||||
 | 
			
		||||
	clock: process
 | 
			
		||||
	begin
 | 
			
		||||
		clk <= '1', '0' after CLK_PERIOD/2;
 | 
			
		||||
		wait for CLK_PERIOD;
 | 
			
		||||
	end process;
 | 
			
		||||
	clock1: process
 | 
			
		||||
	begin
 | 
			
		||||
		clk1 <= '1', '0' after CLK1_PERIOD/2;
 | 
			
		||||
		wait for CLK1_PERIOD;
 | 
			
		||||
	end process;
 | 
			
		||||
	clock2: process
 | 
			
		||||
	begin
 | 
			
		||||
		clk2 <= '1', '0' after CLK2_PERIOD/2;
 | 
			
		||||
		wait for CLK2_PERIOD;
 | 
			
		||||
	end process;
 | 
			
		||||
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- DVI ENCODER
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- Instantiate a dedicate PLL for output port
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	tx_plllckd <= rst_n;
 | 
			
		||||
	tx_pllclk0 <= clk2;
 | 
			
		||||
	pclk_buf   <= clk;
 | 
			
		||||
	tx_pllclk2 <= clk1;
 | 
			
		||||
 | 
			
		||||
	pclk_buf_0: BUFG port map(I => pclk_buf, O => pclk);
 | 
			
		||||
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- This BUFG is needed in order to deskew between PLL clkin and clkout
 | 
			
		||||
	-- So the tx0 pclkx2 and pclkx10 will have the same phase as the pclk input
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	tx_clkfb_buf: BUFG port map(I => tx_clkfbout, O => tx_clkfbin);
 | 
			
		||||
 | 
			
		||||
	-- --------------------------------
 | 
			
		||||
	-- regenerate pclkx2 for TX
 | 
			
		||||
	-- --------------------------------
 | 
			
		||||
	tx_pclkx2_buf: BUFG port map(I => tx_pllclk2, O => tx_pclkx2);
 | 
			
		||||
 | 
			
		||||
	-- --------------------------------
 | 
			
		||||
	-- regenerate pclkx10 for TX
 | 
			
		||||
	-- --------------------------------
 | 
			
		||||
	tx_ioclk_buf: BUFPLL
 | 
			
		||||
	generic map ( DIVIDE => 5 )
 | 
			
		||||
	port map (
 | 
			
		||||
		PLLIN        => tx_pllclk0,
 | 
			
		||||
		GCLK         => tx_pclkx2,
 | 
			
		||||
		LOCKED       => tx_plllckd,
 | 
			
		||||
		IOCLK        => tx_pclkx10,
 | 
			
		||||
		SERDESSTROBE => tx_serdesstrobe,
 | 
			
		||||
		LOCK         => tx_bufpll_lock
 | 
			
		||||
	);
 | 
			
		||||
	tx_reset_n <= tx_bufpll_lock;
 | 
			
		||||
 | 
			
		||||
	dvi_encoder_0: entity work.dvi_encoder
 | 
			
		||||
	port map (
 | 
			
		||||
		rst_n          => tx_reset_n,
 | 
			
		||||
		pclk           => pclk,
 | 
			
		||||
		pclkx2         => tx_pclkx2,
 | 
			
		||||
		pclkx10        => tx_pclkx10,
 | 
			
		||||
		serdesstrobe_i => tx_serdesstrobe,
 | 
			
		||||
		color_i        => color_o,
 | 
			
		||||
		hsync_i        => hsync_o,
 | 
			
		||||
		vsync_i        => vsync_o,
 | 
			
		||||
		dat_en_i       => color_en_o,
 | 
			
		||||
		tmds_p         => tx_tmds,
 | 
			
		||||
		tmds_n         => tx_tmds_n
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	reg: process begin
 | 
			
		||||
	wait until rising_edge(clk);
 | 
			
		||||
		en_stb_iq   <= en_stb_i;
 | 
			
		||||
		hsync_o     <= hsync_oq;
 | 
			
		||||
		vsync_o     <= vsync_oq;
 | 
			
		||||
		color_o     <= color_oq;
 | 
			
		||||
		color_en_o  <= color_en_oq;
 | 
			
		||||
	end process;
 | 
			
		||||
 | 
			
		||||
	dut: entity work.sig
 | 
			
		||||
	generic map (
 | 
			
		||||
		H_ACTIVE_PIXEL => x"500",
 | 
			
		||||
		H_BLANKING     => x"198",
 | 
			
		||||
		H_SYNC_WIDTH   => x"070",
 | 
			
		||||
		H_SYNC_OFFSET  => x"030",
 | 
			
		||||
		V_ACTIVE_LINES => x"400",
 | 
			
		||||
		V_BLANKING     => x"02a",
 | 
			
		||||
		V_SYNC_WIDTH   => x"01",
 | 
			
		||||
		V_SYNC_OFFSET  => x"03"
 | 
			
		||||
	)
 | 
			
		||||
	port map (
 | 
			
		||||
		clk        => clk,
 | 
			
		||||
		rst_n      => rst_n,
 | 
			
		||||
		en_stb_i   => en_stb_iq,
 | 
			
		||||
		hsync_o    => hsync_oq,
 | 
			
		||||
		vsync_o    => vsync_oq,
 | 
			
		||||
		color_en_o => color_en_oq,
 | 
			
		||||
		color_o    => color_oq
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	beh: process begin
 | 
			
		||||
		en_stb_i <= '0';
 | 
			
		||||
		wait for 250000 ns;
 | 
			
		||||
		en_stb_i <= '1';
 | 
			
		||||
		wait;
 | 
			
		||||
	end process;
 | 
			
		||||
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- DVI DECODER
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	-- ----------------------------------------------------------------------------
 | 
			
		||||
	dvi_decoder_0: entity work.dvi_decoder
 | 
			
		||||
	port map (
 | 
			
		||||
		ext_rst        => rst,
 | 
			
		||||
 | 
			
		||||
		tmdsclk_p      => tx_tmds(3),
 | 
			
		||||
		tmdsclk_n      => tx_tmds_n(3),
 | 
			
		||||
		din_p          => tx_tmds(2 downto 0),
 | 
			
		||||
		din_n          => tx_tmds_n(2 downto 0),
 | 
			
		||||
 | 
			
		||||
		reset_n        => rx_rst_n,    -- rx reset
 | 
			
		||||
		pclk_o         => rx_pclk,     -- regenerated pixel clock
 | 
			
		||||
		pclkx2_o       => open,        -- double rate pixel clock
 | 
			
		||||
		pclkx10_o      => open,        -- 10x pixel as IOCLK
 | 
			
		||||
 | 
			
		||||
		pll_lckd_o     => rx_pll_lckd, -- send pll_lckd out so it can be fed into a different BUFPLL
 | 
			
		||||
		serdesstrobe_o => open,        -- BUFPLL serdesstrobe output
 | 
			
		||||
		tmdsclk_o      => open,        -- TMDS cable clock
 | 
			
		||||
 | 
			
		||||
		hsync_o        => rx_hsync,    -- hsync data
 | 
			
		||||
		vsync_o        => rx_vsync,    -- vsync data
 | 
			
		||||
		valid_o        => open,
 | 
			
		||||
		ready_o        => open,
 | 
			
		||||
		psalgnerr_o    => open,
 | 
			
		||||
		sdout_o        => open,
 | 
			
		||||
		dat_en_o       => rx_color_en, -- data enable
 | 
			
		||||
		color_o        => rx_color
 | 
			
		||||
	);
 | 
			
		||||
end rtl;
 | 
			
		||||
 | 
			
		||||
configuration dvi_tb_rtl_cfg of dvi_tb is
 | 
			
		||||
  for rtl
 | 
			
		||||
  end for;
 | 
			
		||||
end dvi_tb_rtl_cfg;
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user