赞
踩
之前的博客中,我们讨论的偶数分频和奇数分频,总结一下,就是:
1.偶数分频时,设计一个计数器,从0计到N-1,然后又回到0,信号在计数器等于N/2-1和N-1的时候翻转。
2.奇数分频时,设计两个计数器cnt_p和cnt_n,分别在时钟的上升沿和下降沿改变,并且计数范围为0-N-1,同时设计两个信号clk_p和clk_n,clk_p在时钟上升沿改变,clk_n在下降沿改变,当计数器cnt_p的值为(N-1)/2和N-1时,clk_p信号翻转,clk_n同理。最后两个信号相或就能得到最终的结果。
本文我们讨论半整数分频的实现,即K+0.5分频器的设计。
我们设K+0.5=N,则下面是我们的设计方法,在下图中,我们首先设置了两个计数器cnt_p和cnt_n,分别在时钟上升沿和下降沿改变,同时也设置了两个时钟信号clk_p,clk_n,同样也分别在上升沿和下降沿改变。
我们让clk_p信号的高电平持续N+0.5个周期,低电平信号持续N-0.5个周期,clk_n信号也做同样的处理,但是,让这两者的相位差为N个周期(这是容易做到的),这样,我们将clk_p和clk_n相与,就能得到一个N分频的时钟,尽管占空比不等于50%。
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2022/03/08 15:52:45 // Design Name: // Module Name: clk_div // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module clk_div #(parameter N = 5) //5+0.5分频 ( input logic clk, input logic rst, output logic clk_div ); logic [3:0] cnt_p; logic [3:0] cnt_n; logic clk_p; logic clk_n; always_ff@(posedge clk,posedge rst) if(rst) cnt_p<=0; else if(cnt_p==(2*N+1)-1) cnt_p<=0; else cnt_p<=cnt_p+1; // always_ff@(negedge clk,posedge rst) if(rst) cnt_n<=0; else if(cnt_n==2*N+1-1) cnt_n<=0; else cnt_n<=cnt_n+1; //clk_p always_ff@(posedge clk,posedge rst) if(rst) clk_p<=0; else if(cnt_p==0) clk_p<=1; else if(cnt_p==(N+1)) clk_p<=0; //clk_n always_ff@(negedge clk,posedge rst) if(rst) clk_n<=1; else if(cnt_n==0) clk_n<=0; else if(cnt_n==N) clk_n<=1; // assign clk_div=clk_n&clk_p; endmodule
仿真平台:
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2022/03/08 10:45:00 // Design Name: // Module Name: test_tb // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module test_tb( ); logic clk; logic rst; logic clk_div; initial begin clk=0; forever begin #5 clk=~clk; end end initial begin rst=1; #21 rst=0; end clk_div #(.N(3)) U(.*); endmodule
仿真得到的波形(以5.5分频为例)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。