以下是筆者用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ì)滿一次,結(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ì)滿一次,結(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)。具體如下圖所示:






