用sf现成的板子自己在做dds的缘故,晶震的频率25mhz 需要25分频 到1mhz。
这就遇到了奇数分频的问题。
先采用传统的分频思想。
分别在时钟上升沿和下降沿用计数器在计数的一个值进行翻转,在经过(n-2)/2 计数后在进行翻转,
最后将2个输出进行异或处理就得到需要的奇数n分频信号。
代码部分:
module clk25to1 (clk,rst_n,
clk_1m);
input clk; //25mhz
input rst_n; //复位信号低电平有效
output clk_1m; //25分频后时钟
reg [4:0] cnt1;
reg [4:0] cnt2;
module clk25to1 (clk,rst_n,
clk_1m);
input clk; //25mhz
input rst_n; //复位信号低电平有效
output clk_1m; //25分频后时钟
reg [4:0] cnt1;
reg [4:0] cnt2;
reg clk_1to25p, clk_1to25n;
//上升沿计数,记到12翻转,在经过(n-1)/2 =12时,在经过翻转
//占空比13:12
always @(posedge clk or negedge rst_n)begin
if(!rst_n) begin
cnt1 <= 5'd0;
clk_1to25p <= 1'b0;
end
else begin
if(cnt1 == 5'd24)begin
cnt1 <= 5'd0;
clk_1to25p <= !clk_1to25p;
end
else begin
cnt1 <= cnt1 + 1'b1;
if(cnt1 == 5'd12)
clk_1to25p <= !clk_1to25p;
end
end
end
//下降沿计数,记到12翻转,在经过(n-1)/2 =12时,在经过翻转
//占空比13:12
always @(negedge clk or negedge rst_n)begin
if(!rst_n) begin
cnt2 <= 5'd0;
clk_1to25n <= 1'b0;
end
else begin
if(cnt2 == 5'd24)begin
cnt2 <= 5'd0;
clk_1to25n <= !clk_1to25n;
end
else begin
cnt2 <= cnt2 + 1'b1;
if(cnt2 == 5'd12)
clk_1to25n <= !clk_1to25n;
end
end
end
//错位相或,得到25分频时钟
assign clk_1m = clk_1to25p | clk_1to25n;
endmodule
仿真波形。
考虑到逻辑资源和fpga内部pll的时钟稳定性。
我在dds中用pll进行倍频,然后进行50分频,同样得到1mhz信号。
文章评论(0条评论)
登录后参与讨论