任意分频器电路设计

目录

任意分频器电路设计

1、任意偶数分频器电路设计

1.2、实验任务

1.3、程序设计

1.3.1、代码如下:

1.3.2、编写仿真 TB 文件

2、任意奇数分频器电路设计

2.1、实验任务

2.2、程序设计

2.2.1、奇数分频电路代码

2.2.2、编写仿真 TB 文件

2.2.3、仿真验证


任意分频器电路设计

1、任意偶数分频器电路设计

       偶数分频实现比较简单,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数器清零,如此循环就可以得到 N(偶)分频。举个例子,比如晶振时钟是 100Mhz 时钟,想得到一个 25Mhz 的时钟, 那么这个是一个 100/25=4 的四分频设计,那么按照我们刚说的计数到 4/2-1=1,然后时钟翻转、计数器清零, 就可以得到一个 24Mhz 的时钟。

1.2、实验任务

使用 Verilog 语言设计一个任意偶数分频电路,默认进行 4 分频。

1.3、程序设计

       根据简介介绍的分频电路设计思路,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数清零,如此循环就可以得到 N(偶)分频,可以通过改变参量 N 的值和计数变量 cnt 的位宽实现任意偶分频,由于默认为 4 分频,因此 N 初始值为 4。我们由此可以写出如下代码。

1.3.1、代码如下:

//********************************************
module divide_2 
( 
    input        clk , // system clock 50Mhz on board
    input        rst_n, // system rst, low active 
    output reg   out_clk // output signal
);

parameter N = 4 ;

reg [N/2-1:0] cnt ;

//===============================================================
// ------------------------- MAIN CODE -------------------------
//===============================================================
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt <= 0;
        out_clk <= 0;
    end
    else begin
        if(cnt==N/2-1) begin
        out_clk <= ~out_clk;
        cnt <= 0;
    end
    else
        cnt <= cnt + 1;
    end
end

endmodule

1.3.2、编写仿真 TB 文件

      只需要对时钟以及复位信号进行激励,代码编写如下:

