用VHDL語言實現(xiàn)3分頻電路
標(biāo)簽/分類:
眾所周知,分頻器是FPGA設(shè)計中使用頻率非常高的基本設(shè)計之一,盡管在目前大部分設(shè)計中,廣泛使用芯片廠家集成的鎖相環(huán)資源,如altera 的PLL,Xilinx的DLL.來進(jìn)行時鐘的分頻,倍頻以及相移。但是對于時鐘要求不高的基本設(shè)計,通過語言進(jìn)行時鐘的分頻相移仍然非常流行,首先這種方法可以節(jié)省芯片內(nèi)部的鎖相環(huán)資源,再者,消耗不多的邏輯單元就可以達(dá)到對時鐘操作的目的。另一方面,通過語言設(shè)計進(jìn)行時鐘分頻,可以看出設(shè)計者對設(shè)計語言的理解程度。因此很多招聘單位在招聘時往往要求應(yīng)聘者寫一個分頻器(比如奇數(shù)分頻)以考核應(yīng)聘人員的設(shè)計水平和理解程度。下面講講對各種分頻系數(shù)進(jìn)行分頻的方法:
第一,偶數(shù)倍分頻:偶數(shù)倍分頻應(yīng)該是大家都比較熟悉的分頻,通過計數(shù)器計數(shù)是完全可以實現(xiàn)的。如進(jìn)行N倍偶數(shù)分頻,那么可以通過由待分頻的時鐘觸發(fā)計數(shù)器計數(shù),當(dāng)計數(shù)器從0計數(shù)到N/2-1時,輸出時鐘進(jìn)行翻轉(zhuǎn),并給計數(shù)器一個復(fù)位信號,使得下一個時鐘從零開始計數(shù)。以此循環(huán)下去。這種方法可以實現(xiàn)任意的偶數(shù)分頻。
第二:奇數(shù)倍分頻:奇數(shù)倍分頻常常在論壇上有人問起,實際上,奇數(shù)倍分頻有兩種實現(xiàn)方法:首先,完全可以通過計數(shù)器來實現(xiàn),如進(jìn)行三分頻,通過待分頻時鐘上升沿觸發(fā)計數(shù)器進(jìn)行模三計數(shù),當(dāng)計數(shù)器計數(shù)到鄰近值進(jìn)行兩次翻轉(zhuǎn),比如可以在計數(shù)器計數(shù)到1時,輸出時鐘進(jìn)行翻轉(zhuǎn),計數(shù)到2時再次進(jìn)行翻轉(zhuǎn)。即是在計數(shù)值在鄰近的1和2進(jìn)行了兩次翻轉(zhuǎn)。這樣實現(xiàn)的三分頻占空比為1/3或者2/3。如果要實現(xiàn)占空比為50%的三分頻時鐘,可以通過待分頻時鐘下降沿觸發(fā)計數(shù),和上升沿同樣的方法計數(shù)進(jìn)行三分頻,然后下降沿產(chǎn)生的三分頻時鐘和上升沿產(chǎn)生的時鐘進(jìn)行相或運算,即可得到占空比為50%的三分頻時鐘。這種方法可以實現(xiàn)任意的奇數(shù)分頻。歸類為一般的方法為:對于實現(xiàn)占空比為50%的N倍奇數(shù)分頻,首先進(jìn)行上升沿觸發(fā)進(jìn)行模N計數(shù),計數(shù)選定到某一個值進(jìn)行輸出時鐘翻轉(zhuǎn),然后經(jīng)過(N-1)/2再次進(jìn)行翻轉(zhuǎn)得到一個占空比非50%奇數(shù)n分頻時鐘。再者同時進(jìn)行下降沿觸發(fā)的模N計數(shù),到和上升沿觸發(fā)輸出時鐘翻轉(zhuǎn)選定值相同值時,進(jìn)行輸出時鐘時鐘翻轉(zhuǎn),同樣經(jīng)過(N-1)/2時,輸出時鐘再次翻轉(zhuǎn)生成占空比非50%的奇數(shù)n分頻時鐘。兩個占空比非50%的n分頻時鐘相或運算,得到占空比為50%的奇數(shù)n分頻時鐘。另外一種方法:對進(jìn)行奇數(shù)倍n分頻時鐘,首先進(jìn)行n/2分頻(帶小數(shù),即等于(n-1)/2+0.5),然后再進(jìn)行二分頻得到。得到占空比為50%的奇數(shù)倍分頻。下面講講進(jìn)行小數(shù)分頻的設(shè)計方法
第三 ,小數(shù)分頻:首先講講如何進(jìn)行n+0.5分頻,這種分頻需要對輸入時鐘進(jìn)行操作?;镜脑O(shè)計思想:對于進(jìn)行n+0.5分頻,首先進(jìn)行模n的計數(shù),在計數(shù)到n-1時,輸出時鐘賦為‘1’,回到計數(shù)0時,又賦為0,因此,可以知道,當(dāng)計數(shù)值為n-1時,輸出時鐘才為1,因此,只要保持計數(shù)值n-1為半個輸入時鐘周期,即實現(xiàn)了n+0.5分頻時鐘,因此保持n-1為半個時鐘周期即是一個難點。從中可以發(fā)現(xiàn),因為計數(shù)器是通過時鐘上升沿計數(shù),因此可以在計數(shù)為n-1時對計數(shù)觸發(fā)時鐘進(jìn)行翻轉(zhuǎn),那么時鐘的下降沿變成了上升沿。即在計數(shù)值為n-1期間的時鐘下降沿變成了上升沿,則計數(shù)值n-1只保持了半個時鐘周期,由于時鐘翻轉(zhuǎn)下降沿變成上升沿,因此計數(shù)值變?yōu)?。因此,每產(chǎn)生一個n+0.5分頻時鐘的周期,觸發(fā)時鐘都是要翻轉(zhuǎn)一次.
下面是根據(jù)上面思想寫的三分頻程序,1/3和50%占空比的程序.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--? Uncomment the following lines to use the declarations that are
--? provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity division3 is
? port (clk: in std_logic;
??????? out1: out std_logic);
end division3;
architecture Behavioral of division3 is
?signal division2,division4 :std_logic:='0';
?signal temp1,temp2:integer range 0 to 10;
?
begin
?p1:process(clk)
??begin
???if rising_edge(clk) then
????temp1 <=temp1+1;
????if temp1=1 then
?????division2<='1';
????elsif temp1=2 then
?????? division2<='0';
?????temp1<=0;
????end if;
????? end if;
?end process p1;
?p2:process(clk)
??begin
??if clk'event and clk='0' then
????temp2<=temp2+1;
?????if temp2=1 then
??
??????division4<='1';
?????elsif temp2=2 then
??????division4<='0';
??????temp2<=0;
????end if;
??? end if;
?? end process p2;
?p3:process(division2,division4)
?begin
???out1<=division2 or division4;
?end process p3;
?
end Behavioral; (50%)
把上面的部分截取就可以得到異步的.
評論