原创 培训四内容(第一部分-分频计数器)

2011-7-25 20:13 1434 7 7 分类: FPGA/CPLD

一.分频器

1.奇数分频(5分频):

改下代码如下:

  1. </p>
  2. <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>
  3. <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条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条