【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)

芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球
四社区联合力荐!近500篇数字IC精品文章收录
【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍

在这里插入图片描述

一、前言

本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:
1.奇数分频
2.偶数分频
3.半整数分批
4.小数/分数分频
5.序列检测器
6.模三检测器
7.饮料机
8.异步复位,同步释放
9.边沿检测(上升沿,下降沿,双边沿)
10.全加器,半加器
11.格雷码转二进制
12.单bit跨时钟域(打两拍,边沿同步,脉冲同步)
13.奇偶校验
14.伪随机数生成器[线性反馈移位寄存器]
15.同步FIFO
16.无毛刺时钟切换电路

应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练
链接如下
HDLBits — Verilog Practice

二、奇数分频电路题目

1.实现三分频电路,不需要满足50%占空比。
2.实现五分频电路,不需要满足50%占空比。
3.实现任意奇数分频,不需要满足50%占空比。
4.实现奇数分频,需要满足占空比50%。

三、奇数分频电路原理

3.1 不需要满足50%占空比的分频电路

以题目一为例 画出本题目的时序图,如图,可以发现,假如Clock是输入的时钟信号,Clock2是输出的50%占空比的三分频信号,那么对于计数器,Clock2实现的操作是:当采样边沿每次遇到count=0的时候进行翻转,每次遇到1的时候再次完成翻转,根据此,加上复位信号,我们即可完成RTL代码。
在这里插入图片描述

3.2 需要满足50%占空比的分频电路

以实现50%占空比的题目一为例 画出本题目所需的时序图,如图,可以发现,假如Clock是输入的时钟信号,logic_or是输出的50%占空比的三分频信号,那么我们需要两个计数器,一个上升沿计数器,一个下降沿计数器,计数的最大值都是2,对待这两个计数器,我们可以执行相同的操作:即在边沿采样的时候如果发现计数器的值是1或者2,那么则翻转信号clk2,体现在posedge_clk2和negedge_clk2上,这两个信号取”相或“操作,得到logic_or就是50%占空比的分频电路
在这里插入图片描述

四、非50%占空比的三分频电路

4.1 RTL设计

module f3(clk, rst_n,clk2);

input clk;
input rst_n;
output clk2;

reg       clk2_r;
assign    clk2 = clk2_r;

reg [2:0] count;
parameter N = 3;


always@(posedge clk or negedge rst_n)
begin
if(!rst_n || count == N-1)
count <= 3'd0;
else
count <= count +1'd1;
end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
clk2_r <= 3'd0;
else if (count == 3'd0 || count == 3'd1)
clk2_r <= !clk2_r;
else
clk2_r <= clk2_r;
end
endmodule

这里只需要修改N的值,即可改变分频,如N=5,同时改变count的位宽,即可实现五分频,以此类推,即可实现不要求占空比的任意分频电路

除了使用计数器去完成奇数分频操作,我们也可以使用状态机去来实现三分频电路
定义三个状态,状态1和2,clk的输出为0,状态3,clk的输出为1,也可以同样的实现三分频电路,以此类推,实现五分频电路和奇数分频电路。

4.2 Testbench

`timescale 1ns/1ps
module f3_tb();
reg clk;
reg rst_n;
wire clk2;

f3 u1(.clk(clk),.rst_n(rst_n),.clk2(clk2));

always
#5 clk = ~clk;

initial
begin
clk = 0;
rst_n = 1;
#15
rst_n = 0;
#30
rst_n = 1;
#100
$stop;
end
endmodule

4.3 仿真波形

在这里插入图片描述

仿真结果分析
可以发现,在复位信号到来后,输出的初值出现,同时每当count=1和0时,output信号反转,三分频电路成功实现。

五、50%占空比的奇数分频电路(以三分频为例)

5.1 RTL设计

module f3(clk, rst_n,clk2);

input clk;
input rst_n;
output clk2;


reg [2:0] negedge_count;
reg [2:0] posedge_count;
reg posedge_clk2;
reg negedge_clk2;
parameter N = 3;


always@(posedge clk or negedge rst_n)
begin
if(!rst_n || posedge_count == N-1)
posedge_count <= 3'd0;
else
posedge_count <= posedge_count +1'd1;
end


always@(negedge clk or negedge rst_n)
begin
if(!rst_n || negedge_count == N-1)
negedge_count <= 3'd0;
else
negedge_count <= negedge_count +1'd1;
end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
posedge_clk2 <= 3'd0;
else if (posedge_count == 3'd1 || posedge_count == 3'd0)
posedge_clk2 <= !posedge_clk2;
else
posedge_clk2 <= posedge_clk2;
end


always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
negedge_clk2 <= 3'd0;
else if (negedge_count == 3'd1 || negedge_count == 3'd0)
negedge_clk2 <= !negedge_clk2;
else
negedge_clk2 <= negedge_clk2;
end

assign clk2 = posedge_clk2 || negedge_clk2;

5.2 Testbench

`timescale 1ns/1ps
module f3_tb();
reg clk;
reg rst_n;
wire clk2;

f3 u1(.clk(clk),.rst_n(rst_n),.clk2(clk2));

always
#5 clk = ~clk;

initial
begin
clk = 0;
rst_n = 1;
#15
rst_n = 0;
#30
rst_n = 1;
#100
$stop;
end
endmodule

5.3 仿真波形

在这里插入图片描述

仿真结果分析
可以发现,在复位信号到来后,经最终的posedge与negedge_clk2相与后,最终实现了,50%占空比的三分频电路,若想将其扩展到7分频,9分频,只需要修改N和count的位数即可

  • 25
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Verilog中,实现奇数分频可以使用一些逻辑操作来实现。一种常见的方法是使用计数器和逻辑门来生成占空比为50%的分频时钟信号。具体的实现步骤如下: 1. 首先,定义一个计数器,用于计数时钟周期。计数器的位宽需要根据分频系数来确定,确保能够覆盖所需的分频范围。 2. 在每个时钟周期的上升沿,对计数器进行递增操作。 3. 当计数器的值等于分频系数的一半时,使用逻辑门将时钟信号翻转。常用的逻辑门有与门和或门。 4. 当计数器的值等于分频系数时,再次使用逻辑门将时钟信号翻转。 通过这样的逻辑操作,可以实现奇数分频并得到占空比为50%的分频时钟信号。具体的Verilog代码实现可以根据具体的分频系数和逻辑门选择进行调整。引用\[1\]和引用\[2\]中提供了一些关于奇数分频的具体实现方法和解释,可以作为参考。 #### 引用[.reference_title] - *1* [利用verilog语言实现奇数分频](https://blog.csdn.net/weixin_44633306/article/details/126356350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Verilog奇数分频(个人总结)](https://blog.csdn.net/weixin_44425619/article/details/115310456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张江打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值