FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-所有问题-其他-正文

Verilog笔试常考题:如何设计一个时钟分频电路?产生占空比50%的奇偶分频有什么不同?

嵌入式入门生小陈嵌入式入门生小陈
其他
2天前
0
0
7
准备数字IC/FPGA笔试,发现时钟分频是必考题。我能写出简单的偶数分频代码,但遇到要求产生占空比50%的奇数分频(比如5分频)就有点懵。网上查的方法五花八门,有的用双边沿,有的用组合逻辑。想请教一个清晰、可靠且面试官喜欢的实现思路,最好能附上关键代码和仿真波形图说明。另外,这种题在面试中通常会怎么深入问?
嵌入式入门生小陈

嵌入式入门生小陈

这家伙真懒,几个字都不愿写!
227800
分享:
国产EDA工具现在发展到什么水平了?学习使用对求职有帮助吗?上一篇
芯片行业最近裁员消息频出,现在学FPGA/IC还有前途吗?会不会很快饱和?下一篇
回答列表总数:6
  • EE学生一枚

    EE学生一枚

    我笔试时就栽在这题上,后来搞懂了。核心是:奇数分频要想50%占空比,必须利用原时钟的双边沿信息,但最终输出不能真的用双边沿触发器去采,而是用两个单边沿产生的信号做逻辑组合。给你个5分频的参考代码思路,面试写这个一般没问题:

    reg [2:0] cnt;
    reg clk_p, clk_n;

    always @(posedge clk or negedge rst_n) begin
    if (!rst_n) cnt <= 0;
    else if (cnt == 4) cnt <= 0;
    else cnt <= cnt + 1;
    end

    always @(posedge clk or negedge rst_n) begin
    if (!rst_n) clk_p <= 0;
    else if (cnt == 0) clk_p <= 1;
    else if (cnt == 2) clk_p <= 0;
    end

    always @(negedge clk or negedge rst_n) begin
    if (!rst_n) clk_n <= 0;
    else if (cnt == 0) clk_n <= 1;
    else if (cnt == 2) clk_n <= 0;
    end

    assign clk_out = clk_p | clk_n; // 或者 clk_p & clk_n,取决于你的相位设计

    这样clk_p和clk_n都是占空比2:3(高电平2周期),但相位差半个原时钟周期。相或后,高电平部分就补上了,变成5周期内高电平持续2.5个周期,达到50%。仿真波形一看就非常直观。面试深入可能会让你对比各种方法的优缺点,或者问如果不用下降沿触发的寄存器,只用上升沿加组合逻辑怎么做(那就要仔细处理毛刺了)。

    2天前
  • 码电路的阿明

    码电路的阿明

    偶数分频最简单,计数器数到一半翻转就行,比如6分频就数0-2翻转一次,3-5再翻转一次,占空比自然50%。奇数分频要50%占空比就麻烦点,因为一个周期内高低电平时间不可能整数个时钟周期对半分。常见思路是用两个中间信号,一个在上升沿操作,一个在下降沿操作,然后把它们组合起来。比如5分频,可以先用计数器在上升沿生成一个占空比2:3的信号A,再在下降沿生成一个同样2:3的信号B,最后A和B相或(或者与,看相位)就能得到50%占空比的5分频时钟。关键是要对齐好相位。代码网上很多,自己仿真一下波形就明白了。面试官可能会问为什么不用双边沿触发器(因为实际芯片里通常没有真正的双边沿触发器,或者时序难保证),或者让你分析一下组合逻辑产生的分频时钟的毛刺问题。

    2天前
  • 数字系统初学者

    数字系统初学者

    笔试常考这个是因为它综合了计数器、边沿检测和组合逻辑。我推荐一种清晰写法:对于奇数N分频(如5分频),定义两个寄存器clk_pos和clk_neg,分别用上升沿和下降沿触发。两个计数器都数0到N-1,但分别在计数值为(N-1)/2和N-1时翻转clk_pos,在计数值为(N-1)/2和N-1时翻转clk_neg(注意clk_neg用下降沿采样)。这样clk_pos和clk_neg的上升沿就差半个原时钟周期。最终输出clk_out = clk_pos & clk_neg(如果初始相位合适,也可能是clk_pos | clk_neg,看波形决定)。仿真波形一定要画,能清晰看到两个中间时钟和最终时钟的相位关系。面试深入可能会问亚稳态(如果分频时钟用作其他模块时钟)、毛刺(组合逻辑产生时钟的毛刺风险)、以及能否用PLL替代。记住,解释思路比死记代码更重要。

    2天前
  • Verilog新手笔记

    Verilog新手笔记

    偶数分频最简单,计数器数到一半翻转就行。比如6分频,计数器0-2输出高,3-5输出低,占空比就是50%。奇数分频要麻烦点,核心思路是用两个相位差180度的时钟进行组合。以5分频为例:先用时钟上升沿生成一个周期5个原时钟周期、高电平2个周期、低电平3个周期的时钟A;再用时钟下降沿生成一个与A波形相同但相位差半个原时钟周期的时钟B;最后把A和B相与(或相或,取决于你的电平设计),就能得到一个占空比50%的5分频时钟。面试官可能会让你手画一下波形,或者问为什么不能用单边沿直接生成50%占空比(因为5是奇数,没法被2整除,高电平时间不会是整数个原周期)。代码的话,网上很多,关键是把两个中间时钟的生成和组合逻辑写清楚。

    2天前
  • 芯片设计入门

    芯片设计入门

    笔试常考这个,我当初也被问过。偶数分频确实简单,奇数分频想要50%占空比,网上常见两种方法:一种是双边沿采样法(就是我上面说的),另一种是状态机法。我个人觉得双边沿法代码更简洁,也容易讲清楚原理。

    给个关键代码片段吧(以5分频为例):

    reg [2:0] cnt;
    reg clk_pos, clk_neg;
    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) cnt <= 0;
    else cnt <= (cnt==4) ? 0 : cnt+1;
    end

    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) clk_pos <= 0;
    else clk_pos <= (cnt < 3); // 比如0,1,2时为高
    end

    always @(negedge clk or negedge rst_n) begin
    if(!rst_n) clk_neg <= 0;
    else clk_neg <= (cnt < 3); // 下降沿采样同样的条件
    end

    assign clk_out = clk_pos | clk_neg;

    这样clk_out的高电平宽度就是2.5个原时钟周期,低电平也是2.5个,占空比50%。仿真波形你会看到clk_pos和clk_neg是错开半个周期的方波,相或后正好补成对称的5分频时钟。

    面试深入可能会问亚稳态、时钟域、以及能否不用下降沿触发(有些工艺库不支持)。这时可以提用原时钟生成使能脉冲,在全局时钟域下用使能信号控制数据传递,这才是更稳健的同步设计思路。

    2天前
  • 硅农养成计划

    硅农养成计划

    偶数分频最简单,计数器数到一半翻转就行。比如6分频,计数器0-2输出高,3-5输出低,占空比自然50%。奇数分频(比如5分频)要50%占空比,就得花点心思了。核心思路是:用两个中间信号,分别在时钟上升沿和下降沿生成,然后把它们组合起来。

    具体来说,你可以用一个计数器,在上升沿计数0-4循环。然后定义两个信号clk1和clk2。clk1在计数器小于某个值时拉高(比如小于2.5,即小于3),但这个判断和赋值在上升沿做。clk2的逻辑和clk1一样,但它在时钟下降沿触发(用always @(negedge clk))。最后,把clk1和clk2相或(assign clk_out = clk1 | clk2),得到的就是占空比50%的5分频时钟。

    面试官可能会追问:为什么用两个信号?只用上升沿计数行不行?这时你要解释,奇数分频要对称,必须利用双边沿的信息。还可能问组合逻辑产生时钟的毛刺问题,以及在实际设计中这种分频时钟应该怎么用(通常不建议直接用作时钟,而是作为使能信号,用全局时钟打拍)。

    2天前
我要回答answer.notCanPublish
回答被采纳奖励100个积分
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
请先登录