//*************TB****************
`timescale 1ns / 1ps

module TB();

reg       sys_clk ;
reg       sys_rst_n;
wire      out_clk ;

initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #200
    sys_rst_n = 1'b1;
end

always #10 sys_clk = ~sys_clk;

divide_2 u_divide_2(
    .clk       (sys_clk   ),
    .rst_n     (sys_rst_n ),
    .out_clk   (out_clk   )
);

endmodule

运行后的波形如下显示:

      可以看出,N 初始为 4,当复位撤销(复位信号低有效)之后,cnt 即开始计数,在计数器计到 1 的时候,out_clk 进行取反操作,即得到一个四分频时钟,大家可以改变 N 参数看下,看下 N 参数不一样,最终分频的时钟是多少。

2、任意奇数分频器电路设计

       有偶数分频就有奇数分频,仅实现分频功能来讲其中的差别和实现方式还是很大的,奇数分频相对于偶数分频要复杂一些,并不是简单的用计数器计数就可以实现的。

       奇数分频,顾名思义,是说分频后的频率和分频前的频率比例是奇数,比如 100Mhz 时钟,进行三分频后,就是 33.33Mhz。

       实现奇数分频原理是分别用上升沿计数到 N/2+1,分频后输出时钟进行翻转,再计数到 N/2 输出 out_clk1,再用下降沿计数到 N/2+1,分频后输出时钟再进行翻转,再计数到 N/2 输出out_clk2,将 out_clk1 和 out_clk2 相或即可。我们可以通过修改 N 的值和计数器的位宽来实现其他奇数分频。 其实 out_clk1 和 out_clk2 都已经是奇数分频的时钟,只不过占空比不是 50%。

      下面在进行奇数分频设计之前,我们先来了解下占空比的概念。占空比指的是时钟信号在一个周期内高电平和低电平的比例。如下是一个 50%占空比的一个时钟波形。

如下是一个 30%占空比的一个时钟波形。

       一般高质量的时钟信号都是要求有 50%占空比的,50%占空比的时钟信号对时序分析是非常有好处的。

2.1、实验任务

使用 Verilog 语言设计一个任意奇数分频电路,默认进行 3 分频,要求输出时钟的占空比是50%。

2.2、程序设计

       根据简介介绍的奇数分频电路设计思路,我们需要新增两个计数器,cnt_1 和 cnt_2。初始化 cnt_1 和 cnt_2 为 1,out_clk1 为 0,out_clk2 为 0。

       当 out_clk1 0 时,cnt_1 在 clk 时钟上升沿进行计数,当计数到 N/2+1 out_clk1 进行翻转,同时 cnt_1 赋值为初始值 1out_clk1 1 时,cnt_1 在 clk 时钟上升沿进行计数,当计数到 N/2 时 out_clk1 进行翻转,同时 cnt_1 赋值为初始值 1。

       当 out_clk2 0 时,cnt_2 在 clk 时钟下降沿进行计数,当计数到 N/2+1 out_clk2 进行翻转,同时 cnt_2 赋值为初始值 1out_clk2 1 时,cnt_2 在 clk 时钟下降沿进行计数,当计数到 N/2 时 out_clk2 进行翻转,同时 cnt_2 赋值为初始值 1。

       这样 N(奇数)分频就可以通过改变参量 N 的值和计数变量 cnt 的位宽实现任意奇数分频,由于默认为 3 分频,因此 N 初始值为 3。3 分频的 cnt_1 和 cnt_2 计数到 N/2+1 是计数到 2,小数舍弃掉, cnt_1 和 cnt_2 计数到 N/2 是计数到 1

我们由此可以写出如下代码。

2.2.1、奇数分频电路代码


//**********任意奇数分频*******START***************************
module divide_3 
( 
    input     clk,    // system clock 50Mhz on board
    input     rst_n,  // system rst, low active 
    output    out_clk // output signal
);

parameter N = 3 ;

reg [N/2 :0]   cnt_1;
reg [N/2 :0]   cnt_2;

reg out_clk1;
reg out_clk2;

//=====================================================================
// ------------------------- MAIN CODE -------------------------------
//=====================================================================
always @(posedge clk or negedge rst_n) begin //上升沿输出 out_clk1
    if(!rst_n) begin
        out_clk1 <= 0;
        cnt_1 <= 1; //这里计数器从 1 开始
    end
    else begin
        if(out_clk1 == 0) begin
            if(cnt_1 == N/2+1) begin
                out_clk1 <= ~out_clk1;
                cnt_1 <= 1;
            end
            else
                cnt_1 <= cnt_1+1;
        end
        else if(cnt_1 == N/2) begin
            out_clk1 <= ~out_clk1;
            cnt_1 <= 1;
        end
        else
            cnt_1 <= cnt_1+1;
    end
end

always @(negedge clk or negedge rst_n) begin //下降沿输出 out_clk2
    if(!rst_n) begin
        out_clk2 <= 0;
        cnt_2 <= 1; //这里计数器从 1 开始
    end
    else begin
        if(out_clk2 == 0) begin
            if(cnt_2 == N/2+1) begin
                out_clk2 <= ~out_clk2;
                cnt_2 <= 1;
            end
            else
                cnt_2 <= cnt_2+1;
            end
        else if(cnt_2 == N/2) begin
            out_clk2 <= ~out_clk2;
            cnt_2 <= 1;
        end
        else
        cnt_2 <= cnt_2+1;
    end
end

assign out_clk = out_clk1 | out_clk2;

endmodule

     使用 Vivado 综合后也可以看到电路结构,在 RTL ANALYSIS 的 Schematic 中来看下综合的电路结构。

       可以看出,cnt_1 和 cnt_2 是一个 3bit 的计数器,out_clk1 和 out_clk2 的电路结构基本是完全相同的,只是 cnt_1 和 cnt_2 计数器变化的时钟沿不一样,大家可以看出 cnt_2 的寄存器的 clk 前面有一个取反的标记,表示 cnt_2 是在时钟下降沿进行变化,然后 out_clk1 和 out_clk2 进行或操作,即得到一个 50%占空比的奇数 3 分频时钟。

2.2.2、编写仿真 TB 文件

      只需要对时钟以及复位信号进行激励,代码编写如下:

`timescale 1ns / 1ps
//


module tb_divider_3();  //仿真模块

//输入 reg 定义
reg         sys_clk;
reg         sys_rst_n;

//输出 wire 定义
wire        out_clk;

//设置初始化条件
initial begin
    sys_clk = 1'b0;     //初始化时钟为0
    sys_rst_n <= 1'b0;  //初始复位
    #200                //200个时间单位后
    sys_rst_n <= 1'b1;  //拉高复位
end

always #10 sys_clk = ~sys_clk;


//例化被测试模块
divider_3 u_divider_3
(
    .sys_clk           (sys_clk       ),
    .sys_rst_n         (sys_rst_n     ),
    
    .out_clk           (out_clk       )
);

endmodule

2.2.3、仿真验证

       测试程序在 Xilinx 的 Vivado 软件 或者其他仿真工具运行后的波形如下显示:

        可以看出,N 初始为 3,当复位撤销(复位信号低有效)之后,cnt_1 cnt_2 即开始计数, 当 out_clk1 0 时,在 cnt_1 计数器计到 2 的时候,out_clk1 进行取反操作,当 out_clk1 1 时,在 cnt_1 计数器计到 1 的时候,out_clk1 进行取反操作。

       当 out_clk2 0 时,在 cnt_2 计数器计到 2 的时候,out_clk2 进行取反操作,当 out_clk2 1 时,在 cnt_2 计数器计到 1 的时候,out_clk2 进行取反操作。

       我们可以看出 out_clk1 和 out_clk2 都不是 50%占空比的时钟,大概是 30%占空比。然后 out_clk1 和 out_clk2 进行或操作,即得到一个 50%占空比的奇数 3 分频时钟。

