匿名使用者
1級
2012-10-21 回答
你好,使用以下程式即可,使用時隻需改變N值,N的取值大小請看注釋,此程式适合對任意時鐘的整數分頻(包括奇偶),此程式已認證驗證。根據你的情況,想得到1HZ,N取50000000即可;想得到5HZ,N取10000000即可。
modulediv_N(
inputCLK,// 基準時鐘
outputCLK_div_N// N分頻後得到的時鐘
);
wire[31:0]N=20;// N為分頻系數,N≥2即可,N的值為CLK除以CLK_div_N後取整(四舍五入)
reg[31:0]cnt1;
regCLK_div_N_1;
always @ (posedge CLK)
begin
if(N%2==0)// 如果N為偶數
begin
if(N==2)// 如果N為2
CLK_div_N_1 <= ~CLK_div_N_1;
else
begin
if(cnt1==(N-2)/2)
begin
cnt1 <= 0;
CLK_div_N_1 <= ~CLK_div_N_1;
end
else
cnt1 <= cnt1+1;
end
end
else// 如果N為奇數
begin
if(cnt1==N-1)
cnt1 <= 0;
else
cnt1 <= cnt1+1;
if((cnt1==N-1) || (cnt1==(N-1)/2))
CLK_div_N_1 <= ~CLK_div_N_1;
else ;
end
end
wireCLK0=(N%2)? (~CLK):0;// 如果N為偶數,備用時鐘2(CLK_div_N_2)恒為0,即不需要用到此備用時鐘
reg[31:0]cnt2;
regCLK_div_N_2;
always @ (posedge CLK0)
begin
if(cnt2==N-1)
cnt2 <= 0;
else
cnt2 <= cnt2+1;
if((cnt2==N-1) || (cnt2==(N-1)/2))
CLK_div_N_2 <= ~CLK_div_N_2;
end
assignCLK_div_N = CLK_div_N_1 | CLK_div_N_2;
endmodule
-- Bob Liu原創