数字IC经典电路设计
经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。
快速导航链接如下:
一、前言
作为IC设计中经典电路之一,数字分频器在IC(集成电路)设计中有广泛的应用。以下是数字分频器在IC设计中的一些应用:
时钟发生器:时钟发生器的原理是时钟分频,数字分频器可以用来将时钟信号分频为所需的频率。例如,如果需要一个1Hz的时钟信号,可以使用数字分频器将10Hz的时钟信号分频为1Hz,满足模块时序要求外还可以达到降低功耗的作用。时钟发生器是数字系统中非常重要的组件,你就说重不重要!
数字锁相环(DLL):数字分频器可以用于数字锁相环的设计中,以实现时钟的相位同步。在 IC 设计中,时钟同步是非常重要的一部分,因为时钟信号的稳定性和精度直接影响到整个系统的性能和可靠性。数字锁相环是数字系统中的一种重要的时钟同步技术之一。你就说重不重要!
数字频率合成器(DDS):数字分频器可以用于数字频率合成器的设计中,以产生所需的频率。在频率合成器中,数字分频器可以用于将高频信号分频为多个低频信号,然后通过DSP进行数字信号处理和合成,最终生成一个高频信号。虽然分频只能将高频分解成低频信号,但是与DSP结合可以合成高频信号。可分解高频信号亦可合成高频信号,你就说重不重要!
总之,数字分频器在IC设计中有广泛的应用。它是数字系统中重要的组件之一,可以实现各种复杂的数字信号处理和时钟同步技术。它是现代电子技术中不可或缺的一部分。所以掌握数字分频器的设计是十分重要的!
二、偶数分频
2.1 触发器级联法
采用触发器反向输出端连接到输入端的方式,寄存器级联法能实现2^N的偶数分频,具体是采用寄存器结构的电路,每当时钟上升沿到来的时候输出结果进行翻转,以此来实现偶数分频。
根据以上原理,可实现简单的 2 分频电路,以此为基础进行串联,可构成 4 分频和8 分频电路。电路结构如下图所示,用 Verilog 描述时只需使用简单的取反逻辑即可。
在此基础上可画出2分频、4分频、8分频电路的波形图(图由TimeGen绘制,该软件功能实用,推荐使用),如下图所示。
2分频设计:只需要使用基准时钟在第1个时钟周期输出高电平(或低电平),在第2个时钟周期输出相反电平。
同理,4分频设计:使用基准时钟在第1、2个时钟周期输出高电平(或低电平),在第3、4个时钟周期输出相反电平。
同理,8分频设计:使用基准时钟在第1、2、3、4个时钟周期输出高电平(或低电平),在第5、6、7、8个时钟周期输出相反电平。
2.2 计数器法
如果偶数分频系数过大或者寄存器级联法无法实现对应的分频,可以采用计数器法进行分频,计数器法可以实现任意偶数分频。在计数周期达到分频系数中间数值 (N/2-1) 时进行时钟翻转,可保证分频后时钟的占空比为 50%。
Tips:中间数值(N/2-1) 需要减1是因为从0开始计数
以六分频为例,电路需要实现的是:计数器从0开始计数至2,计数器到0时信号翻转,具体的时序图如下(图由TimeGen绘制,该软件功能实用,推荐使用)。
因为是偶数分频,只要对分频系数中间数值进行循环计数,在对应的地方让信号进行反转即可得到任意分频的分频器。
2.3 verilog代码
//偶数分频电路设计(2分频、4分频、8分频、6分频)
//触发器法实现2分频、4分频、8分频
//计数器法实现6分频
module clk_div_even(
input rst_n, //复位信号
input clk, //源时钟信号
output clk_div2, //输出2分频
output clk_div4, //输出4分频
output clk_div6, //输出6分频
output clk_div8 //输出8分频
);
//定义4个中间寄存器和1个计数器
reg clk_div2_r;
reg clk_div4_r;
reg clk_div6_r;
reg clk_div8_r;
reg [3:0] cnt;
//2分频时钟输出模块
//源时钟上升沿触发,低电平异步复位
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin //低电平复位
clk_div2_r <= 1'b0;
end
else begin
clk_div2_r <= ~clk_div2_r; //源时钟上升沿信号翻转得到2分频时钟
end
end
assign clk_div2 = clk_div2_r; //延时输出,消除亚稳态
//4分频时钟输出模块
//2分频时钟上升沿触发 低电平异步复位
always @(posedge clk_div2 or negedge rst_n) begin
if (!rst_n) begin
clk_div4_r <= 1'b0;
end
else begin
clk_div4_r <= ~clk_div4_r; //2分频时钟上升沿信号翻转得到4分频时钟
end
end
assign clk_div4 = clk_div4_r; //延时输出,消除亚稳态
//8分频时钟输出模块
//4分频时钟上升沿触发 低电平异步复位
always @(posedge clk_div4 or negedge rst_n) begin
if (!rst_n) begin
clk_div8_r <= 'b0;
end
else begin
clk_div8_r <= ~clk_div8_r; //4分频时钟上升沿信号翻转得到8分频时钟
end
end
assign clk_div8 = clk_div8_r; //延时输出,消除亚稳态
//计数器模块
//源时钟上升沿触发,低电平异步复位
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin //低电平复位
cnt <= 4'b0 ;
en