FPGA学习笔记整理_1_时钟分频
FPGA学习笔记整理_1_时钟分频
1. 偶数时钟分频
时钟偶数分频的关键就是计数器。
以四分频时钟为例:四分频时钟就是把原来的四个时钟周期变成一个时钟周期。也就是说,两个时钟周期作为低电平,两个时钟周期作为高电平。
1.1时序图如下:

1.2代码如下:
module div_clk_4( input wire clk, input wire rst, output reg clk_4 ); //div counter reg [1:0] div_cnt; always @(posedge clk) begin if (rst == 1'b1) begin//高电平的时候复位,xilinx官方提倡的,低电平的时候有效,进行工作 // reset div_cnt <= 2'b0; end else if(div_cnt == 2'd3)begin div_cnt <= 'd0; end else begin div_cnt <= div_cnt + 1'b1; end end always @(posedge clk) begin if (rst == 1'b1) begin clk_4 <= 1'b0; end else if (div_cnt == 1) begin clk_4 <= 1'b1; end else if(div_cnt == 3)begin clk_4 <= 1'b0; end end endmodule
1.3仿真波形图如下:

2.计数分频
以五分频为例:
奇数分频的问题在于将原来的五个时钟周期作为新时钟的一个时钟周期,那么新时钟的高低电平各是2.5个原来的周期,无法直接用计数器计数形成。
那么其中一个解决办法就是产生两个 占空比不是50%的时钟,并且这两个时钟之间有错位,然后将两个时钟进行与并等操作产生50%占空比的五分频时钟。
2.1时序图如下:

图中pos_clk 和 neg_clk分别是clk上升沿和下降沿为敏感边沿作为触发,产生的两个错位的时钟,由于是五分频,这两个错位的时钟的占空比不是50%,
二者相与,就会产生占空比是50%的五分频时钟。
2.2代码如下:
module div_clk_5( input wire clk, input wire rst, output wire clk_5 ); reg[2:0]cnt_clk_pos; reg[2:0]cnt_clk_neg; reg clk_pos,clk_neg; always @(posedge clk) begin if (rst) begin // reset cnt_clk_pos <= 3'b0; end else if (cnt_clk_pos == 3'd4) begin cnt_clk_pos <= 'b0; end else begin cnt_clk_pos <= cnt_clk_pos + 1; end end always @(negedge clk) begin if (rst) begin // reset cnt_clk_neg <= 3'b0; end else if (cnt_clk_neg == 3'd4) begin cnt_clk_neg <= 'b0; end else begin cnt_clk_neg <= cnt_clk_neg + 1; end end always @(posedge clk) begin if (rst) begin // reset clk_pos <= 'b0; end else if (cnt_clk_pos == 'b0) begin clk_pos <= 1'b1; end else if (cnt_clk_pos == 'd3) begin clk_pos <= 1'b0; end end always @(negedge clk) begin if (rst) begin // reset clk_neg <= 1'b0; end else if (cnt_clk_neg == 'b0) begin clk_neg <= 1'b1; end else if (cnt_clk_neg == 'd3) begin clk_neg <= 1'b0; end end assign clk_5 = clk_pos && clk_neg; endmodule
2.3 仿真波形图如下:

浙公网安备 33010602011771号