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…
Reference in New Issue
Block a user