一.分频器
1.奇数分频(5分频):
改下代码如下:
- </p>
- <p>//5分频<br />module div5_out(<br />input clk,<br />input rst_n,<br />output div5_out,<br />output divout<br />);<br />wire clk20m,clk100m;<br />pll1 pll1(<br />.inclk0(clk),<br />.c0(clk20m),<br />.c1(clk100m)<br />);<br />//上升沿计数(N-1)/2 ,翻转,下降沿相同,最后相或<br />reg [2:0] cnt1;<br />reg [2:0] cnt2;<br />reg clk_up,clk_dn;<br />always @(posedge clk20m,negedge rst_n)<br /><br />if(!rst_n)<br />begin<br />clk_up<=1'b0; <br />cnt1<=3'b0;<br />end<br />else begin<br />cnt1<=cnt1+1'b1;<br /><br />if(cnt1==3'b001) clk_up<=~clk_up;//计数满2<br /><br />if(cnt1<=3'b100) <br />clk_up<=~clk_up;<br />cnt1<=3'b000;<br /><br />end<br /><br /> // if(cnt1==3'b100) cnt1<=3'b0;<br /><br />always @(posedge clk20m,negedge rst_n)<br /><br />if(!rst_n)<br />begin<br />clk_dn<=1'b0; <br />cnt2<=3'b0;<br />end<br />else begin<br />cnt2<=cnt2+1'b1;<br /><br />if(cnt2==3'b001) clk_dn<=~clk_dn;//计数满2<br /><br />if(cnt2<=3'b100) <br /><br />clk_dn<=~clk_dn;<br />cnt2<=3'b000;<br /><br />end<br /><br />assign div5_out = clk_up | clk_dn;<br />assign divout = clk20m;<br /><br />endmodule<br /><br /></p>
- <p>
总结1:
A.奇数分频:上升沿 clk_up 计数满N/2-1翻转,计数到N-1时,再翻转
下降沿 clk_dn 同上 ,最后,两个相或
B.begin end的应用
C.分频时,要给分频赋初值,否者可能报错(这点和VHDL不同):
if(!rst_n)
begin
clk_up<=1'b0;
cnt1<=3'b0;
end
2.偶数分频(8分频):
代码如下:
<code>
//20m 8分频
module div8(
input clk,
input rst_n,
output div8_out
);
wire clk20m;
//pll模块
pll1 pll1(
.inclk0(clk),
.c0(clk20m)
);
// (n/2)-1 翻转
reg [1:0] cnt;
reg clk25m;
always @(posedge clk20m or negedge rst_n)
if(!rst_n) cnt<=2'd0;
else if(cnt==2'd3)begin//大于1的赋值语句,所以要用begin。。。end
cnt<=2'd0;
clk25m <= ~clk25m;
end
else
cnt<=cnt+1'b1;
assign div8_out = clk25m;
endmodule
</code>
总结2:
A.需要注意的同奇数分频(初值和begin。。end)
B。偶数分频,计数到N/2-1时翻转(和奇数分频一样,从0开始计数)
文章评论(0条评论)
登录后参与讨论