cy22395.vhd

来自「Vhdl cod for a clock for sp3e」· VHDL 代码 · 共 1,293 行 · 第 1/4 页

VHD
1,293
字号
            END IF;        END PROCESS MULT2;        -----------------------------------------------------------------------        -- Multiplier Process        -- The "Multiplier" actually divides the PLL_OUT signal        -----------------------------------------------------------------------        MULT3 : PROCESS (PLL3_OUT)            VARIABLE    mult_in  : natural;            VARIABLE    mult_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            mult_in := 2 * (to_nat(PLL3_P98) * 16#100# + to_nat(PLL3_P70) + 3)                       + to_nat(PLL3_P0);            IF PLL3_OUT /= 'Z' THEN                IF PLL3_OUT'event THEN                    IF first THEN                        MULT3_OUT <= PLL3_OUT;                        first := false;                        mult_cnt := mult_cnt + 1;                    ELSIF mult_cnt < mult_in THEN                        mult_cnt := mult_cnt + 1;                    ELSE                        mult_cnt := 1;                        MULT3_OUT <= NOT1(MULT3_OUT);                    END IF;                END IF;            ELSE                first := true;                mult_cnt := 0;                MULT3_OUT <= 'Z';            END IF;        END PROCESS MULT3;        -----------------------------------------------------------------------        -- Divider Process        -----------------------------------------------------------------------        DIV1 : PROCESS (PLL1_OUT)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            div_in := to_nat(PLL1_Q) + 2;            IF PLL1_OUT /= 'Z' THEN                IF PLL1_OUT'event THEN                    IF first THEN                        DIV1_OUT <= PLL1_OUT;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        DIV1_OUT <= NOT1(DIV1_OUT);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                DIV1_OUT <= 'Z';            END IF;        END PROCESS DIV1;        -----------------------------------------------------------------------        -- Divider Process        -----------------------------------------------------------------------        DIV2 : PROCESS (PLL2_OUT)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            div_in := to_nat(PLL2_Q) + 2;            IF PLL2_OUT /= 'Z' THEN                IF PLL2_OUT'event THEN                    IF first THEN                        DIV2_OUT <= PLL2_OUT;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        DIV2_OUT <= NOT1(DIV2_OUT);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                DIV2_OUT <= 'Z';            END IF;        END PROCESS DIV2;        -----------------------------------------------------------------------        -- Divider Process        -----------------------------------------------------------------------        DIV3 : PROCESS (PLL3_OUT)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            div_in := to_nat(PLL3_Q) + 2;            IF PLL3_OUT /= 'Z' THEN                IF PLL3_OUT'event THEN                    IF first THEN                        DIV3_OUT <= PLL3_OUT;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        DIV3_OUT <= NOT1(DIV3_OUT);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                DIV3_OUT <= 'Z';            END IF;        END PROCESS DIV3;        -----------------------------------------------------------------------        -- 4x4 Crosspoint Switch - Process        -----------------------------------------------------------------------        CrosspointSwitch : PROCESS (XTALIN, DIV1_OUT, DIV2_OUT, DIV3_OUT)            VARIABLE crossA : natural range 0 to 7;            VARIABLE crossB : natural range 0 to 7;            VARIABLE crossC : natural range 0 to 7;            VARIABLE crossD : natural range 0 to 7;        BEGIN            IF PLL1_DivSel = '0' THEN                crossA := to_nat((ClkA_FS21(1),ClkA_FS21(0),ClkA0_FS0));                crossB := to_nat((ClkB_FS21(1),ClkB_FS21(0),ClkB0_FS0));            ELSE                crossA := to_nat((ClkA_FS21(1),ClkA_FS21(0),ClkA1_FS0));                crossB := to_nat((ClkB_FS21(1),ClkB_FS21(0),ClkB1_FS0));            END IF;            crossC := to_nat((ClkC_FS21(1),ClkC_FS21(0),ClkC_FS0));            crossD := to_nat((ClkD_FS21(1),ClkD_FS21(0),ClkD_FS0));            CASE crossA IS                WHEN 0 => PostDivA_in <= XTALIN;                WHEN 1 => PostDivA_in <= NOTz(XTALIN);                WHEN 2 => PostDivA_in <= DIV1_OUT;                WHEN 3 => PostDivA_in <= NOTz(DIV1_OUT);                WHEN 4 => PostDivA_in <= DIV2_OUT;                WHEN 5 => PostDivA_in <= NOTz(DIV2_OUT);                WHEN 6 => PostDivA_in <= DIV3_OUT;                WHEN 7 => PostDivA_in <= NOTz(DIV3_OUT);                WHEN OTHERS => NULL;            END CASE;            CASE crossB IS                WHEN 0 => PostDivB_in <= XTALIN;                WHEN 1 => PostDivB_in <= NOTz(XTALIN);                WHEN 2 => PostDivB_in <= DIV1_OUT;                WHEN 3 => PostDivB_in <= NOTz(DIV1_OUT);                WHEN 4 => PostDivB_in <= DIV2_OUT;                WHEN 5 => PostDivB_in <= NOTz(DIV2_OUT);                WHEN 6 => PostDivB_in <= DIV3_OUT;                WHEN 7 => PostDivB_in <= NOTz(DIV3_OUT);                WHEN OTHERS => NULL;            END CASE;            CASE crossC IS                WHEN 0 => PostDivC_in <= XTALIN;                WHEN 1 => PostDivC_in <= NOTz(XTALIN);                WHEN 2 => PostDivC_in <= DIV1_OUT;                WHEN 3 => PostDivC_in <= NOTz(DIV1_OUT);                WHEN 4 => PostDivC_in <= DIV2_OUT;                WHEN 5 => PostDivC_in <= NOTz(DIV2_OUT);                WHEN 6 => PostDivC_in <= DIV3_OUT;                WHEN 7 => PostDivC_in <= NOTz(DIV3_OUT);                WHEN OTHERS => NULL;            END CASE;            CASE crossD IS                WHEN 0 => PostDivD_in <= XTALIN;                WHEN 1 => PostDivD_in <= NOTz(XTALIN);                WHEN 2 => PostDivD_in <= DIV1_OUT;                WHEN 3 => PostDivD_in <= NOTz(DIV1_OUT);                WHEN 4 => PostDivD_in <= DIV2_OUT;                WHEN 5 => PostDivD_in <= NOTz(DIV2_OUT);                WHEN 6 => PostDivD_in <= DIV3_OUT;                WHEN 7 => PostDivD_in <= NOTz(DIV3_OUT);                WHEN OTHERS => NULL;            END CASE;        END PROCESS CrosspointSwitch;        PostDivE_in <= DIV1_OUT;        -----------------------------------------------------------------------        -- Post Divider Process        -----------------------------------------------------------------------        POST_DIV_A : PROCESS (PostDivA_in)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            IF PLL1_DivSel = '0' THEN                div_in := to_nat(ClkA0_Div);            ELSE                div_in := to_nat(ClkA1_Div);            END IF;            IF div_in > 0 AND PostDivA_in /= 'Z' THEN                IF PostDivA_in'event THEN                    IF first THEN                        PostDivA_out <= PostDivA_in;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        PostDivA_out <= NOT1(PostDivA_out);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                PostDivA_out <= 'Z';            END IF;        END PROCESS POST_DIV_A;        -----------------------------------------------------------------------        -- Post Divider Process        -----------------------------------------------------------------------        POST_DIV_B : PROCESS (PostDivB_in)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            IF PLL1_DivSel = '0' THEN                div_in := to_nat(ClkB0_Div);            ELSE                div_in := to_nat(ClkB1_Div);            END IF;            IF div_in > 0 AND PostDivB_in /= 'Z' THEN                IF PostDivB_in'event THEN                    IF first THEN                        PostDivB_out <= PostDivB_in;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        PostDivB_out <= NOT1(PostDivB_out);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                PostDivB_out <= 'Z';            END IF;        END PROCESS POST_DIV_B;        -----------------------------------------------------------------------        -- Post Divider Process        -----------------------------------------------------------------------        POST_DIV_C : PROCESS (PostDivC_in)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            div_in := to_nat(ClkC_Div);            IF div_in > 0 AND PostDivC_in /= 'Z' THEN                IF PostDivC_in'event THEN                    IF first THEN                        PostDivC_out <= PostDivC_in;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        PostDivC_out <= NOT1(PostDivC_out);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                PostDivC_out <= 'Z';            END IF;        END PROCESS POST_DIV_C;        -----------------------------------------------------------------------        -- Post Divider Process        -----------------------------------------------------------------------        POST_DIV_D : PROCESS (PostDivD_in)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;        BEGIN            div_in := to_nat(ClkD_Div);            IF div_in > 0 AND PostDivD_in /= 'Z' THEN                IF PostDivD_in'event THEN                    IF first THEN                        PostDivD_out <= PostDivD_in;                        first := false;                        div_cnt := div_cnt + 1;                    ELSIF div_cnt < div_in THEN                        div_cnt := div_cnt + 1;                    ELSE                        div_cnt := 1;                        PostDivD_out <= NOT1(PostDivD_out);                    END IF;                END IF;            ELSE                first := true;                div_cnt := 0;                PostDivD_out <= 'Z';            END IF;        END PROCESS POST_DIV_D;        -----------------------------------------------------------------------        -- Post Divider Process        -----------------------------------------------------------------------        POST_DIV_E : PROCESS (PostDivE_in)            VARIABLE    div_in  : natural;            VARIABLE    div_cnt : natural;            VARIABLE    first   : BOOLEAN := true;            VARIABLE    div_help: NATURAL;        BEGIN            div_help := to_nat(ClkE_Div);            CASE div_help IS                WHEN 0  =>                    div_in := 0;                WHEN 1 =>                    div_in := 4;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?