FPGA奇数分频偶数分频的分析记录

it2023-05-18  77

偶数分频代码,参数化设计,这里的偶数分频只使用了一个计数器,通过计数在分频后的前半个周期和后半个周期电平去反之后就得到了一个偶数分频模块,这个代码的移植性应该很强。

module odd_div( input i_sys_clk , input i_sys_rst , output div_clk ); reg div_clk_reg = 1'b0 ; reg [3:0] div_cnt = 4'd0 ; parameter NUM_DIV = 6 ;//六分频为偶数分频 assign div_clk = div_clk_reg ; always @ (posedge i_sys_clk or negedge i_sys_rst) begin if(i_sys_rst) begin div_clk_reg <= 1'b0 ; div_cnt <= 4'd0 ; end else if(div_cnt < (NUM_DIV/2-1)) begin div_clk_reg <= div_clk_reg ; div_cnt <= div_cnt + 4'd1 ; end else begin div_clk_reg <= ~div_clk_reg ; div_cnt <= 4'd0 ; end end endmodule

再记录一下奇数分频,奇数分频和偶数分频稍微有一点区别,奇数分频这里使用了两个计数器,这两个计数器分别控制两个高低电平,得到不同的高低电平之后然后再进行或运算之后就会得到一个奇数分频的效果,话不多说直接上代码。

module even_div( input i_sys_clk , //输入系统时钟 input i_sys_rst , //输入系统复位 output clk_div //输出奇数分频 ); parameter NUM_DIV = 7 ; //分频系数 reg [2:0] cnt1 = 3'd0 ; //计数器 reg [2:0] cnt2 = 3'd0 ; reg clk_div1 = 1'b0 ; reg clk_div2 = 1'b0 ; always @(posedge i_sys_clk or posedge i_sys_rst) begin if(i_sys_rst) begin cnt1 <= 0 ; end else if(cnt1 < NUM_DIV - 1) //如果计数小于6,计数器+1. begin cnt1 <= cnt1 + 1'b1 ; end else begin cnt1 <= 0 ; end end always @(posedge i_sys_clk or posedge i_sys_rst) begin if(i_sys_rst) begin clk_div1 <= 1'b0; end else if(cnt1 < NUM_DIV / 2) begin clk_div1 <= 1'b1; end else begin clk_div1 <= 1'b0; end end always @(negedge i_sys_clk or posedge i_sys_rst) begin if(i_sys_rst) begin cnt2 <= 0; end else if(cnt2 < NUM_DIV - 1) begin cnt2 <= cnt2 + 1'b1; end else begin cnt2 <= 0; end end always @(negedge i_sys_clk or posedge i_sys_rst) begin if(i_sys_rst) begin clk_div2 <= 1'b0; end else if(cnt2 < NUM_DIV / 2) begin clk_div2 <= 1'b1; end else begin clk_div2 <= 1'b0; end end assign clk_div = clk_div1 | clk_div2; endmodule

以上就是奇数和偶数分频模块的代码,再记录一下他们的分频之后的波形图 偶数分频之后的波形图 奇数分频波形图 奇数偶数分频就记录到这里。

最新回复(0)