基于Verilog的任意分频器设计

 时间:2024-10-12 05:21:53

1、偶数分频器相信大多数朋友在学习FPGA过程中接触到的第一个实验应该就是偶数分频器了,偶数分频器的设计较为简单,用一个简单的计数器就可以实现。比如要实现一个N分频(N为偶数)的分频器,可以先写一个计数器,当计数到(N/2-1)时,让输出状态翻转,并将计数器清零,这样输出的信号就是输入时钟的N分频了。具体代码如下:偶数分频器示例,20分频即N=20,占空比50%module clk_div(clk_out, clk, rst_n);input clk, rst_n;output clk_out;reg clk_out;reg [4:0] cnt;always @(posedge clk or negedge rst_n)if(!rst_n) begin cnt <= 5'b0; clk_out <= 1'b0; endelse if(cnt == 4'd9) begin cnt <= 5'b0; clk_out <= ~clk_out; endelse cnt <= cnt + 1'b1;endmodule

2、奇墙绅褡孛数分频器奇数分频器的设计比偶数分频器复杂一些,特别是占空比为50%的奇数分频器。如果对占空比迨藻悃顼没有明确的要求,则可以直接对上升沿计数,计数到(N-1)/2 时让输出翻转,计数到(N-1)时让输出状态再次翻转,并将计数器清零,这样就可以得到一个占空比为2:3的N分频(N为奇数)的分频器。而如果要实现50%的占空比,可以通过“错位相或”的方法实现。具体方法是用刚才的方法先通过对上升沿计数产生一个占空比为不是50%的N分频器,再用同样的方法对下降沿计数产生一个占空比也不是50%的N分频器,最后将这两个分频器的输出进行“或”运算,就可以得到占空比为50%的奇数N分频器,具体实现代码如下:奇数分频器示例,5分频,占空比50%module div_odd(clk_out, clk, rst_n);input clk, rst_n;output clk_out;reg clk_p, clk_n;reg [4:0] cnt1, cnt2; //注意根据实际需要调整位宽parameter N = 5; //此处N可以设为任意奇数//用上升沿产生非50%占空比的分频信号clk_palways @(posedge clk or negedge rst_n)if(!rst_n) begin cnt1 <= 0; clk_p <= 0; endelse if(cnt1 == 5'b10) //cnt_p == (N-1)/2,翻转 begin cnt1 <= cnt1 + 1'b1; clk_p <= ~clk_p; endelse if(cnt1 == 5'b100) //cnt_p == N-1,翻转 begin cnt1 <= 1'b0; clk_p <= ~clk_p; endelse cnt1 <= cnt1 +1'b1;//用下降沿产生非50%占空比的分频信号clk_nalways @(negedge clk or negedge rst_n)if(!rst_n) begin cnt2 <= 0; clk_n <= 0; endelse if(cnt2 == 5'b10) //cnt_n == (N-1)/2,翻转 begin cnt2 <= cnt2 + 1'b1; clk_n <= ~clk_n; endelse if(cnt2 == 5'b100) //cnt_n == N-1,翻转 begin cnt2 <= 1'b0; clk_n <= ~clk_n; endelse cnt2 <= cnt2 +1'b1;//相与运算,得到50%占空比的分频信号assign clk_out = clk_p | clk_n;endmodule

3、半分鸩月猎塘频器(N+0.5分频) 在实际工程中,我们还经常会遇到半分频器。比如要得到2MHz的时钟信号,而系统晶振频率为25MHz,这时候就需要对系统时钟作12.5分褂撼室酸频。那么这种半分频器又该如何实现呢?最直接的办法当然还是用计数器了,由于半整数分频无法实现50%的占空比(因为50%占空比就要求一个周期内高低电平都是6.25个系统时钟周期,这个0.25是不可能实现的),我们只能让占空比尽可能接近50%。以12.5分频为例,可以对系统时钟计数,在前6.5个周期输出低电平,后6个周期输出高电平,依次循环,就可以实现12.5分频,占空比为(6.5/12.5),接近50%。在计数时涉及到0.5个周期,因此对上升沿和下降沿都要计数。具体代码如下:半分频器,以12.5分频为例,占空比(6.5/12.5)module clk_half(clk_out, clk1, clk, rst_n);input clk,rst_n;output clk_out,clk1;parameter N = 13; //以12.5分频为例,N=13wire clk1;reg clk_out;reg[4:0] cnt;reg flag = 1'b0;//系统时钟clk计数器always @(negedge clk or negedge rst_n)if(!rst_n) flag <= 1'b0;else if(cnt == 5'd6) flag <= ~flag;//在第五个时钟结束后立即将 clk1 状态翻转assign clk1 = (flag)? ~clk:clk;//时钟 clk1 计数器,模为Nalways @(posedge clk1 or negedge rst_n)if(!rst_n) cnt <= 5'b0;else if(cnt == 5'd12) cnt <= 5'b0;else cnt <= cnt + 1'b1;//前6.5个周期为低电平,后6个周期为高电平,//即为12.5分频always @(posedge clk1 or negedge rst_n)if(!rst_n) clk_out <= 1'b0;else if(cnt == 5'd0) clk_out <= 1'b0;else if(cnt == 5'd7) clk_out <= 1'b1;else clk_out <= clk_out;endmodule

  • WORD文档如何调整上下箭头为绿色并调大
  • 标题前面的黑点怎么加
  • word复制粘贴后字体不统一
  • 如何删除word空白页
  • 在word中如何插入书目
  • 热门搜索
    勤俭节约手抄报图片 数学手抄报图片大全 飞向太空手抄报 快乐暑假手抄报内容 小学生防火手抄报 小组手抄报 手抄报内容大全 向国旗敬礼手抄报内容 关于感恩的手抄报图片 孝德手抄报