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

📄 altera_mf.vhd

📁 The GRLIB IP Library is an integrated set of reusable IP cores, designed for system-on-chip (SOC) de
💻 VHD
📖 第 1 页 / 共 5 页
字号:
    function INT_TO_STR_RAM (value : in integer) return string;    function INT_TO_STR_ARITH (value : in integer) return string;    function HEX_STR_TO_INT (str : in string) return integer;    procedure SHRINK_LINE (str_line : inout line; pos : in integer);end ALTERA_COMMON_CONVERSION;package body ALTERA_COMMON_CONVERSION is-- This function converts an integer to a stringfunction INT_TO_STR_RAM (value : in integer) return string isvariable ivalue : integer := 0;variable index  : integer := 0;variable digit : integer := 0;variable line_no: string(8 downto 1) := "        ";begin    ivalue := value;    index := 1;    while (ivalue > 0) loop        digit := ivalue MOD 10;        ivalue := ivalue/10;        case digit is            when 0 => line_no(index) := '0';            when 1 => line_no(index) := '1';            when 2 => line_no(index) := '2';            when 3 => line_no(index) := '3';            when 4 => line_no(index) := '4';            when 5 => line_no(index) := '5';            when 6 => line_no(index) := '6';            when 7 => line_no(index) := '7';            when 8 => line_no(index) := '8';            when 9 => line_no(index) := '9';            when others =>                ASSERT FALSE                REPORT "Illegal number!"                SEVERITY ERROR;        end case;        index := index + 1;    end loop;    return line_no;end INT_TO_STR_RAM;function INT_TO_STR_ARITH (value : in integer) return string is    variable ivalue : integer := 0;    variable index : integer := 0;    variable digit : integer := 0;    variable temp: string(10 downto 1) := "0000000000";begin    ivalue := value;    index := 1;    while (ivalue > 0) loop        digit := ivalue mod 10;        ivalue := ivalue/10;        case digit is            when 0 => temp(index) := '0';            when 1 => temp(index) := '1';            when 2 => temp(index) := '2';            when 3 => temp(index) := '3';            when 4 => temp(index) := '4';            when 5 => temp(index) := '5';            when 6 => temp(index) := '6';            when 7 => temp(index) := '7';            when 8 => temp(index) := '8';            when 9 => temp(index) := '9';            when others =>                ASSERT FALSE                REPORT "Illegal number!"                SEVERITY ERROR;        end case;        index := index + 1;    end loop;    if value < 0 then        return '-'& temp(index downto 1);    else        return temp(index downto 1);    end if;end INT_TO_STR_ARITH;-- This function converts a hexadecimal number to an integerfunction HEX_STR_TO_INT (str : in string) return integer isvariable len : integer := str'length;variable ivalue : integer := 0;variable digit : integer := 0;begin    for i in len downto 1 loop        case str(i) is            when '0' => digit := 0;            when '1' => digit := 1;            when '2' => digit := 2;            when '3' => digit := 3;            when '4' => digit := 4;            when '5' => digit := 5;            when '6' => digit := 6;            when '7' => digit := 7;            when '8' => digit := 8;            when '9' => digit := 9;            when 'A' => digit := 10;            when 'a' => digit := 10;            when 'B' => digit := 11;            when 'b' => digit := 11;            when 'C' => digit := 12;            when 'c' => digit := 12;            when 'D' => digit := 13;            when 'd' => digit := 13;            when 'E' => digit := 14;            when 'e' => digit := 14;            when 'F' => digit := 15;            when 'f' => digit := 15;            when others =>                ASSERT FALSE                REPORT "Illegal character "&  str(i) & "in Intel Hex File! "                SEVERITY ERROR;        end case;        ivalue := ivalue * 16 + digit;    end loop;    return ivalue;end HEX_STR_TO_INT;-- This procedure "cuts" the str_line into desired lengthprocedure SHRINK_LINE (str_line : inout line; pos : in integer) issubtype nstring is string(1 to pos);variable str : nstring;begin    if (pos >= 1) then        read(str_line, str);    end if;end;end ALTERA_COMMON_CONVERSION;-- END OF PACKAGELibrary ieee;use ieee.std_logic_1164.all;-- START PACKAGE HEADER ------------------------------------------------------------ Package Name : pllpack---- Description  : Used by altpll model to calculate required advanced parameters--                for PLL simulation. Also has functions to do string->integer,--                integer->string conversions.---- END PACKAGE HEADER ------------------------------------------------------------ PACKAGE DECLARATIONpackage pllpack is-- FUNCTION DECLARATION    function alt_conv_integer(arg : in std_logic_vector)             return integer;    function gcd (X: integer; Y: integer)             return integer;    function lcm (A1: integer; A2: integer; A3: integer; A4: integer;                  A5: integer; A6: integer; A7: integer;                  A8: integer; A9: integer; A10: integer; P: integer)             return integer;    function output_counter_value (clk_divide: integer; clk_mult : integer;                                   M: integer; N: integer )             return integer;    function counter_mode (duty_cycle: integer; output_counter_value: integer)             return string;    function counter_high (output_counter_value: integer := 1; duty_cycle: integer)             return integer;    function counter_low (output_counter_value: integer; duty_cycle: integer)             return integer;    function mintimedelay (t1: integer; t2: integer; t3: integer; t4: integer;                           t5: integer; t6: integer; t7: integer; t8: integer;                           t9: integer; t10: integer)             return integer;    function maxnegabs (t1: integer; t2: integer; t3: integer; t4: integer;                        t5: integer; t6: integer; t7: integer; t8: integer;                        t9: integer; t10: integer)             return integer;    function counter_time_delay (clk_time_delay: integer;                                 m_time_delay: integer; n_time_delay: integer)             return integer;    function get_phase_degree (phase_shift: integer; clk_period: integer)             return integer;    function counter_initial (tap_phase: integer; m: integer; n: integer)             return integer;    function counter_ph (tap_phase: integer; m : integer; n: integer)             return integer;    function ph_adjust (tap_phase: integer; ph_base : integer)             return integer;    function translate_string (mode : string)             return string;    function str2int (s : string)             return integer;    function int2str (value : integer)             return string;end pllpack;-- BEGINNING OF PACKAGEpackage body pllpack is-- convert std_logic_vector to integerfunction alt_conv_integer(arg : in std_logic_vector) return integer isvariable result : integer := 0;begin    result := 0;    for i in arg'range loop        if arg(i) = '1' then            result := result + 2**i;        end if;    end loop;    return result;end alt_conv_integer;-- find the greatest common denominator of X and Yfunction gcd (X: integer; Y: integer) return integer isvariable L, S, R, G : integer := 1;begin    if (X < Y) then -- find which is smaller.        S := X;        L := Y;    else        S := Y;        L := X;    end if;    R := S;    while ( R > 1) loop        S := L;        L := R;        R := S rem L; -- divide bigger number by smaller.                      -- remainder becomes smaller number.    end loop;    if (R = 0) then  -- if evenly divisible then L is gcd else it is 1.        G := L;    else        G := R;    end if;    return G;end gcd;-- find the least common multiple of A1 to A10function lcm (A1: integer; A2: integer; A3: integer; A4: integer;              A5: integer; A6: integer; A7: integer;              A8: integer; A9: integer; A10: integer; P: integer)         return integer isvariable M1, M2, M3, M4, M5 , M6, M7, M8, M9, R: integer := 1;begin    M1 := (A1 * A2)/gcd(A1, A2);    M2 := (M1 * A3)/gcd(M1, A3);    M3 := (M2 * A4)/gcd(M2, A4);    M4 := (M3 * A5)/gcd(M3, A5);    M5 := (M4 * A6)/gcd(M4, A6);    M6 := (M5 * A7)/gcd(M5, A7);    M7 := (M6 * A8)/gcd(M6, A8);    M8 := (M7 * A9)/gcd(M7, A9);    M9 := (M8 * A10)/gcd(M8, A10);    if (M9 < 3) then        R := 10;    elsif ((M9 < 10) and (M9 >= 3)) then        R := 4 * M9;    else        R := M9 ;    end if;    return R;end lcm;-- find the factor of division of the output clock frequency compared to the VCOfunction output_counter_value (clk_divide: integer; clk_mult: integer ;                               M: integer; N: integer ) return integer isvariable R: integer := 1;begin    R := (clk_divide * M)/(clk_mult * N);    return R;end output_counter_value;-- find the mode of each PLL counter - bypass, even or oddfunction counter_mode (duty_cycle: integer; output_counter_value: integer)         return string isvariable R: string (1 to 6) := "      ";variable counter_value: integer := 1;begin    counter_value := (2*duty_cycle*output_counter_value)/100;    if output_counter_value = 1 then        R := "bypass";    elsif (counter_value REM 2) = 0 then        R := "  even";    else        R := "   odd";    end if;    return R;end counter_mode;-- find the number of VCO clock cycles to hold the output clock highfunction counter_high (output_counter_value: integer := 1; duty_cycle: integer)         return integer isvariable R: integer := 1;variable half_cycle_high : integer := 1;begin    half_cycle_high := (duty_cycle * output_counter_value *2)/100 ;    if (half_cycle_high REM 2 = 0) then        R := half_cycle_high/2 ;    else        R := (half_cycle_high/2) + 1;    end if;    return R;end;-- find the number of VCO clock cycles to hold the output clock lowfunction counter_low (output_counter_value: integer; duty_cycle: integer)         return integer isvariable R, R1: integer := 1;variable half_cycle_high : integer := 1;begin    half_cycle_high := (duty_cycle * output_counter_value*2)/100 ;    if (half_cycle_high REM 2 = 0) then        R1 := half_cycle_high/2 ;    else        R1 := (half_cycle_high/2) + 1;    end if;    R := output_counter_value - R1;    return R;end;-- find the smallest time delay amongst t1 to t10function mintimedelay (t1: integer; t2: integer; t3: integer; t4: integer;                       t5: integer; t6: integer; t7: integer; t8: integer;                       t9: integer; t10: integer) return integer isvariable m1,m2,m3,m4,m5,m6,m7,m8,m9 : integer := 0;begin    if (t1 < t2) then m1 := t1; else m1 := t2; end if;    if (m1 < t3) then m2 := m1; else m2 := t3; end if;    if (m2 < t4) then m3 := m2; else m3 := t4; end if;    if (m3 < t5) then m4 := m3; else m4 := t5; end if;    if (m4 < t6) then m5 := m4; else m5 := t6; end if;    if (m5 < t7) then m6 := m5; else m6 := t7; end if;    if (m6 < t8) then m7 := m6; else m7 := t8; end if;    if (m7 < t9) then m8 := m7; else m8 := t9; end if;    if (m8 < t10) then m9 := m8; else m9 := t10; end if;    if (m9 > 0) then return m9; else return 0; end if;end;-- find the numerically largest negative number, and return its absolute valuefunction maxnegabs (t1: integer; t2: integer; t3: integer; t4: integer;                    t5: integer; t6: integer; t7: integer; t8: integer;                    t9: integer; t10: integer) return integer isvariable m1,m2,m3,m4,m5,m6,m7,m8,m9 : integer := 0;begin    if (t1 < t2) then m1 := t1; else m1 := t2; end if;    if (m1 < t3) then m2 := m1; else m2 := t3; end if;    if (m2 < t4) then m3 := m2; else m3 := t4; end if;    if (m3 < t5) then m4 := m3; else m4 := t5; end if;

⌨️ 快捷键说明

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