Verilog任意整数分频电路

来源:互联网 发布:渔夫屈原网络课 编辑:程序博客网 时间:2024/05/01 17:19
//`define N 5module div_N (     input CLK,  // 基准时钟     output CLK_div_N, // N分频后得到的时钟     input rst    );wire [31:0] N=5; // ★ N为分频系数,N≥2即可,N的值为CLK除以CLK_div_N后取整(四舍五入)/******************** 产生备用时钟1 ***************/reg [31:0] cnt1;reg   CLK_div_N_1;always @ (posedge CLK or negedge rst)begin  if(!rst)begincnt1<=0;CLK_div_N_1<=0;endelse if(N[0]==0) // 如果N为偶数,比N%2==0这种判断方式更节省资源   begin   if(N==2) // 如果N为2    CLK_div_N_1 <= ~CLK_div_N_1;   else    if(cnt1==((N-2)>>1))   //比cnt1==(N-2)/2这种判断方式更节省资源      begin       cnt1 <= 0;       CLK_div_N_1 <= ~CLK_div_N_1;      end     else      cnt1 <= cnt1+1;    end  endelse // 如果N为奇数if(cnt1==(N-1)/2)beginCLK_div_N_1 <= ~CLK_div_N_1;cnt1<=cnt1+1'b1;endelse if(cnt1==N-1) begin cnt1 <= 0;CLK_div_N_1 <= ~CLK_div_N_1;endelsecnt1<=cnt1+1'b1;  end/*********************** 产生备用时钟2 *********************/wire  CLK0=(N%2)? (~CLK):0; // 如果N为偶数,备用时钟2(CLK_div_N_2)恒为0,即不需要用到此备用时钟reg [31:0] cnt2;reg   CLK_div_N_2;always @ (posedge CLK0 or negedge rst)if(!rst)begincnt2<=0;CLK_div_N_2<=0;endelse if(cnt2==(N-1)/2)beginCLK_div_N_2 <= ~CLK_div_N_2;cnt2 <= cnt2+1;endelse if(cnt2==N-1) begin cnt2 <= 0;CLK_div_N_2 <= ~CLK_div_N_2;endelse cnt2 <= cnt2+1;  /******************** 产生最终分频时钟************************/assign  CLK_div_N = CLK_div_N_1 | CLK_div_N_2;endmodule verilog代码
module div_N_tb;reg CLK,rst;wire CLK_div_N;div_N U1(.CLK(CLK),.CLK_div_N(CLK_div_N),.rst(rst));initialbeginCLK=0;rst=0;#5 rst=1;forever#5 CLK=~CLK;endendmoduleTB代码


                                             
0 0
原创粉丝点击