求高倍率分频的设计思路
时间:10-02
整理:3721RD
点击:
最近找工作,笔试时碰到了个奇怪的问题,原题意思如下
设计一个2的128次方分频器,占空比25%,要求用到pipeline
PS:不是128分频,而是2exp(128)分频
我直接傻掉了,各位大侠可有好的方案,麻烦给个思路或者直接给出verilog吧,万分感激!虽然那次应聘黄掉了,我还是想知道答案,好奇害死猫啊 。
你可以用类似的方式实现一个2^128的分频....
基本思想是使用时钟使能的方式来实现,通过多个时钟使能分频的流水线叠加,最后采用分频后得到的时钟使能信号进行占空比的分配以及最后一级的分频。
太晚了,就没写注释了,有什么疑问再交流哈
设计一个2的128次方分频器,占空比25%,要求用到pipeline
PS:不是128分频,而是2exp(128)分频
我直接傻掉了,各位大侠可有好的方案,麻烦给个思路或者直接给出verilog吧,万分感激!虽然那次应聘黄掉了,我还是想知道答案,好奇害死猫啊 。
- 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
你可以用类似的方式实现一个2^128的分频....
基本思想是使用时钟使能的方式来实现,通过多个时钟使能分频的流水线叠加,最后采用分频后得到的时钟使能信号进行占空比的分配以及最后一级的分频。
太晚了,就没写注释了,有什么疑问再交流哈
非常感谢,已经弄明白了整个思路
按你上诉所说的,用15个256分频的级联(前级的输出为后级的使能输入),再最后接一个2^8分频的1/4占空比的分频器,同样使能端接前级的输出,这样就能得到(2^8)^15*(2^8)=2exp(8*16)=2^128的分频器了
