|
本帖最后由 Mystery0724 于 2019-3-28 09:39 編輯
- module divide(
- clk,
- rst_n,
- clkout);
-
- input clk,rst_n;
- output clkout;
-
- parameter WIDTH = 3;
- parameter N = 5;
- reg [WIDTH-1:0] cnt_p,cnt_n; //cnt_p為上升沿觸發(fā)時(shí)的計(jì)數(shù)器,cnt_n為下降沿觸發(fā)時(shí)的計(jì)數(shù)器
- reg clk_p,clk_n; //clk_p為上升沿觸發(fā)時(shí)分頻時(shí)鐘,clk_n為下降沿觸發(fā)時(shí)分頻時(shí)鐘
- //上升沿觸發(fā)時(shí)計(jì)數(shù)器的控制
- 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表示右移一位,相當(dāng)于除以2去掉余數(shù)
- clk_p<=0;
- else
- clk_p<=1; //得到的分頻時(shí)鐘正周期比負(fù)周期多一個(gè)clk時(shí)鐘
- end
- //下降沿觸發(fā)時(shí)計(jì)數(shù)器的控制
- 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
- //下降沿觸發(fā)的分頻時(shí)鐘輸出,和clk_p相差半個(gè)時(shí)鐘
- always @ (negedge clk)
- begin
- if(!rst_n)
- clk_n<=0;
- else if (cnt_n<(N>>1))
- clk_n<=0;
- else
- clk_n<=1; //得到的分頻時(shí)鐘正周期比負(fù)周期多一個(gè)clk時(shí)鐘
- end
- assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //條件判斷表達(dá)式
- //當(dāng)N=1時(shí),直接輸出clk
- //當(dāng)N為偶數(shù)也就是N的最低位為0,N(0)=0,輸出clk_p
- //當(dāng)N為奇數(shù)也就是N最低位為1,N(0)=1,輸出clk_p&clk_n。正周期多所以是相與
- endmodule
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|