|
以下是筆者用AHDL (Altera HDL)語(yǔ)言寫(xiě)的關(guān)于外部PLL控制器,50%占空比的5分頻和50%占空比的3分頻模塊的源程序及其生成的模塊圖,程序中文字部分為注釋。 AHDL 是Altera 公司的硬件邏輯描述語(yǔ)言的簡(jiǎn)稱(chēng),其特點(diǎn)是非常易學(xué)易用,學(xué)過(guò)高級(jí)語(yǔ)言的人可以在很短的時(shí)間(如幾周)內(nèi)掌握AHDL。它的缺點(diǎn)是移植性不好,通常只用于ALTERA自己的開(kāi)發(fā)系統(tǒng)。 由于我們研發(fā)的系統(tǒng)采用“自頂向下”層次化設(shè)計(jì)的思想,這里提供的只是各個(gè)模塊的源程序,在實(shí)際設(shè)計(jì)中采用以下源程序生成各個(gè)相應(yīng)的模塊,然后在頂層文件中加以組合,以完成相應(yīng)的功能。 ---------------------------------------------------------------------------------------------------------------------- --該程序?yàn)橥獠?/SPAN>PLL系數(shù)控制源程序 SUBDESIGN Pll_control -- 設(shè)計(jì)實(shí)體名; ( gear_v[1..0]: INPUT; --定義一個(gè)模4計(jì)數(shù)器的輸出值作為該控制器的輸入; --模4計(jì)數(shù)器用于記錄切換按鍵的脈沖,每按一次按鍵,計(jì)數(shù)器加1; v[8..0],r[6..0],s[2..0]: OUTPUT; ) BEGIN TABLE gear_v[1..0]=> v[8..0],r[6..0],s[2..0]; 0 => B"001111000",B"0010111",B"100"; 1 => B"100000000",B"0010111",B"100"; 2 => B"010101011",B"0010111",B"100"; 3 => B"100001000",B"0010111",B"100"; END TABLE; END; ----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- --該程序?yàn)?/SPAN>50%占空比5分頻模塊源程序 SUBDESIGN clk_divider_5 -- 設(shè)計(jì)實(shí)體名; ( Clock, en : INPUT; Divide_Clk : OUTPUT; ) VARIABLE Interior_Clk : Node; -- 建立一個(gè)內(nèi)部時(shí)鐘; Divide_DFF[1..0] : DFF; -- 說(shuō)明一個(gè) D 觸發(fā)組; Result_DFF : DFF; -- 建立一個(gè)輸出 D 觸發(fā)器; BEGIN IF en THEN Interior_Clk = Clock $ Result_DFF; -- 輸入時(shí)鐘異或結(jié)果觸發(fā)器值; Divide_DFF[].Clk = Interior_Clk; -- D 觸發(fā)器的時(shí)鐘連接; IF Divide_DFF[] = = 2 THEN --D 觸發(fā)器的輸入端處理; Divide_DFF[].D = 0; ELSE Divide_DFF[].D = Divide_DFF[] + 1; END IF; -- 計(jì)數(shù)器計(jì)滿(mǎn)一次,結(jié)果觸發(fā)器翻轉(zhuǎn)一次; Result_DFF.Clk = Divide_DFF[1]; Result_DFF.D = !Result_DFF; Divide_Clk = Result_DFF; -- 分頻信號(hào)輸出; END IF; END; -----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- --該程序?yàn)?/SPAN>50%占空比3分頻模塊源程序 SUBDESIGN clk_divider_3 -- 設(shè)計(jì)實(shí)體名; ( Clock, en : INPUT; Divide_Clk : OUTPUT; ) VARIABLE Interior_Clk : Node; -- 建立一個(gè)內(nèi)部時(shí)鐘; Divide_DFF : DFF; -- 說(shuō)明一個(gè) D 觸發(fā)器; Result_DFF : DFF; -- 建立一個(gè)輸出 D 觸發(fā)器; BEGIN IF en THEN Interior_Clk = Clock $ Result_DFF; -- 輸入時(shí)鐘異或結(jié)果觸發(fā)器值; Divide_DFF[].Clk = Interior_Clk; -- D 觸發(fā)器的時(shí)鐘連接; IF Divide_DFF[] = = 1 THEN --D 觸發(fā)器的輸入端處理; Divide_DFF[].D = 0; ELSE Divide_DFF[].D = Divide_DFF[] + 1; END IF; -- 計(jì)數(shù)器計(jì)滿(mǎn)一次,結(jié)果觸發(fā)器翻轉(zhuǎn)一次; Result_DFF.Clk = Divide_DFF; Result_DFF.D = !Result_DFF; Divide_Clk = Result_DFF; -- 分頻信號(hào)輸出; END IF; END; ------------------------------------------------------------------------------------------------------------------- 對(duì)于模10分頻器,因?yàn)槭桥紨?shù)倍分頻,可直接調(diào)用Quartus II開(kāi)發(fā)工具中參數(shù)化計(jì)數(shù)器來(lái)實(shí)現(xiàn)。為確保占空比為50%,先進(jìn)行5分頻,然后進(jìn)行2分頻實(shí)現(xiàn)。具體如下圖所示:  |