1.偶分频模块设计
偶分频意思是时钟模块设计最为简单。首先得到分频系数M和计数器值N。
M = 时钟输入频率 / 时钟输出频率
N = M / 2
如输入时钟为50M,输出时钟为25M,则M=2,N=1。偶分频则意味着M为偶数。
以M=4,N=2为例,我们希望得到的输出时钟时序如下:
因此只需要将counter以clk_in为时钟驱动计数,当counter = (N-1)时,clk_out翻转即可。
verilog代码如下,其中WIDTH为(N的位宽-1):
module time_adv_even #(
parameter N = 2,
WIDTH = 7
)
(
input clk,
input rst,
output reg clk_out
);
reg [WIDTH:0]counter;
always @(posedge clk or posedge rst) begin
if (rst) begin
// reset
counter <= 0;
end
else if (counter == N-1) begin
counter <= 0;
end
else begin
counter <= counter + 1;
end
end
always @(posedge clk or posedge rst) begin
if (rst) begin
// reset
clk_out <= 0;
end
else if (counter == N-1) begin
clk_out <= !clk_out;
end
end
endmodule
testbench测试8分频即N=4,ISE仿真结果如下:
2.奇分频模块设计
奇分频需要通过两个时钟共同得到。首先得到分频系数M和计数器值N。
M = 时钟输入频率 / 时钟输出频率
N = (M-1) / 2
如输入时钟为50M,输出时钟为10M