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






