一、偶分频电路,占空比为1:2
1 //************************************************************************** 2 // *** 名称 : div_clk.v 3 // *** 作者 : xianyu_FPGA 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/ 5 // *** 日期 : 2018-11-30 6 // *** 描述 : 任意偶数分频,占空比为 1:2 7 //************************************************************************** 8 9 module div_clk 10 //==================<参数>================================================== 11 #( 12 parameter DIV = 4 //分频系数(必须是偶数) 13 ) 14 //==================<端口>================================================== 15 ( 16 input wire clk , //时钟,50Mhz 17 input wire rst_n , //复位,低电平有效 18 output wire div_clk //分频时钟 19 ); 20 //==================<信号>================================================== 21 reg [31:0] cnt ; 22 wire add_cnt ; 23 wire end_cnt ; 24 25 //========================================================================== 26 //== 分频计数 27 //========================================================================== 28 always @(posedge clk or negedge rst_n) begin 29 if(!rst_n) 30 cnt <= 0; 31 else if(add_cnt) begin 32 if(end_cnt) 33 cnt <= 0; 34 else 35 cnt <= cnt + 1; 36 end 37 end 38 39 assign add_cnt = 1; 40 assign end_cnt = add_cnt && cnt== DIV-1; 41 42 //========================================================================== 43 //== 分频时钟 44 //========================================================================== 45 assign div_clk = (cnt < DIV/2) ? 0 : 1; 46 47 48 49 endmodule
二、奇分频电路,占空比为1:2
1 //************************************************************************** 2 // *** 名称 : div_clk.v 3 // *** 作者 : xianyu_FPGA 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/ 5 // *** 日期 : 2018-11-30 6 // *** 描述 : 任意奇数分频,占空比为 1:2 7 //************************************************************************** 8 9 module div_clk 10 //==================<参数>================================================== 11 #( 12 parameter DIV = 3 //分频系数(必须是奇数) 13 ) 14 //==================<端口>================================================== 15 ( 16 input wire clk , //时钟,50Mhz 17 input wire rst_n , //复位,低电平有效 18 output wire div_clk //分频时钟 19 ); 20 //==================<信号>================================================== 21 reg [31:0] pos_cnt ; 22 wire pos_add_cnt ; 23 wire pos_end_cnt ; 24 reg pos_clk ; 25 reg [31:0] neg_cnt ; 26 wire neg_add_cnt ; 27 wire neg_end_cnt ; 28 reg neg_clk ; 29 30 //========================================================================== 31 //== clk上升沿触发,得到DIV分频的前半段分频pos_clk 32 //========================================================================== 33 always @(posedge clk or negedge rst_n)begin 34 if(!rst_n) 35 pos_cnt <= 0; 36 else if(pos_add_cnt)begin 37 if(pos_end_cnt) 38 pos_cnt <= 0; 39 else 40 pos_cnt <= pos_cnt + 1; 41 end 42 end 43 44 assign pos_add_cnt = 1; 45 assign pos_end_cnt = pos_add_cnt && pos_cnt==DIV-1; 46 47 always @(posedge clk or negedge rst_n)begin 48 if(!rst_n) begin 49 pos_clk <= 0; 50 end 51 else if(pos_cnt==DIV/2) begin 52 pos_clk <= 1; 53 end 54 else if(pos_end_cnt) begin 55 pos_clk <= 0; 56 end 57 end 58 59 //========================================================================== 60 //== clk下降沿触发,得到DIV分频的后半段分频neg_clk 61 //========================================================================== 62 always @(negedge clk or negedge rst_n)begin 63 if(!rst_n) 64 neg_cnt <= 0; 65 else if(neg_add_cnt)begin 66 if(neg_end_cnt) 67 neg_cnt <= 0; 68 else 69 neg_cnt <= neg_cnt + 1; 70 end 71 end 72 73 assign neg_add_cnt = 1; 74 assign neg_end_cnt = neg_add_cnt && neg_cnt==DIV-1; 75 76 always @(negedge clk or negedge rst_n)begin 77 if(!rst_n) begin 78 neg_clk <= 0; 79 end 80 else if(neg_cnt==DIV/2) begin 81 neg_clk <= 1; 82 end 83 else if(neg_end_cnt) begin 84 neg_clk <= 0; 85 end 86 end 87 88 //========================================================================== 89 //== 相或,输出占空比为 1:2 的DIV分频 90 //========================================================================== 91 assign div_clk = pos_clk || neg_clk; 92 93 94 95 endmodule
三、任意整数分频
任意偶数分频和任意奇数分频结合即可以扩展为任意整数分频。
1 //************************************************************************** 2 // *** 名称 : div_clk.v 3 // *** 作者 : xianyu_FPGA 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/ 5 // *** 日期 : 2018-11-30 6 // *** 描述 : 任意整数分频,占空比为 1:2 7 //************************************************************************** 8 9 module div_clk 10 //==================<参数>================================================== 11 #( 12 parameter DIV = 3 //分频系数(奇偶任意) 13 ) 14 //==================<端口>================================================== 15 ( 16 input wire clk , //时钟,50Mhz 17 input wire rst_n , //复位,低电平有效 18 output wire div_clk //分频时钟 19 ); 20 21 //==================<信号>================================================== 22 reg [31:0] cnt ; 23 wire add_cnt ; 24 wire end_cnt ; 25 wire div_clk_even ; 26 reg [31:0] pos_cnt ; 27 wire pos_add_cnt ; 28 wire pos_end_cnt ; 29 reg pos_clk ; 30 reg [31:0] neg_cnt ; 31 wire neg_add_cnt ; 32 wire neg_end_cnt ; 33 reg neg_clk ; 34 wire div_clk_odd ; 35 36 //========================================================================== 37 //== 偶分频 38 //========================================================================== 39 always @(posedge clk or negedge rst_n) begin 40 if(!rst_n) 41 cnt <= 0; 42 else if(add_cnt) begin 43 if(end_cnt) 44 cnt <= 0; 45 else 46 cnt <= cnt + 1; 47 end 48 end 49 50 assign add_cnt = 1; 51 assign end_cnt = add_cnt && cnt== DIV-1; 52 53 assign div_clk_even = (cnt < DIV/2) ? 0 : 1; 54 55 //========================================================================== 56 //== 奇分频 57 //========================================================================== 58 always @(posedge clk or negedge rst_n)begin 59 if(!rst_n) 60 pos_cnt <= 0; 61 else if(pos_add_cnt)begin 62 if(pos_end_cnt) 63 pos_cnt <= 0; 64 else 65 pos_cnt <= pos_cnt + 1; 66 end 67 end 68 69 assign pos_add_cnt = 1; 70 assign pos_end_cnt = pos_add_cnt && pos_cnt==DIV-1; 71 72 always @(posedge clk or negedge rst_n)begin 73 if(!rst_n) begin 74 pos_clk <= 0; 75 end 76 else if(pos_cnt==DIV/2) begin 77 pos_clk <= 1; 78 end 79 else if(pos_end_cnt) begin 80 pos_clk <= 0; 81 end 82 end 83 84 always @(negedge clk or negedge rst_n)begin 85 if(!rst_n) 86 neg_cnt <= 0; 87 else if(neg_add_cnt)begin 88 if(neg_end_cnt) 89 neg_cnt <= 0; 90 else 91 neg_cnt <= neg_cnt + 1; 92 end 93 end 94 95 assign neg_add_cnt = 1; 96 assign neg_end_cnt = neg_add_cnt && neg_cnt==DIV-1; 97 98 always @(negedge clk or negedge rst_n)begin 99 if(!rst_n) begin 100 neg_clk <= 0; 101 end 102 else if(neg_cnt==DIV/2) begin 103 neg_clk <= 1; 104 end 105 else if(neg_end_cnt) begin 106 neg_clk <= 0; 107 end 108 end 109 110 assign div_clk_odd = pos_clk || neg_clk; 111 112 //========================================================================== 113 //== 奇偶判断后,输出正确的分频 114 //========================================================================== 115 assign div_clk = (DIV%2) ? div_clk_odd : div_clk_even; 116 117 118 endmodule
参考资料:[1]威三学院FPGA教程