← 2022 · MPS芯源 笔试

推荐答案 测试一下

Please code the divider by 3 with Verilog(50% duty cycle).用Verilog设计一个3分频器,要求50%占空比。

编程题 中等 笔试真题

参考答案

对于三分频且要求50%占空比,由于时钟周期为奇数,无法通过单边沿计数直接得到1.5个时钟周期的脉冲。常用方法:生成两个相位差半个时钟周期的非50%占空比的三分频信号,然后相或。具体实现:设计一个模3计数器cnt(0~2),在时钟上升沿触发。当cnt==0时,信号clk_p翻转;当cnt==1时,clk_p再次翻转,这样clk_p在0和1两个计数周期内为高,共2个时钟周期,占空比66.7%。同时,用时钟下降沿采样同一计数器或独立计数器,产生clk_n:当cnt==0(下降沿)时clk_n翻转,当cnt==1时clk_n再次翻转,此时clk_n的高电平长度也是2个时钟周期,但相位相对于clk_p偏移了半个时钟周期。最后,将clk_p与clk_n相或,得到占空比50%的三分频信号。Verilog代码如下: module div3( input clk, input rst_n, output reg clk_out ); reg [1:0] cnt; reg clk_p, clk_n; // 上升沿计数器 always @(posedge clk or negedge rst_n) begin if (!rst_n) cnt <= 2'b0; else if (cnt == 2'd2) cnt <= 2'b0; else cnt <= cnt + 1'b1; end // 上升沿生成clk_p always @(posedge clk or negedge rst_n) begin if (!rst_n) clk_p <= 1'b0; else if (cnt == 2'd0) clk_p <= ~clk_p; else if (cnt == 2'd1) clk_p <= ~clk_p; end // 下降沿生成clk_n always @(negedge clk or negedge rst_n) begin if (!rst_n) clk_n <= 1'b0; else if (cnt == 2'd0) clk_n <= ~clk_n; else if (cnt == 2'd1) clk_n <= ~clk_n; end // 组合逻辑输出 always @(*) begin clk_out = clk_p | clk_n; end endmodule 上述代码中,cnt在上升沿从0计到2,clk_p在cnt==0和cnt==1时翻转,因此clk_p的周期为3个clk,高电平占2个clk。clk_n在下降沿检测同一cnt,在cnt==0和cnt==1时翻转,与clk_p相位差半个周期。两者相或后,高电平恰好为1.5个clk。注意:clk_out使用组合逻辑输出,避免额外延迟。易错点:必须使用双边沿触发来生成两个信号,且计数器由上升沿统一管理,确保相位关系正确。

涉及知识点

  • 奇数分频器设计方法
  • 双边沿触发与占空比控制
  • Verilog时序逻辑与组合逻辑
  • 非50%占空比信号相或实现50%占空比
  • 计数器模值设置与复位
登录后反馈错题
下一题 →