A. 奇數分頻電路!要求占空比為50%。比如3分頻,5分頻……
上面是JK,下是面是D,這個是三分頻,五分頻沒研究過,應該差不多的。沒記錯的話,如果要佔空比為50%,再加個一樣的結構,不過改成下降沿觸發,最後把兩個輸出相或
B. 用verilog HDL設計一個三分頻器,輸入時鍾占空比為1:1
//任意奇數分頻器,只需要將n改為你想要的奇數即可。
mole any_odd_div (clkdiv,clk);
output clkdiv; //輸出分頻信號
input clk; //時鍾信號
reg[2:0]cnt1,cnt2;//計數器1,計數器2
reg clk_temp1,clk_temp2;
parameter n = 7; //7分頻
always @(posedge clk)
begin
if(cnt1 == n-1)
begin cnt1 <=3'b000; end
else
begin cnt1 <= cnt1 +1'b1; end
if(cnt1 ==3'b000)
begin clk_temp1 =1'b1; end
if(cnt1 ==(n-1)/2)
begin clk_temp1 =0; end
end
always @(negedge clk)
begin
if(cnt2 == n-1)
begin cnt2 <=3'b000; end
else
begin cnt2 <=cnt2 +1'b1; end
if(cnt2 ==3'b000)
begin clk_temp2 =1; end
if(cnt2 ==(n-1)/2)
begin clk_temp2 =0; end
end
assign clkdiv = clk_temp1 | clk_temp2;
endmole
C. 怎樣用74ls194 構成奇偶分頻電路
利用194來設計奇數或偶數型的計數器,可以用反饋移位的方法來設計,具體可以見西安電子科技大學出版社,楊頌華編的數字電子技術基礎,第七章關於74LS194的部分 。設計時請注意能否自啟動的問題。
分頻器和計數器有本質聯系,比如把輸入信號作為模4計數器的時鍾信號,那麼計數器的輸出就可以將輸入信號4分頻。
(3)奇分頻電路擴展閱讀:
第一,偶數倍分頻:偶數倍分頻應該是大家都比較熟悉的分頻,通過計數器計數是完全可以實現的。如進行N倍偶數分頻,那麼可以通過由待分頻的時鍾觸發計數器計數,當計數器從0計數到N/2‐1時,輸出時鍾進行翻轉,並給計數器一個復位信號,使得下一個時鍾從零開始計數。以此循環下去。這種方法可以實現任意的偶數分頻。
第二,奇數倍分頻:奇數倍分頻有兩種實現方法:
首先,完全可以通過計數器來實現,如進行三分頻,通過待分頻時鍾上升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行兩次翻轉,比如可以在計數器計數到1時,輸出時鍾進行翻轉,計數到2時再次進行翻轉。即是在計數值在鄰近的1和2進行了兩次翻轉。
另外一種方法:對進行奇數倍n分頻時鍾,首先進行n/2分頻(帶小數,即等於(n‐1)/2+0.5),然後再進行二分頻得到。得到占空比為50%的奇數倍分頻。
D. 用verilog HDL 設計一個n分頻器,考試謝謝!
不知道考試是什麼難度的
但是一般的n分頻(n是2的整倍,即n是偶數)都是通過計數來實現,從0時刻開始,每一個原始時鍾上升沿(或下降沿,整個分頻過程基於同一邊沿)計數一次,計滿n/2則將輸出信號(分頻時鍾輸出)翻轉一次,再計n/2又翻轉一次,如此反復
如果要求奇數分頻,則對原始時鍾的上升沿和下降沿都計數,計滿n翻轉一次輸出時鍾信號即可
E. N/2分頻電路中N為什麼為奇數
如2,4,8,16.分頻比較好做,直接用T,JK,D觸發器串接就行了,但其他分頻的需要用時序邏輯組合來做,具體可根據時序圖寫出驅動方程,狀態方程...來設計.
F. 什麼是分頻計數器
分頻計數器是最基本的時序電路,它不僅可以用來統計輸入脈沖的個數,還可作為數字系統中的分頻、定時電路,用途相當廣泛。
一個數字系統中往往需要多種頻率的時鍾脈沖作為驅動源,這樣就需要對FPGA的系統時鍾(頻率較高)進行分頻。
比如在進行流水燈、數碼管動態掃描設計時不能直接使用系統時鍾(太快而肉眼無法識別),或者需要進行通信時,
由於通信速度不能太高(由不同的標准限定),這樣就需要對系統時鍾分頻以得到較低頻率的時鍾。
分頻器主要分為偶數分頻、奇數分頻、半整數分頻和小數分頻,如果在設計過程中採用參數化設計,就可以隨時改變參量以得到不同的分頻需要。
在對時鍾要求不是很嚴格的FPGA系統中,分頻通常都是通過計數器的循環計數來實現的。
(6)奇分頻電路擴展閱讀
分頻計數器的種類:
偶數分頻(2N)
偶數分頻最為簡單,很容易用模為N的計數器實現50%占空比的時鍾信號,即每次計數滿N(計到N-1)時輸出時鍾信號翻轉。
奇數分頻(2N+1)
使用模為2N+1的計數器,讓輸出時鍾在X-1(X在0到2N-1之間)和2N時各翻轉一次,則可得到奇數分頻器,但是占空比並不是50%(應為X/(2N+1))。
得到占空比為50%的奇數分頻器的基本思想是:將得到的上升沿觸發計數的奇數分頻輸出信號CLK1。
和得到的下降沿觸發計數的相同(時鍾翻轉值相同)奇數分頻輸出信號CLK2,最後將CLK1和CLK2相或之後輸出,就可以得到占空比為50%的奇數分頻器。
G. 什麼是雙d觸發器
在電子技術中,N/2(N為奇數)分頻電路有著重要的應用,對一個特定的輸入頻率,要經N/2分頻後才能得到所需要的輸出,這就要求電路具有N/2的非整數倍的分頻功能。CD4013是雙D觸發器,在以CD4013為主組成的若干個二分頻電路的基礎上,加上異或門等反饋控制,即可很方便地組成N/2分頻電路。
圖1是3/2分頻電路。IC1、IC2均接成二分頻器,所以該電路是由四分頻電路與反饋控制電路組成,計數脈沖由異或門F1輸出。fi既作為分頻信號又作為時鍾脈沖接入異或門的一個輸入端,從四分頻電路的IC2的Q2輸出端引出反饋信號作F1的另一輸入端。輸出信號fo從IC1的Q1端輸出。圖2是其工作波形。
設電路初始狀態均在復位狀態,Q1、Q2端均為低電平。當fi信號輸入時,由於輸入端異或門的作用(附表是異或門邏輯功能表),其輸出還受到觸發器IC2的Q2端的反饋控制(非門F2是增加的一級延遲門,A點波形與Q2相同)。在第1個fi時鍾脈沖的上升沿作用下,觸發器IC1、IC2均翻轉。由於Q2端的反饋作用使得異或門輸出一個很窄的正脈沖,寬度由兩級D觸發器和反相門的延時決定。當第1個fi脈沖下跳時,異或門輸出又立即上跳,使IC1觸發器再次翻轉,而IC2觸發器狀態不變。這樣在第1個輸入時鍾的半個周期內促使IC1觸發器的時鍾脈沖端CL1有一個完整周期的輸入,但在以後的一個輸入時鍾的作用下,由於IC2觸發器的Q2端為高電平,IC1觸發器的時鍾輸入跟隨fi信號(反相或同相)。本來IC1觸發器輸入兩個完整的輸入脈沖便可輸出一個完整周期的脈沖,現在由於異或門及IC2觸發器Q2端的反饋控製作用,在第1個fi脈沖的作用下得到一個周期的脈沖輸出,所以實現了每輸入一個半時鍾脈沖,在IC1觸發器的Q1端取得一個完整周期的輸出。
圖3是5/2分頻電路。IC1、IC2、IC3三級D觸發器級聯為8分頻電路,電容C起濾波作用,輸出信號fo從IC2的Q2端輸出。電路中有Q1、Q3兩個反饋控制。從圖4工作波形可知,Q1的反饋信號中每兩個反饋信號中就有一個受到Q3反饋波形的影響,所以在A點僅能形成幾百毫微秒寬的脈沖。由於電容C的作用,Q1的反饋信號(即一窄脈沖)被濾除掉,如圖4波形A的虛線所示。最後在Q2端輸出fo信號。fo每變化一個周期,對應於輸入信號fi的兩個半周期,即fo的頻率為fi的2/5。
圖5是7/2分頻電路。該電路與圖3相似,區別在於電路中一個反饋信號在圖3中是從Q1端引出的,而圖5是從Q2端引出的,fo信號從Q2端輸出。電路有Q2、Q3兩級反饋,由於Q2反饋信號受Q3反饋的影響,在A點僅能形成幾百毫微秒寬的窄脈沖,此窄脈沖被電容C濾除掉,因此Q2反饋不起作用,電路實際上只有一個Q3反饋,因而使得fo輸出信號每變化一個周期,對應於fi輸入信號的三個半周期,即fo的頻率為fi的2/7。其工作波形如圖6所示。
上面介紹的N/2分頻電路僅限於N≤7,當N≥7時,可根據分頻N值的大小,相應增加二分頻級數,並恰當引接反饋信號走線,便可得到N≥7的分頻電路。下面僅介紹一例9/2分頻電路,如圖7所示。圖8是其工作波形。
IC1~IC4四級D觸發器組成16分頻電路,fo信號從Q3輸出,電路有Q1、Q4兩級反饋。其工作原理與上述有關分頻電路相似,波形圖上A點虛線脈沖表示為電容C濾除掉的Q1反饋信號。從圖8中可知,只要fi輸入四個半周期的時鍾信號,就輸出一個周期信號fo,即fo的頻率為fi的2/9。
H. 如何用計數器實現任意分頻
如果是6分頻,就取計數6個脈沖後計數器的輸出(八位二進制計數器為01100000,二位BCD碼計數器為0110,0000)為4-16解碼器(如MC14514)的輸入,取4-16解碼器的S6腳作為輸出,就是6分頻器,10分頻器依此類推,取計數10個脈沖後計數器的輸出(八位二進制計數器為01010000,二位BCD碼計數器為0101,0000)為4-16解碼器的輸入,取4-16解碼器的S10腳作為輸出,30分頻器則需用兩個4-16解碼器共同組成5-32位解碼器,其他參照6分頻器和10分頻器。
I. 使用verilog語言實現分頻器 將50MHZ分為1hz和5hz
純粹的數字電路是不能實現3.5分頻的。
不要求綜合的,Verilog可以實現。
大致思路是分頻,然後分成2路信號:各路信號不變化。
J. verilog分頻後,輸出指定個數的脈沖,然後信號信號拉高
分頻器是FPGA設計中使用頻率非常高的基本設計之一,盡管在目前大部分設計中,廣泛使用晶元廠家集成的鎖相環資源,如賽(Xil)的DLL.來進行時鍾的分頻,倍頻以及相移。但是對於時鍾要求不高的基本設計,通過語言進行時鍾的分頻相移仍然非常流行,首先這種方法可以節省晶元內部的鎖相環資源,再者,消耗不多的邏輯單元就可以達到對時鍾操作的目的。另一方面,通過語言設計進行時鍾分頻,可以看出設計者對設計語言的理解程度。因此很多招聘單位在招聘時往往要求應聘者寫一個分頻器(比如奇數分頻)以考核應聘人員的設計水平和理解程度。下面講講對各種分頻系數進行分頻的方法:
第一,偶數倍分頻:偶數倍分頻應該是大家都比較熟悉的分頻,通過計數器計數是完全可以實現的。如進行N倍偶數分頻,那麼可以通過由待分頻的時鍾觸發計數器計數,當計數器從0計數到N/2-1時,輸出時鍾進行翻轉,並給計數器一個復位信號,使得下一個時鍾從零開始計數。以此循環下去。這種方法可以實現任意的偶數分頻。電路上只需一個D觸發器和一個非門即可實現,Q(n+1)=D,D=~Q(n),clk_out=Q(n+1) .
第二,奇數倍分頻:奇數倍分頻常常在論壇上有人問起,實際上,奇數倍分頻有兩種實現方法:
占空比為非50%的三分頻時鍾,完全可以通過計數器來實現,如進行三分頻,通過待分頻時鍾上升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行兩次翻轉,比如可以在計數器計數到1時,輸出時鍾進行翻轉,計數到2時再次進行翻轉。即是在計數值在鄰近的1和2進行了兩次翻轉。這樣實現的三分頻占空比為1/3或者2/3。
mole three(clk_in,rst,clk_out);
input clk_in,rst;
output clk_out;
regclk_out;
reg [1:0] count;
always @(negedge rst or posedge clk_in)
begin
if(rst==0)
begin
count<=0;
clk_out<=0;
end
else
begin
count<=count+1;
if(count==1)
clk_out<=~clk_out;
else if(count==2)
begin
clk_out=~clk_out;
count<=0;
end
end
end
endmole
另一種實現:
mole div3(CLKIN,CLKOUT,RESETn);
input CLKIN,RESETn;
output CLKOUT;
wire d;
regq1,q2;
wireCLKOUT;
always @(negedge RESETn or posedge CLKIN)
begin
if (RESETn==1'b0)
q1<=1'b0;
else
q1<=d;//q1是d延遲一個時鍾後的信號
end
always @(negedge RESETn or posedge CLKIN)
begin
if (RESETn==1'b0)
q2<=1'b0;
else
q2<=q1;//q2是q1延遲一個時鍾後的信號
end
assign d=~q1 & ~q2;//d在一個周期內,一個clk為高,另外兩個clk為低
assign CLKOUT=q2;
endmole
電路中,利用兩個D觸發器和簡單的門電路即可實現。
如果要實現占空比為50%的三分頻時鍾,可以通過待分頻時鍾下降沿觸發計數,和上升沿同樣的方法計數進行三分頻,然後下降沿產生的三分頻時鍾和上升沿產生的時鍾進行相或運算,即可得到占空比為50%的三分頻時鍾。
這種方法可以實現任意的奇數分頻。歸類為一般的方法為:對於實現占空比為50%的N倍奇數分頻,首先進行上升沿觸發進行模N計數,計數選定到某一個值進行輸出時鍾翻轉,然後經過(N-1)/2再次進行翻轉得到一個占空比非50%奇數n分頻時鍾。再者同時進行下降沿觸發的模N計數,到和上升沿觸發輸出時鍾翻轉選定值相同值時,進行輸出時鍾時鍾翻轉,同樣經過(N-1)/2時,輸出時鍾再次翻轉生成占空比非50%的奇數n分頻時鍾。兩個占空比非50%的n分頻時鍾相或運算,得到占空比為50%的奇數n分頻時鍾。
舉例:用Verilog語言寫的三分頻電路
方法一:
//上升沿觸發的分頻設計
mole three(clkin, clkout);
input clkin;//定義輸入埠
output clkout;//定義輸出端?
reg [1:0] step1, step;
always @(posedgeclkin)
begin
case (step)//這個狀態機就是一個計數器
2'b00: step<=2'b01;
2'b01: step<=2'b10;
2'b10: step<=2'b00;
default :step<=2'b00;
endcase
end
always @(negedgeclkin)//step1與step相差半個clk
begin
case (step1)
2'b00: step1<=2'b01;
2'b01: step1<=2'b10;
2'b10: step1<=2'b00;
default :step1<=2'b00;
endcase
end
assign clkout=step[1] | step1[1];//利用step和step1高位的或運算,實現在1.5個clk時翻轉。
endmole
用Verilog語言寫五分頻電路,占空比為50%:
mole div_5 ( clkin,rst,clkout );
input clkin,rst;
output clkout;
reg [2:0] step1, step2;
always @(posedge clkin )
if(!rst)
step1<=3'b000;
else
begin
case (step1)
3'b000: step1<=3'b001;
3'b001: step1<=3'b011;
3'b011: step1<=3'b100;
3'b100: step1<=3'b010;
3'b010: step1<=3'b000;
default:step1<=3'b000;
endcase
end
always @(negedge clkin )
if(!rst)
step2<=3'b000;
else
begincase (step2)
3'b000: step2<=3'b001;
3'b001: step2<=3'b011;//注意調換了順序,目的為了使最低位為1的情況互鄰
3'b011: step2<=3'b100;
3'b100: step2<=3'b010;
3'b010: step2<=3'b000;
default:step2<=3'b000;
endcase
end
assign clkout=step1[0] | step2[0];//step1與step2 最低位相或
endmole
下面給出一個任意整數分頻器的代碼:
mole divn(clk,rst_n,o_clk);
input clk,rst_n;
output o_clk;
parameter WIDTH = 3;
parameter N = 5;
reg [WIDTH-1:0] cnt_p,cnt_n;//count_pose,count_nege
reg clk_p,clk_n;
assign o_clk = (N==1)? clk : (N[0])?(clk_p&clk_n) :clk_p;
//如果N=1,o_clk=clk; 如果N為偶數,o_clk=clk_p; 如果N為奇數,o_clk=clk_p & clk_n,
//之所以是相與運算,是因為clk_p和clk_n兩者高電平比低電平多一個clk,而兩者相差半個clk,相與結果使//o_clk占空比為50%
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_p<=0;
else if (cnt_p==(N-1))
cnt_p<=0;
else cnt_p<=cnt_p+1;
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_p<=0;
else if (cnt_p<(N>>1))//N>>1,計數到N/2時,時鍾翻轉。如果將 cnt_p<改成 cnt_p<=,則clk_p低電平比//高電平多一個clk,如果clk_n也做類似修改,則N為奇數時,應執行相或運算, o_clk=clk_p | clk_n
clk_p<=0;
else clk_p<=1;
end
always @ (negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_n<=0;
else if (cnt_n==(N-1))
cnt_n<=0;
else cnt_n<=cnt_n+1;
end
always @ (negedge clk or negedge rst_n)
begin
if(!rst_n)
clk_n<=0;
else if (cnt_n<(N>>1))
clk_n<=0;
else clk_n<=1;
end
endmole
另外一種方法:對進行奇數倍n分頻時鍾,首先進行n/2分頻(帶小數,即等於(n-1)/2+0.5),然後再進行二分頻得到。得到占空比為50%的奇數倍分頻。
下面講講進行小數分頻的設計方法
小數分頻:首先講講如何進行n+0.5分頻,這種分頻需要對輸入時鍾進行操作。基本的設計思想:對於進行 n+0.5分頻,首先進行模n的計數,在計數到n-1時,輸出時鍾賦為『1』,回到計數0時,又賦為0,因此,可以知道,當計數值為n-1時,輸出時鍾才 為1,因此,只要保持計數值n-1為半個輸入時鍾周期,即實現了n+0.5分頻時鍾,因此保持n-1為半個時鍾周期即是一個難點。從中可以發現,因為計數 器是通過時鍾上升沿計數,因此可以在計數為n-1時對計數觸發時鍾進行翻轉,那麼時鍾的下降沿變成了上升沿。即在計數值為n-1期間的時鍾下降沿變成了上 升沿,則計數值n-1隻保持了半個時鍾周期,由於時鍾翻轉下降沿變成上升沿,因此計數值變為0。因此,每產生一個n+0.5分頻時鍾的周期,觸發時鍾都是 要翻轉一次.
方法二:
// 如果ty cycle =50%, 可以第一個周期
第二個周期輸出原先clock,第三個周期輸出低
這樣可以實現三分頻,
輸出是占空比1:1的三分頻.
mole three(clk,throut) ;
input clk ;
output throut;
reg q1,q2,d,throut;
always @(posedgeclk)
if(!d)
q1=1'b1;
else
q1=~q1 ;
always @(negedgeclk)
if(!d)
q2=1'b1;
else
q2=~q2 ;
always @(q1 or q2)
d=q1&q2 ;//d在一個周期內,0.5個clk為高,1個clk為低
always @(posedge d)
throut=~throut;
endmole
任意整數帶小數分頻的設計
基本原理:
採用脈沖吞吐計數器和鎖相環技術先設計兩個不同分頻比的整數分頻器。
然後通過控制單位時間內兩種分頻比出現的不同次數來獲得所需要的小數分頻值。
若設計一個分頻系數為10.1的分頻器,即可以將分頻器設計成9次10分頻和1次11分頻,這樣,總的分頻值為:
F=(9*10+1*11)/(9+1)=10.1
從這種實現方法的特點可以看出,由於分頻器的分頻值不斷改變,分頻後得到的信號抖動一般較大,在設計中使用的非常少。
----------------------
寫Verilog代碼時,如何控制一個信號線的拉高與拉低。
比如,數據到來時,把WE拉低,達到數據保持時間後,再拉高,數據之間有毛刺,此時WE已是低電平。就是數據到來一段時間後,WE拉低,數據快要變換時,再拉高,在數據與數據之間的連接處WE是高電平。我一開始感覺時鍾的波形挺像,可總控制不好,有時WE的變化在一...展開
暴走鷹梟|瀏覽 506 次
我有更好的答案
發布於2011-06-14 09:21最佳答案
if(data_in)
WE<=0;
if(!WE)
WE<=~WE;
//這是拉低一個時鍾,如果拉低多個時鍾,可以用計數器控制,關鍵代碼如下:
if(data_in&&cnt==5'h13)
WE<=0;
else begin
WE<=1;
cnt<=cnt+1;
end
//這是拉低20個時鍾周期
追問
這里data_in是一位數據,如果是多位,比如4位輸入或更多,改怎麼判斷數據的變化呢?
追答
假設輸入是4位的,則可以這樣判斷:
for(i=0;i<=3;i=i+1)
if(data_in[i]) //或者 if(!data_in[i]),可根據需要選擇
.........