|
发表于 2012-11-7 23:49:11
|
显示全部楼层
回复 1# zzj0329
- module div_2e128(clk,
- rst_n,
- clk_div2e128
- );
- input clk;
- input rst_n;
- output clk_div2e128;
- //wire cnt_en0,cnt_en1,cnt_en2,cnt_en3,cnt_en4,cnt_en5,cnt_en6,cnt_en7;
- wire cnt_en0;
- wire cnt_tick0,cnt_tick1,cnt_tick2,cnt_tick3,cnt_tick4,cnt_tick5,cnt_tick6;
- reg clk_div2e128;
- reg [2:0] cnt;
- assign cnt_en0=1'b1;
- //2^8分频
- u0 div256(.clk (clk),
- .rst_n (rst_n),
- .cnt_en (cnt_en0),
- .cnt_tick (cnt_tick0)
- );
- //2^8分频
- u1 div256(.clk (clk),
- .rst_n (rst_n),
- .cnt_en (cnt_tick0),
- .cnt_tick (cnt_tick1)
- );
- //2^4分频
- always @(posedge clk,negedge rst_n)
- if(!rst_n)
- cnt <= 3'd0;
- else if(cnt_tick1)
- cnt <= cnt+1'b1;
- always @(posedge clk,negedge rst_n)
- if(!rst_n)
- clk_div2e128 <= 1'b0;
- else if(((cnt==3'd2)||(cnt==3'd0))&&cnt_tick1)
- clk_div2e128 <= ~clk_div2e128;
-
- endmodule
- module div256(clk,
- rst_n,
- cnt_en,
- cnt_tick
- );
- input clk;
- input rst_n;
- input cnt_en;
- output cnt_tick;
- reg cnt_tick;
- reg [7:0] cnt;
- always @(posedge clk,negedge rst_n)
- if(!rst_n)
- cnt <= 8'd0;
- else if(cnt_en)
- cnt <= cnt+1'b1;
-
- always @(posedge clk,negedge rst_n)
- if(!rst_n)
- cnt_tick <= 1'b0;
- else if((cnt==255)&&cnt_en)
- cnt_tick <= 1'b1;
- else
- cnt_tick <= 1'b0;
- endmodule
复制代码 div_2e128实现了一个(2^8)*(2^8)*(2^4)=2^20的分频,占空比为25%
你可以用类似的方式实现一个2^128的分频....
基本思想是使用时钟使能的方式来实现,通过多个时钟使能分频的流水线叠加,最后采用分频后得到的时钟使能信号进行占空比的分配以及最后一级的分频。
太晚了,就没写注释了,有什么疑问再交流哈 |
|