标签:分频 FPGA clk 奇数 cnt1 clk1 clk2 reg
在FPGA开发中,我们往往需要对时钟进行分频,得到满足我们需求的时钟频率。尽管这些分频的工作完全可以由PLL等ip核完成,但通过verilog语言同样也可以实现。在本博客中,我们仅讨论整数倍分频。
偶数倍分频
偶数倍分频的实现较为简单,一般是设置一个计数器,从0开始计数,达到N-1后又重新归零,分频的时钟信号在(N/2-1)时翻转。
奇数倍分频
三分频
分别设置两个模3计数器cnt1,cnt2,以及两个中间信号clk1,clk2,clk1信号在clk信号的上升沿且cnt1=0或2的时候翻转,而clk2信号在clk信号的下降沿且cnt2=0或2的时候翻转,最后clk1和clk2信号相或,得到最终的结果clk_div3,即实现了三分频的效果。
以下是实现的Verilog代码:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/02/07 12:32:58
// Design Name:
// Module Name: odd_clkdiv
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module odd_clkdiv(
input wire rst,
input wire clk,
output wire clk_div3
);
reg [3:0] cnt1;
reg [3:0] cnt2;
reg clk1;
reg clk2;
assign clk_div3=clk1 | clk2;
//cnt1
always@(posedge clk,posedge rst)
if(rst)
cnt1<=0;
else if(cnt1==2)
cnt1<=0;
else
cnt1<=cnt1+1;
//cnt2
always@(negedge clk,posedge rst)
if(rst)
cnt2<=0;
else if(cnt2==3-1)
cnt2<=0;
else
cnt2<=cnt2+1;
//clk1
always@(posedge clk,posedge rst)
if(rst)
clk1<=1;
else if(cnt1==0||cnt1==2)
clk1<=~clk1;
//clk2
always@(negedge clk,posedge rst)
if(rst)
clk2<=1;
else if(cnt2==0||cnt2==2)
clk2<=~clk2;
endmodule
仿真波形:
该三分频信号的占空比为50%。
任意倍奇数倍分频
算法如下:
a.设置一个计数长度为N的上升沿计数器,和一个信号寄存器;信号寄存器在上升沿计数器为(N-1)/2的时候进行翻转,然后再在计数到N-1的时候进行翻转。
b.设置一个计数长度为N的下降沿计数器,和另一个信号寄存器;信号寄存器在下降沿计数器为(N-1)/2的时候进行翻转,然后再在计数到N-1的时候进行翻转。
c.将A和B相或就可以得到奇数分频信号。Verilog代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/02/07 12:32:58
// Design Name:
// Module Name: odd_clkdiv
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module odd_clkdiv
#(parameter N = 5)
(
input wire rst,
input wire clk,
output wire clk_div
);
reg [31:0] cnt1;
reg [31:0] cnt2;
reg clk1;
reg clk2;
assign clk_div=clk1 | clk2;
//cnt1
always@(posedge clk,posedge rst)
if(rst)
cnt1<=0;
else if(cnt1==N-1)
cnt1<=0;
else
cnt1<=cnt1+1;
//cnt2
always@(negedge clk,posedge rst)
if(rst)
cnt2<=0;
else if(cnt2==N-1)
cnt2<=0;
else
cnt2<=cnt2+1;
//clk1
always@(posedge clk,posedge rst)
if(rst)
clk1<=1;
else if(cnt1==(N-1)/2||cnt1==(N-1))
clk1<=~clk1;
//clk2
always@(negedge clk,posedge rst)
if(rst)
clk2<=1;
else if(cnt2==(N-1)/2||cnt2==(N-1))
clk2<=~clk2;
endmodule
11分频仿真波形展示:
标签:分频,FPGA,clk,奇数,cnt1,clk1,clk2,reg 来源: https://blog.csdn.net/qq_40268672/article/details/122807283
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。