题解 | #占空比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

深信服公司福利 826人发布