題解 | #任意小數(shù)分頻#
任意小數(shù)分頻
http://fangfengwang8.cn/practice/24c56c17ebb0472caf2693d5d965eabb
`timescale 1ns/1ns module div_M_N( input wire clk_in, input wire rst, output wire clk_out ); parameter M_N = 8'd87; parameter c89 = 8'd24; // 8/9時鐘切換點(diǎn) parameter div_e = 5'd8; //偶數(shù)周期 parameter div_o = 5'd9; //奇數(shù)周期 reg [7:0] cyc_cnt; reg [3:0] clk_cnt; reg flag_div ; // 8/9分頻標(biāo)志。當(dāng)div_flag==0 時是8分頻;當(dāng)div_flag==1時是9分頻; reg clk_out_r ; //*************code***********// // cyc_cnt: 對clk_in進(jìn)行計(jì)數(shù),達(dá)到M_N后清零。 always@(posedge clk_in or negedge rst)begin if(!rst) cyc_cnt<=0; else if(cyc_cnt==M_N-1) cyc_cnt<=0; else cyc_cnt<=cyc_cnt+1'b1; end // flag_div: 8/9分頻標(biāo)志。當(dāng)flag_div==0時是8分頻;當(dāng)flag_div==1時是9分頻。 cyc_cnt==M_N-1或者cyc_cnt==c89-1 時該標(biāo)志位翻轉(zhuǎn) always@(posedge clk_in or negedge rst)begin if(!rst) flag_div <=0; else if(cyc_cnt==M_N-1||cyc_cnt==c89-1) flag_div <=~flag_div ; else flag_div <= flag_div ; end // clk_cnt: 用于產(chǎn)生分頻輸出。當(dāng)flag_div==0時,計(jì)數(shù)最大值是div_e-1;當(dāng)flag_div==1時,計(jì)數(shù)最大值是div_o-1 // always@(posedge clk_in or negedge rst)begin // if(!rst) // clk_cnt<=0; // else if(~div_flag) // if(clk_cnt==div_e-1) // clk_cnt<=0; // else // clk_cnt<=clk_cnt+1'b1; // else if(clk_cnt==div_o-1) // clk_cnt<=0; // else // clk_cnt<=clk_cnt+1'b1; // end always@(posedge clk_in or negedge rst) begin if(~rst) clk_cnt <= 0; else if(~flag_div) clk_cnt <= clk_cnt==(div_e-1)? 0: clk_cnt+1; else clk_cnt <= clk_cnt==(div_o-1)? 0: clk_cnt+1; end // clk_out_r。根據(jù)clk_cnt和flag_div產(chǎn)生分頻輸出 always@(posedge clk_in or negedge rst) begin if(~rst) clk_out_r <= 0; else if(clk_cnt==0||clk_cnt==4) clk_out_r <= ~clk_out_r; else clk_out_r <= clk_out_r; end assign clk_out =clk_out_r; //*************code***********// endmodule