题解 | #占空比50%的奇数分频#
占空比50%的奇数分频
https://www.nowcoder.com/practice/ccfba5e5785f4b3f9d7ac19ab13d6b31
//这个题是奇数分频,单计数器无法完成,所以要双计数器,,cnt1和cnt2 //对应几分频就用多少的计数器,比如7分频就用从0-6的计数器,clk_out1和clk_out2的高低电平比为(N/2):(N/2)+1,所以在本题中比为3:4,其实本来实现7分频是很简单的,在仿真软件中早就实现了,但是要和题目中的波形对应,必须clk_in的下降沿和clk_out_7的上升沿对应,花了一上午才解决 `timescale 1ns/1ns module odo_div_or ( input wire rst , input wire clk_in, output wire clk_out7 ); reg [2:0] cnt_1,cnt_2; reg clk_out_1,clk_out_2; always @(negedge clk_in or posedge rst)begin if(~rst)begin cnt_1 <= 3'b0; end else if(cnt_1==6) cnt_1 <= 3'b0; else cnt_1 <= cnt_1+1; end always @(posedge clk_in or posedge rst)begin if(~rst)begin cnt_2 <= 3'b0; end else if(cnt_2==6) cnt_2 <= 3'b0; else cnt_2 <= cnt_2+1; end always @(negedge clk_in or posedge rst)begin if(~rst)begin clk_out_1 <= 1'b0; end else if(cnt_1==3) clk_out_1 <= 1'b1; else if(cnt_1==6) clk_out_1 <= 1'b0; else clk_out_1 <= clk_out_1; end always @(posedge clk_in or posedge rst)begin if(~rst)begin clk_out_2 <= 1'b0; end else if(cnt_2==4) clk_out_2 <= 1'b1; else if(cnt_2==0) clk_out_2 <= 1'b0; else clk_out_2 <= clk_out_2; end //clk_out_2要比1慢一拍,不能早一拍,不然clk_out_7的上升沿对应不到clk_in的下降沿,就是在这里花了很多时间 assign clk_out7 = (~rst)?0:(clk_out_2|clk_out_1); //这边这样判断一下主要是clk_out_2是下降沿触发,在下降沿触发之前有半拍没有值,所以在没有值的时候让clk_out7置0 /* always @(posedge clk_in or negedge rst)begin if((~rst))begin clk_out_tmp <= 3'b0; end else if(cnt == 6) clk_out_tmp <= ~clk_out_tmp; end assign clk_out7 = clk_out_tmp; */ //*************code***********// endmodule