【数字IC/FPGA】占空比50%任意整数分频

在之前的一篇博客中,我们讨论了如何实现偶数分频和奇数分频,但是并没有考虑占空比是否为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

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
回答: 任意分数分频设计FPGA是一种在FPGA中实现任意频率分频设计方法。这种设计方法可以通过使用整数分频和小数分频的组合来实现。整数分频是指将输入时钟信号按照整数倍进行分频,而小数分频是指将输入时钟信号按照小数倍进行分频。通过合理选择整数分频系数和小数分频系数,可以实现对输入时钟信号进行任意频率的分频。\[1\]\[2\]在FPGA中,分频的思想非常重要,因此任意分数分频设计可以作为FPGA中的一个重要实验。通过这个实验,可以更好地理解和掌握分频的原理和方法。\[3\] #### 引用[.reference_title] - *1* *3* [FPGA实现任意分频 为所欲为——教你什么才是真正的任意分频](https://blog.csdn.net/lxm920714/article/details/103575820)[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^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [分频器——(任意分频50%占空比、非50%占空比),任意分频任意小数分频)](https://blog.csdn.net/m0_53333865/article/details/127891363)[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^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FPGA硅农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值