首页 > 代码库 > 任意整数分频Verilog(占空比50%)
任意整数分频Verilog(占空比50%)
程序实现任意整数分频的功能,已在modelsim中通过验证。
1 //`define N 5 2 module div_N ( 3 input CLK, // 基准时钟 4 output CLK_div_N, // N分频后得到的时钟 5 input rst 6 ); 7 wire [31:0] N=5; // ★ N为分频系数,N≥2即可,N的值为CLK除以CLK_div_N后取整(四舍五入) 8 9 /******************** 产生备用时钟1 ***************/10 reg [31:0] cnt1;11 reg CLK_div_N_1;12 always @ (posedge CLK or negedge rst)13 begin 14 if(!rst)15 begin16 cnt1<=0;17 CLK_div_N_1<=0;18 end19 else if(N[0]==0) // 如果N为偶数,比N%2==0这种判断方式更节省资源20 begin21 if(N==2) // 如果N为222 CLK_div_N_1 <= ~CLK_div_N_1;23 else24 if(cnt1==((N-2)>>1)) //比cnt1==(N-2)/2这种判断方式更节省资源25 begin26 cnt1 <= 0;27 CLK_div_N_1 <= ~CLK_div_N_1;28 end29 else30 cnt1 <= cnt1+1;31 end32 end33 else // 如果N为奇数34 if(cnt1==(N-1)/2)35 begin36 CLK_div_N_1 <= ~CLK_div_N_1;cnt1<=cnt1+1‘b1;37 end38 else if(cnt1==N-1) begin cnt1 <= 0;CLK_div_N_1 <= ~CLK_div_N_1;end39 else40 cnt1<=cnt1+1‘b1;41 42 end43 44 /*********************** 产生备用时钟2 *********************/45 wire CLK0=(N%2)? (~CLK):0; // 如果N为偶数,备用时钟2(CLK_div_N_2)恒为0,即不需要用到此备用时钟46 reg [31:0] cnt2;47 reg CLK_div_N_2;48 always @ (posedge CLK0 or negedge rst)49 if(!rst)50 begin51 cnt2<=0;52 CLK_div_N_2<=0;53 end54 else 55 if(cnt2==(N-1)/2)56 begin57 CLK_div_N_2 <= ~CLK_div_N_2;cnt2 <= cnt2+1;58 end59 else if(cnt2==N-1) begin cnt2 <= 0;CLK_div_N_2 <= ~CLK_div_N_2;end60 else61 cnt2 <= cnt2+1;62 63 64 /******************** 产生最终分频时钟************************/65 assign CLK_div_N = CLK_div_N_1 | CLK_div_N_2;66 67 endmodule
`timescale 1ns/1nsmodule 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;endendmodule
图1: 9分频电路
图2: 8分频电路
解释:刚程序调好时发现,偶数分频时候,第一个分频后的时钟不是占用原时钟8clk,还以为程序有问题,细想之后,应该是偶数计数器是从0到(N/2)-1计数,每次到(N/2)-1时翻转,而第一次初始情况下cnt就是0,但新时钟却没有翻转,
任意整数分频Verilog(占空比50%)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。