题目描述
用Verilog设计一个3分频器,要求50%占空比。
解题思路
设计两个三分频时钟clk1和clk2,占空比分别为2/3和2/3,一个下降沿触发,一个上升沿触发,两个时钟相与得到占空比50%的三分频。
代码
module div_3_fre(
input clk ,
input rstn ,
output clk_out
);
reg [1:0] cnt1,cnt2;
reg clk1, clk2;
always @(posedge clk)begin
if(!rstn)begin
clk1 <= 1'b0;
end
else if(cnt1 == 2'd0 || cnt1 == 2'd2)
clk1 <= !clk1;
end
always @(posedge clk)begin
if(!rstn)begin
cnt1 <= 2'd0;
end
else if(cnt1 <= 2'd1)begin
cnt1 <= cnt1 + 1'b1;
end
else if(cnt1 == 2'd2)begin
cnt1 <= 2'd0;
end
end
always @(negedge clk)begin
if(!rstn)begin
clk2 <= 1'b0;
end
else if(cnt2 == 2'd0 || cnt2 == 2'd2)
clk2 <= !clk2;
end
always @(negedge clk)begin
if(!rstn)begin
cnt2 <= 2'd0;
end
else if(cnt2 <= 2'd1)begin
cnt2 <= cnt2 + 1'b1;
end
else if(cnt2 == 2'd2)begin
cnt2 <= 2'd0;
end
end
assign clk_out = clk1 & clk2;
endmodule
testbench
module div_3_fre_tb();
wire clk_out;
reg clk,rstn;
initial begin
rstn <= 1'b0;
clk <= 1'b0;
#20
rstn <= 1'b1;
#100
$finish();
end
initial begin
forever #5 clk <= !clk;
end
initial begin
$fsdbDumpfile("div_3.fsdb");
$fsdbDumpvars(0);
end
div_3_fre u_div_3_fre(
.clk (clk) ,
.rstn (rstn) ,
.clk_out (clk_out)
);
endmodule
波形
波形结果是一个占空比50%的三分频。
更多手撕代码题可以前往 数字IC手撕代码--题库