summaryrefslogtreecommitdiffstats
path: root/fpga/hp_lcd_driver/tmds_output_spartan6.vhdl
blob: 9307563c7e6d6c0dc06335c4013f5a1158bc9f18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
library ieee;
use ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.all;

library UNISIM;
use UNISIM.vcomponents.all;


entity tmds_output is
    port (
        sys_rst_n   : in std_logic;
        pclk_locked : in std_logic;
        pclk        : in std_logic;
        pclk_x2     : in std_logic;
        pclk_phy    : in std_logic;

        r_p10 : in std_logic_vector(9 downto 0);
        g_p10 : in std_logic_vector(9 downto 0);
        b_p10 : in std_logic_vector(9 downto 0);
        c_p10 : in std_logic_vector(9 downto 0);


        tmds_c_out_p : out std_logic;
        tmds_c_out_n : out std_logic;
        tmds_r_out_p : out std_logic;
        tmds_r_out_n : out std_logic;
        tmds_g_out_p : out std_logic;
        tmds_g_out_n : out std_logic;
        tmds_b_out_p : out std_logic;
        tmds_b_out_n : out std_logic
        );
end tmds_output;


architecture beh of tmds_output is


    signal phy_reset    : std_logic;
    signal upper        : std_logic;
    signal pll_locked   : std_logic;
    signal ioclk        : std_logic;
    signal serdesstrobe : std_logic;

begin
    phy_reset <= not sys_rst_n or not pll_locked;

    process (pclk_x2, phy_reset)
    begin
        if phy_reset = '1' then
            upper <= '1';
        elsif rising_edge(pclk_x2) then
            upper <= not upper;
        end if;
    end process;


    ioclk_buf : BUFPLL generic map (DIVIDE => 5)
        port map (
            PLLIN        => pclk_phy,
            GCLK         => pclk_x2,
            LOCKED       => pclk_locked,
            IOCLK        => ioclk,
            SERDESSTROBE => serdesstrobe,
            LOCK         => pll_locked);


    phy_c : entity work.tmds_phy_spartan6
        port map (
            reset        => phy_reset,
            pclk_x2      => pclk_x2,
            serdesstrobe => serdesstrobe,
            ioclk        => ioclk,
            upper        => upper,
            din          => c_p10,
            tmds_out_p   => tmds_c_out_p,
            tmds_out_n   => tmds_c_out_n
            );

    phy_r : entity work.tmds_phy_spartan6
        port map (
            reset        => phy_reset,
            pclk_x2      => pclk_x2,
            serdesstrobe => serdesstrobe,
            ioclk        => ioclk,
            upper        => upper,
            din          => r_p10,
            tmds_out_p   => tmds_r_out_p,
            tmds_out_n   => tmds_r_out_n
            );


    phy_g : entity work.tmds_phy_spartan6
        port map (
            reset        => phy_reset,
            pclk_x2      => pclk_x2,
            serdesstrobe => serdesstrobe,
            ioclk        => ioclk,
            upper        => upper,
            din          => g_p10,
            tmds_out_p   => tmds_g_out_p,
            tmds_out_n   => tmds_g_out_n
            );


    phy_b : entity work.tmds_phy_spartan6
        port map (
            reset        => phy_reset,
            pclk_x2      => pclk_x2,
            serdesstrobe => serdesstrobe,
            ioclk        => pclk_phy,
            upper        => upper,
            din          => b_p10,
            tmds_out_p   => tmds_b_out_p,
            tmds_out_n   => tmds_b_out_n
            );





end beh;