|
1.偶数分频器
相信大多数朋友在学习FPGA过程中接触到的第一个实验应该就是偶数分频器了,偶数分频器的设计较为简单,用一个简单的计数器就可以实现。比如要实现一个N分频(N为偶数)的分频器,可以先写一个计数器,当计数到(N/2-1)时,让输出状态翻转,并将计数器清零,这样输出的信号就是输入时钟的N分频了。具体代码如下:
偶数分频器示例,20分频即N=20,占空比50%。
代码:
module clk_div(clk_out, clk, rst_n);
input clk, rst_n;
output clk_out;
reg clk_out;
reg [4:0] cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
cnt <= 5'b0;
clk_out <= 1'b0;
end
else if(cnt == 4'd9)
begin
cnt <= 5'b0;
clk_out <= ~clk_out;
end
else cnt <= cnt + 1'b1;
endmodule
2.奇数分频
奇数分频器的设计比偶数分频器复杂一些,特别是占空比为50%的奇数分频器。如果对占空比没有明确的要求,则可以直接对上升沿计数,计数到(N-1)/2 时让输出翻转,计数到(N-1)时让输出状态再次翻转,并将计数器清零,这样就可以得到一个占空比为2:3的N分频(N为奇数)的分频器。而如果要实现50%的占空比,可以通过“错位相或”的方法实现。具体方法是用刚才的方法先通过对上升沿计数产生一个占空比为不是50%的N分频器,再用同样的方法对下降沿计数产生一个占空比也不是50%的N分频器,最后将这两个分频器的输出进行“或”运算,就可以得到占空比为50%的奇数N分频器,具体实现代码如下:
module div_odd
(
input clk,
input rst_n,
output clk_out
);
//----------count the posedge---------------------
reg [2:0] cnt_p;
reg clk_p;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
cnt_p <= 3'd0;
else if(cnt_p == 3'd4)
cnt_p <= 3'd0;
else
cnt_p <= cnt_p + 1'b1;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
clk_p <= 1'b0;
else if((cnt_p == 3'd2) || (cnt_p == 3'd4))
clk_p <= ~ clk_p;
//---------------------------------------------
//----------count the negedge------------------
reg [2:0] cnt_n;
reg clk_n;
always @ (negedge clk or negedge rst_n)
if(!rst_n)
cnt_n <= 3'd0;
else if(cnt_n == 3'd4)
cnt_n <= 3'd0;
else
cnt_n <= cnt_n + 1'b1;
always @ (negedge clk or negedge rst_n)
if(!rst_n)
clk_n <= 1'b0;
else if((cnt_n == 3'd2) || (cnt_n == 3'd4))
clk_n <= ~clk_n;
//----------------------------------------------
assign clk_out = clk_p | clk_n;
endmodule
|
|