【数字IC/FPGA】占空比50%任意整数分频
IC 数字 FPGA 整数 任意 50%
2023-09-14 09:10:02 时间
在之前的一篇博客中,我们讨论了如何实现偶数分频和奇数分频,但是并没有考虑占空比是否为50%,本文的目标是实现任意整数分频,且占空比为50%。
具体的方法如下:
偶数分频时
设计一个计数器,从0计到N-1,然后又回到0,信号在计数器等于N/2-1(=(N-1)/2)和N-1的时候翻转。该信号即为占空比为50%的分频时钟。
奇数分频时
设计两个计数器cnt_p和cnt_n,分别在时钟的上升沿和下降沿改变,并且计数范围为0-N-1,同时设计两个信号clk_p和clk_n,clk_p在时钟上升沿改变,clk_n在下降沿改变,当计数器cnt_p的值为(N-1)/2和N-1时,clk_p信号翻转,clk_n同理。另外一个参数为CLK_PHASE,即复位时clk_p和clk_n信号的电平,在本文中,当CLK_PHASE为1时,clk_p和clk_n复位时为高电平,否则复位时为低电平。为了生成占空比为50%的时钟输出,我们有:
当CLK_PHASE为1时,clkdiv_out=clk_p&clk_n;
当CLK_PHASE为0时,clkdiv_out=clk_p|clk_n;
代码实现
module div #(
parameter DIV_NUM = 11,
parameter CLK_PHASE =1
)(
input logic clk,
input logic rst_n,
output logic clkdiv
);
logic clk_p;
logic clk_n;
logic [31:0] cnt_p;
logic [31:0] cnt_n;
//cnt_p
always_ff@(posedge clk,negedge rst_n)
if(~rst_n)
cnt_p<=0;
else if(cnt_p==DIV_NUM-1)
cnt_p<=0;
else
cnt_p<=cnt_p+1;
//cnt_n
always_ff@(negedge clk,negedge rst_n)
if(~rst_n)
cnt_n<=0;
else if(cnt_n==DIV_NUM-1)
cnt_n<=0;
else
cnt_n<=cnt_n+1;
//clk_p
always_ff@(posedge clk,negedge rst_n)
if(~rst_n)
clk_p<=CLK_PHASE;
else if(cnt_p==DIV_NUM-1||cnt_p==(DIV_NUM-1)/2)
clk_p<=~clk_p;
//clk_n
always_ff@(negedge clk,negedge rst_n)
if(~rst_n)
clk_n<=CLK_PHASE;
else if(cnt_n==DIV_NUM-1||cnt_n==(DIV_NUM-1)/2)
clk_n<=~clk_n;
//
assign clkdiv_or=clk_p|clk_n;
assign clkdiv_and=clk_p&clk_n;
//
always_comb
if(DIV_NUM%2==1) //奇数分频
if(CLK_PHASE==1)
clkdiv=clkdiv_and;
else
clkdiv=clkdiv_or;
else
clkdiv=clk_p; //偶数分频
endmodule
仿真波形:
CASE1:偶数倍分频
CASE2:奇数倍分频,且时钟复位时为低
CASE3:奇数倍分频,且复位时时钟为高电平
测试平台代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/18 21:45:51
// Design Name:
// Module Name: test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module test;
logic clk;
logic rst_n;
logic clkdiv;
//
initial begin
clk=0;
forever begin
#5 clk=~clk;
end
end
//
initial
begin
rst_n=0;
#50
rst_n=1;
end
//
div #(
.DIV_NUM(17),
.CLK_PHASE(1)
)U
(.*
//input logic clk,
//input logic rst_n,
//output logic clk_out1,
//output logic clk_out2
);
endmodule
相关文章
- CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init、ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录
- CV之IC:Image Caption图像描述算法的相关论文、设计思路、关键步骤相关配图之详细攻略
- 基础知识~ 锁相环 PLL、同步时钟 、同步电路/异步电路、FPGA、IC、关键路径
- 【FPGA/数字IC】UART、IIC和SPI总线介绍
- 数字IC手撕代码--投票表决器
- 【数字IC/FPGA】检测最后一个匹配序列的位置
- 数字IC/FPGA相关内容汇总
- 【数字IC/FPGA】移位相加乘法器
- 【数字IC/FPGA】电平同步、脉冲同步、边沿同步
- FPGA与数字IC求职知识准备 - 数字电路知识总结
- 数字IC手撕代码--乐鑫科技(次小值与次小值出现的次数)
- 数字IC手撕代码-XX公司笔试真题(数据流最大值)
- 数字IC手撕代码-双端口RAM(dual-port-RAM)
- 数字IC手撕代码-乐鑫科技笔试真题(4倍频)
- 数字IC手撕代码-有限状态机FSM-饮料机
- 数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)
- 数字IC手撕代码-半加器、全加器
- 数字IC手撕代码-分频器(任意小数分频)
- 【数字IC/FPGA】数据累加输出
- 【数字IC/FPGA】Wallace乘法器
- 【数字IC/FPGA】任意深度异步FIFO的设计