寫分頻就是寫計數器。
二分頻:指把頻率分成兩部分。比如50MHz的頻率,二分頻后就是25MHz。由公式T=1/f可知,時鍾變為原來的兩倍。
綜合代碼如下:
module shizhan(
input sys_clk,
input sys_rst_n,
output reg dri_clk
);
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
dri_clk<=1'b0;
else
dri_clk<=~dri_clk;
end
endmodule
tb代碼如下:
`timescale 1ns/1ns
module shizhan_tb;
reg sys_clk;
reg sys_rst_n;
wire dri_clk;
initial begin
sys_clk<=1'b0;
sys_rst_n<=1'b0;
#10 sys_rst_n<=1'b1;
end
always #10 sys_clk<=~sys_clk;
shizhan u_shizhan(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.dri_clk (dri_clk)
);
endmodule
實戰結果如下:
三分頻
綜合代碼如下:
module clk(
input sys_clk,
input sys_rst_n,
output dri_clk
);
reg [2:0]cnt;
reg dri_clk1;
reg dri_clk2;
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
cnt<=3'b0;
else if(cnt<2)
cnt<=cnt+1;
else
cnt<=3'b0;
end
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
dri_clk1<=1'b0;
end
else if(cnt==0)begin
dri_clk1<=~dri_clk1;
end
else if(cnt==1)begin
dri_clk1<=~dri_clk1;
end
else
dri_clk1<=dri_clk1;
end
always @(negedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
dri_clk2<=1'b0;
else
dri_clk2<=dri_clk1;
end
assign dri_clk=dri_clk1|dri_clk2;
endmodule
tb仿真代碼如下:(ps:這個仿真程序跟二分頻一樣的,就是名字改成了clk_tb)
`timescale 1ns/1ns
module clk_tb;
reg sys_clk;
reg sys_rst_n;
wire dri_clk;
initial begin
sys_clk<=1'b0;
sys_rst_n<=1'b0;
#10 sys_rst_n<=1'b1;
end
always #10 sys_clk<=~sys_clk;
clk u_clk(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.dri_clk (dri_clk)
);
endmodule
實戰結果:
同理,五分頻實現如下:
綜合代碼如下:
module clk(
input sys_clk,
input sys_rst_n,
output dri_clk
);
reg [2:0]cnt;
reg dri_clk1;
reg dri_clk2;
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
cnt<=3'b0;
else if(cnt<4)
cnt<=cnt+1;
else
cnt<=3'b0;
end
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
dri_clk1<=1'b0;
end
else if(cnt==2)begin
dri_clk1<=~dri_clk1;
end
else if(cnt==4)begin
dri_clk1<=~dri_clk1;
end
else
dri_clk1<=dri_clk1;
end
always @(negedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
dri_clk2<=1'b0;
else
dri_clk2<=dri_clk1;
end
assign dri_clk=dri_clk1|dri_clk2;
endmodule
仿真代碼同三分頻一樣。
實驗結果: