- 定义:“分频”就是把输入信号的频率成倍数的低于输入频率的输出信号。
- 实验:
- 偶分频器以6分频为例进行讲解
- 波形
- RTL代码
module devide_six( input wire sys_clk, input wire sys_rst_n, output reg clk_out ); reg [1:0] cnt; always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) cnt <= 2'd0; else if(cnt == 2'd2) cnt <= 2'd0; else cnt <= cnt + 2'd1; always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) clk_out <= 1'b0; else if (cnt == 2'd2) clk_out <= ~clk_out; else clk_out <= clk_out; endmodule
- 仿真代码
`timescale 1ns/1ns module devide_six_tb(); reg sys_clk; reg sys_rst_n; wire clk_out; initial begin sys_clk = 1'b1; sys_rst_n <= 1'b0; #20 sys_rst_n <= 1'b1; end always #10 sys_clk = ~sys_clk; module devide_six( .sys_clk(sys_clk), .sys_rst_n(sys_rst_n), .clk_out(clk_out) ); endmodule
- 仿真波形
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二种方法实现(使用脉冲信号--推荐使用,与定时器的脉冲信号类似)
- 波形
- 这里的时钟相当于系统时钟的6降频,两个时钟的上升沿之间为一个降频后的一个时钟周期,只不过高低电平的占空比不同。
- RTL代码
module devide_six( input wire sys_clk, input wire sys_rst_n, output reg clk_out ); reg [1:0] cnt; always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) cnt <= 2'd0; else if(cnt == 2'd2) cnt <= 2'd0; else cnt <= cnt + 2'd1; always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) clk_out <= 1'b0; else if (cnt == 2'd2) clk_out <= ~clk_out; else clk_out <= clk_out; endmodule //------第二种方法------ module devide_six( input wire sys_clk, input wire sys_rst_n, output reg clk_out ); reg [2:0] cnt; reg cnt_flag; always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) cnt <= 3'd0; else if(cnt == 3'd5) cnt <= 3'd0; else cnt <= cnt + 3'd1; always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) cnt_flag <= 1'b0; else if (cnt == 3'd4) cnt_flag <= 1'b1; else cnt_flag <= 1'b0; //举例使用两种方法 reg a; //第一种 always@(posedge clk_out or negedge sys_rst_n) if(!sys_rst_n) a <= 1'b0; else a <= a + 1'b1; //第二种 always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) a <= 1'b0; else if(cnt_flag == 1'b1) a <= a + 1'b1; endmodule
- 仿真代码
`timescale 1ns/1ns module devide_six_tb(); reg sys_clk; reg sys_rst_n; wire clk_out; initial begin sys_clk = 1'b1; sys_rst_n <= 1'b0; #20 sys_rst_n <= 1'b1; end always #10 sys_clk = ~sys_clk; module ( .sys_clk(sys_clk), .sys_rst_n(sys_rst_n), .clk_out(clk_out) ); endmodule //------第二种方法-------- `timescale 1ns/1ns module devide_six_tb(); reg sys_clk; reg sys_rst_n; wire clk_flag; initial begin sys_clk = 1'b1; sys_rst_n <= 1'b0; #20 sys_rst_n <= 1'b1; end always #10 sys_clk = ~sys_clk; module ( .sys_clk(sys_clk), .sys_rst_n(sys_rst_n), .clk_flag(clk_flag) ); endmodule
- 仿真波形