推荐答案
测试一下
题目
使用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
- 组合逻辑