大家可以改变 N 参数看下,看下 N 参数不一样,最终分频的时钟是多少。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LEAP设计软件是由EnclosureShop(音箱箱体模拟设计)和CrossoverShop(音箱分频器模拟设计)应用软件组成。 EnclosureShop提供了喇叭单元和音箱设计,而CrossoverShop则提供了设计过滤器布局技术的工具。通过两者的合作,这两种程序希望能组成一个完整的设计和分析软件。 EnclosureShop比较特殊的功能包括有衍射分析、外壳结构随意分析、一个新的60-参数变频器模块、非线性声学模拟器等等。 CrossoverShop比较特殊的功能包括有模拟有源和无源的设计和分析、数字过滤器FIR和IIR设计及分析、结合模拟和数字形式设计、全球通用的优化引擎等等 EnclosureShop提供了预先模拟以及喇叭和箱体特性的模型模拟。其它的软件仅提供了单一的第二/第四阶线性高通逐次逼近法,而EnclosureShop提供了包括随频率而变,随温度而变,以及非线形效应的真实声学网络. 或许LEAP最重要的改进是具有革命性的新的衍射引擎。现在你可以看到完全的水平方向上和水平方向上的极坐标响应,包含高达第八阶的衍射效果,互耦合以及非线性喇叭特性。任意箱体形状和喇叭布局可以在任意空间被模拟. EnclosureShop提供一个完整的3D编辑器,允许用肉眼观察箱体形状并且提供对喇叭,开口,箱体以及分析点位置的精确定位。这些对于精确响应预测是很关键的. CrossoverShop提供了一个用于从实际测量数据来开发分频器处理的系统模拟,设计,分析工具强大的库。模拟的和数字的或者两者混合的分频器结构都被支持. 提供有一个完整的带有绘图编辑的电路编辑器,它支持有源/无源模拟和数字FIR/IIR分频器开发。你可以从许多个已包含的拓扑结构中一个来合成你的电路,或者创建和分析任意所需的电路。分频器设计Wizard(向导)能够在数分钟内自动生成一个完全最优化的,完整的分频电路. CrossoverShop包含有用于无源,有源和数字分频器强大的优化系统。利用单曲线或者根据目标类型的限制条件以及频率加权性能,优化可以执行在频率响应(SPL),阻抗,电压或组延迟上. 无论你的应用是专业音箱,卡包的OK音箱,还是定制的很深奥的罕见物,LEAP提供了功率,挠性以及精度来研究每一种可能的设计变换。其开放式体系结构和广谱特性将显著地减少你的开发时间而改进最终结果的质量,同时将阐明为什么LEAP已经成为全世界专业扬声器设计者的首选。带有一些不可思议的特征和功能,并且其中许多都是最近发展的技术。EnclosureShop和CrossoverShop是专业音箱设计的必备工具。
一种基于FPGA任意分频器设计与实现,可以通过利用FPGA的可编程性和灵活性来实现任意的分频比。FPGA(Field-Programmable Gate Array)是一种可编程逻辑设备,可以通过重新配置其内部的逻辑门阵列和时序元件来实现不同的功能。 首先,我们需要确定所需的分频比,并计算出分频比的细分数,也就是将输入时钟信号分成多少份。接下来,我们通过FPGA的时钟管理资源来生成所需的分频时钟信号。FPGA中的时钟管理资源通常包括时钟分配器和锁相环(Phase-Locked Loop, PLL)等。其中,时钟分配器可以将输入时钟信号分配到不同的逻辑模块,而PLL可以通过调节其内部的控制参数来实现不同的倍频和分频功能。 在设计中,我们可以使用FPGA开发工具(如Xilinx ISE或Vivado)来进行设计和仿真。首先,我们需要在FPGA开发工具中创建一个新的项目,并添加所需的时钟管理资源和逻辑模块。然后,我们可以使用硬件描述语言(如VHDL或Verilog)来实现分频器的功能。在实现时,我们需要根据所需的分频比和细分数,利用逻辑门、触发器和时序元件等基本的FPGA元素来设计一个适合的电路。最后,我们可以使用仿真工具来验证设计的正确性。 实现后,我们需要将设计烧录到FPGA芯片中。通过连接FPGA芯片的开发板和计算机,我们可以使用烧录工具将设计下载到FPGA芯片中,并在开发板上测试分频器的功能。在测试中,我们可以输入一个特定的时钟信号,并观察输出的分频时钟信号是否符合我们所设计的分频比。 总之,基于FPGA任意分频器设计与实现利用了FPGA的可编程性和灵活性,可以根据实际需求实现不同的分频比。通过适当的设计和验证,我们可以实现一个满足要求的任意分频器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值