本帖最后由 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ù)器,cnt_n為下降沿觸發(fā)時的計數(shù)器
- reg clk_p,clk_n; //clk_p為上升沿觸發(fā)時分頻時鐘,clk_n為下降沿觸發(fā)時分頻時鐘
- //上升沿觸發(fā)時計數(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表示右移一位,相當于除以2去掉余數(shù)
- clk_p<=0;
- else
- clk_p<=1; //得到的分頻時鐘正周期比負周期多一個clk時鐘
- end
- //下降沿觸發(fā)時計數(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ā)的分頻時鐘輸出,和clk_p相差半個時鐘
- always @ (negedge clk)
- begin
- if(!rst_n)
- clk_n<=0;
- else if (cnt_n<(N>>1))
- clk_n<=0;
- else
- clk_n<=1; //得到的分頻時鐘正周期比負周期多一個clk時鐘
- end
- assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //條件判斷表達式
- //當N=1時,直接輸出clk
- //當N為偶數(shù)也就是N的最低位為0,N(0)=0,輸出clk_p
- //當N為奇數(shù)也就是N最低位為1,N(0)=1,輸出clk_p&clk_n。正周期多所以是相與
- endmodule
復制代碼
|