校招Verilog——任意整数分频
一、代码
1 //************************************************************************** 2 // *** 名称 : div_clk.v 3 // *** 作者 : xianyu_FPGA 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/ 5 // *** 日期 : 2019-08-10 6 // *** 描述 : 任意整数分频,占空比为 1:2 7 //************************************************************************** 8 9 module div_clk 10 //========================< 参数 >========================================== 11 #( 12 parameter DIV = 2 //分频系数(奇偶任意) 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_clk ; 23 reg [31:0] neg_cnt ; 24 wire neg_clk ; 25 //========================================================================== 26 //== clk上升沿分频 27 //========================================================================== 28 always @(posedge clk or negedge rst_n) begin 29 if(!rst_n) 30 pos_cnt <= 0; 31 else if(pos_cnt == DIV - 1) 32 pos_cnt <= 0; 33 else 34 pos_cnt <= pos_cnt + 1; 35 end 36 37 assign pos_clk = (pos_cnt < DIV/2) ? 0 : 1; 38 //========================================================================== 39 //== clk下降沿分频 40 //========================================================================== 41 always @(negedge clk or negedge rst_n) begin 42 if(!rst_n) 43 neg_cnt <= 0; 44 else if(neg_cnt == DIV - 1) 45 neg_cnt <= 0; 46 else 47 neg_cnt <= neg_cnt + 1; 48 end 49 50 assign neg_clk = (neg_cnt < DIV/2) ? 0 : 1; 51 //========================================================================== 52 //== 奇偶判断后,输出正确的分频 53 //========================================================================== 54 assign div_clk = DIV[0] ? (pos_clk & neg_clk) : pos_clk; 55 56 57 endmodule
二、仿真情况
1、DIV=2时
2、DIV=3时