题解 | #任意小数分频#
任意小数分频
https://www.nowcoder.com/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时钟切换点
parameter div_e = 5'd8; //偶数周期
parameter div_o = 5'd9; //奇数周期
//*************code***********//
reg [4:0]cnt_p;
reg [6:0]cnt;
reg clk;
assign clk_out=clk;
always@(posedge clk_in or negedge rst)
if(!rst)begin
clk<=0;
cnt_p<=0;
cnt<=0;
end else begin
if(cnt==M_N)begin
cnt<=1;
clk<=1;
end else if(cnt<M_N)cnt<=cnt+1'b1;
end
always@(posedge clk_in or negedge rst)
if(!rst)begin
clk<=0;
cnt_p<=0;
cnt<=0;
end else begin
if(cnt<c89)begin
if(cnt_p==(div_e>>1))begin
cnt_p<=cnt_p+1'b1;
clk<=0;
end else if(cnt_p==(div_e))begin
cnt_p<=1'b1;
clk<=1;
end else if(cnt_p<(div_e>>1))begin
cnt_p<=cnt_p+1'b1;
clk<=1;
end else if(cnt_p>(div_e>>1)&(cnt_p<div_e))begin
cnt_p<=cnt_p+1'b1;
clk<=0;
end
end if(cnt==c89)begin
cnt_p<=1'b1;
clk<=1;
end else if(cnt>c89)begin
if(cnt_p==((div_o-1'b1)>>1))begin
cnt_p<=cnt_p+1'b1;
clk<=0;
end else if(cnt_p==(div_o))begin
cnt_p<=1'b1;
clk<=1;
end else if(cnt_p<((div_o-1'b1)>>1))begin
cnt_p<=cnt_p+1'b1;
clk<=1;
end else if(cnt_p>((div_o-1'b1)>>1)&(cnt_p<div_o))begin
cnt_p<=cnt_p+1'b1;
clk<=0;
end
end
end
//*************code***********//
endmodule
查看3道真题和解析