← 2022 · 小米 笔试

推荐答案 测试一下

使用Verilog编写三分频电路,输出为50%占空比(10分)

题目配图 题目配图
编程题 中等 笔试真题

参考答案

三分频电路要求输出时钟频率为输入时钟的 1/3,占空比为 50%。实现思路:利用输入时钟的上升沿和下降沿分别生成两个占空比非 50% 的中间信号,再通过逻辑组合得到 50% 占空比。具体 Verilog 代码: ```verilog module div3 ( input clk, input rst_n, output reg clk_out ); reg [1:0] cnt_pos; // 上升沿计数器 reg [1:0] cnt_neg; // 下降沿计数器 wire pos_flag, neg_flag; // 上升沿计数 always @(posedge clk or negedge rst_n) begin if (!rst_n) cnt_pos <= 2'd0; else if (cnt_pos == 2'd2) cnt_pos <= 2'd0; else cnt_pos <= cnt_pos + 1'b1; end // 下降沿计数 always @(negedge clk or negedge rst_n) begin if (!rst_n) cnt_neg <= 2'd0; else if (cnt_neg == 2'd2) cnt_neg <= 2'd0; else cnt_neg <= cnt_neg + 1'b1; end // 产生两个占空比 1/3 的信号(高电平持续一个周期) assign pos_flag = (cnt_pos == 2'd1); assign neg_flag = (cnt_neg == 2'd1); // 组合输出,上升沿和下降沿产生的脉冲相或得到 50% 占空比 always @(*) begin clk_out = pos_flag | neg_flag; end endmodule ``` 解析:上升沿计数器 cnt_pos 在 clk 上升沿计数,当值为 1 时 pos_flag 为高;下降沿计数器 cnt_neg 在 clk 下降沿计数,当值为 1 时 neg_flag 为高。两者均为周期为 3 个 clk 周期、高电平占 1 个 clk 周期的脉冲。组合逻辑将两脉冲相或,得到高电平持续 2 个 clk 周期(一个完整的三分频周期中,上升沿和下降沿脉冲相隔 1.5 个 clk 周期,相或后恰好覆盖 2 个 clk 周期),从而实现 50% 占空比。需注意复位信号对两个计数器的同步复位,以及避免组合逻辑产生毛刺(实际应用中可改用寄存器输出并打一拍)。 易错点: 1. 计数器从 0 到 2 循环,注意计数宽度为 2 位(3 状态),复位后归零。 2. 占空比 50% 要求中间脉冲的选取必须使或运算后高电平持续 2 个 clk 周期。通常选取计数器值为 1 时产生脉冲,因为这样上升沿和下降沿脉冲的间隔正好是 1.5 个 clk 周期,相或后高电平覆盖 2 个周期。若选其他值(如 0)则无法得到 50% 占空比。 3. 输出 clk_out 一般使用组合逻辑,但若对毛刺敏感可改用寄存器在 clk 上升沿打一拍,但会引入时钟沿偏移。面试中通常接受组合逻辑实现。

涉及知识点

  • Verilog
  • 时钟
  • verilog
  • 组合逻辑
← 上一题
登录后反馈错题