下载正品官方网站,做音箱木工网站,私域流量运营,用flash做的网站展示分频器简介
实现分频一般有两种方法#xff0c;一种方法是直接使用 PLL 进行分频#xff0c;比如在 FPGA 或者 ASIC 设计中#xff0c;都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性#xff0c;无法得到频率很低的时钟信号#xff0c;比如输入 …分频器简介
实现分频一般有两种方法一种方法是直接使用 PLL 进行分频比如在 FPGA 或者 ASIC 设计中都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性无法得到频率很低的时钟信号比如输入 100Mhz 时钟很多PLL 都无法得到 1Mhz 以下的时钟信号。另外一种方法是直接使用 Verilog 代码来实现分频。 注意 使用 Verilog 代码分频得到的时钟信号尽量不要当做其他模块的输入时钟信号因为通过 Verilog 代码分频得到的时钟信号默认不会连接到 FPGA 的时钟网络上这样会导致时钟出现偏移和抖动在高频电路中会影响电路稳定性这种分频方式一般用于产生外部低速总线的参考时钟如SPI、I2C的参考时钟。
偶数分频器和奇数分频器
根据分频器的分频比例是偶数还是奇数可以将其分为偶数分频器和奇数分频器。
偶数分频就是分频前的频率和分频后的频率比值是偶数比如一个 50Mhz 的晶振时钟进行二分频后就是 50Mhz/225Mhz奇数分频就是分配前的频率和分频后的频率比值是奇数。比如一个 50Mhz 的晶振时钟进行三分频后就是 50Mhz/316.667Mhz
偶数分频实现
假设 NN为偶数分频只需计数到 N/2-1然后时钟翻转、计数器清零如此循环就可以得到 N 分频。举个例子比如晶振时钟是 100Mhz 时钟想得到一个 25Mhz 的时钟那么这个是一个 100/254 的四分频设计按照我们刚说的计数到 4/2-11然后时钟翻转、计数器清零就可以得到一个 25Mhz 的时钟。
偶数分频 Verilog 代码
timescale 1ns / 1psmodule divider4(input sys_clk,input sys_rst_n,output reg out_clk
);//分频计数器
reg [2:0] count;//分频计数器按分频比/2-1进行计数
always (posedge sys_clk) beginif(!sys_rst_n)count 2d0;else if(count 2d1)count count 2d1;elsecount 2d0;
end//翻转输出时钟
always (posedge sys_clk) beginif(!sys_rst_n)out_clk 1b0;else if(count 2d1)out_clk ~out_clk;
endendmodule奇数分频器实现
同样假设 NN为奇数分频计数器需要计数到 N-1当计数器为0时输出时钟1在输入时钟的上升沿拉低当计数器计数到 N/2 取整时输出时钟1在输入时钟的上升沿进行拉高同时当计数器为0时输出时钟2在输入时钟的下降沿拉低当计数器计数到 N/2 取整时输出时钟2在输入时钟的下降沿进行拉高将输出时钟1和输出时钟2相与即可得到真正的输出时钟。
奇数分频 Verilog 代码
timescale 1ns / 1psmodule divider5(input sys_clk,input sys_rst_n,output out_clk
);//分频计数器
reg [2:0] count;
//上升沿跳变的中间时钟
reg out_clk1;
//下降沿跳变的中间时钟
reg out_clk2;//分频计数器按分频比-1进行计数
always (posedge sys_clk) beginif(!sys_rst_n)count 3d0;else if(count 3d4)count count 3d1;elsecount 3d0;
end//输出时钟1
always (posedge sys_clk) beginif(!sys_rst_n)out_clk1 1b0;else if(count 3d0)out_clk1 1b0;else if(count 3d2)out_clk1 1b1;
end//输出时钟2
always (negedge sys_clk) beginif(!sys_rst_n)out_clk2 1b0;else if(count 3d0)out_clk2 1b0;else if(count 3d2)out_clk2 1b1;
end//输出分频后的时钟
assign out_clk out_clk1 out_clk2;endmodule任意分频器实现
在实现任意分频器时可以利用条件生成语句当模块例化时传入的参数为偶数则生成偶数分频的代码否则生成奇数分频的代码有关生成语句相关的内容参考03 Verilog HDL 语法。
任意分频 Verilog 代码
timescale 1ns / 1psmodule divider #(//参数列表parameter COUNT_WIDTH 3, //内部分频计数器宽度parameter DIV 5 //分频系数
)
(input sys_clk,input sys_rst_n,output reg out_clk
);//分频计数器
reg [COUNT_WIDTH-1:0] count;generateif((DIV % 2) 0) begin//偶数分频//按分频比/2-1进行计数always (posedge sys_clk) beginif(!sys_rst_n)count 0;else if(count (DIV / 2 -1))count count 1;elsecount 0;end//翻转输出时钟always (posedge sys_clk) beginif(!sys_rst_n)out_clk 1b0;else if(count (DIV / 2 -1))out_clk ~out_clk;endendelse begin//奇数分频//上升沿跳变的中间时钟reg out_clk1;//下降沿跳变的中间时钟reg out_clk2;//按分频比-1进行计数always (posedge sys_clk) beginif(!sys_rst_n)count 0;else if(count (DIV -1))count count 1;elsecount 0;end//输出时钟1always (posedge sys_clk) beginif(!sys_rst_n)out_clk1 1b0;else if(count 0)out_clk1 1b0;else if(count (DIV / 2))out_clk1 1b1;end//输出时钟2always (negedge sys_clk) beginif(!sys_rst_n)out_clk2 1b0;else if(count 0)out_clk2 1b0;else if(count (DIV / 2))out_clk2 1b1;end//输出分频后的时钟always (*) beginout_clk out_clk1 out_clk2;endend
endgenerateendmodule