赞
踩
分频电路一般就是以输入源时钟为参考,将其进行降频输出;分频可以使用锁相环时钟资源实现,也可以计数为基础,进行分频设计。本文主要记录后者的相关问题。
分频数:即降频倍数,可以为奇数也可以为偶数;如源时钟为24MHZ,它的偶分频如4分频为6MHZ、它的奇分频如3分频为8MHZ;
占空比:一个周期内高电平持续时间所占的比例,即:高电平持续时间➗周期时间
偶数分频容易实现,假设源时钟为clk,分频系数为N,分频输出为divout,则偶分频可以通过N计数很简单的实现;
不限定占空比:每次clk来临计数一次,N次计数完成所需时间即为N分频时钟周期时间;N次计数的前M次计数divout输出为1,后N-M次计数divout反向;即可实现占空比为M/N的N分频设计;
1/2占空比:N为偶数时,M可以直接取为N/2(仍为整数)即可实现1/2占空比的N分频设计;N为奇数时,M不是整数,因此难以直接套用偶分频的实现方式(因为计数值只能为整数,不会出现2.5这种值)
假设源时钟为clk,分频系数为N(为奇数),分频输出为divout;
不限定占空比时与偶分频类似,每次clk来临计数一次,N次计数完成所需时间即为N分频时钟周期时间;N次计数的前M次计数divout输出为1,后N-M次计数divout反向;即可实现占空比为M/N的N分频设计;
积分频时,N为奇数时,N/2不是整数,因此难以直接套用偶分频的实现方式。此处记录了两种实现方式:
clk上升沿来临时计数,前(N-1)/2计数时div1输出1,随后(N+1)计数时div1输出为0;此时形成一个N分频,但是占空比为(N-1)/2N=1/2-1/2N的中间时钟;
与此同时,在clk下降沿时,令div2<=div1;即div2相比于div1延迟了半个clk周期;
divout=div1|div2,拓展了中间时钟div1的占空比为1/2;
1/2占空比,5分频电路实现代码如下:
- `timescale 1ns / 1ps
- //
- // Company:
- // Engineer: guoliang CLL
- //
- // Create Date: 2020/02/17 13:33:35
- // Design Name:
- // Module Name: clk_5div_1
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description: test of 5 divide of clk
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //
-
-
- module clk_5div_1(
- input clk,
- input rst_n,
- output divout
- );
-
- //
- reg [2:0]count;
- reg div1,div2;
- // count declaration
- always@(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- begin
- count <= 3'd0;
- end
- else if(count == 3'd4)
- begin
- count <= 3'd0;
- end
- else
- begin
- count <= count+1'd1;
- end
- end
-
- // divclk1 declaration
- always@(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- begin
- div1 <= 1'b0;
- end
- else if(count == 3'd0)
- begin
- div1 <= 1'b1;
- end
- else if(count == 3'd2)
- begin
- div1 <= 1'b0;
- end
- else
- begin
- div1 <= div1;
- end
- end
-
- // divclk2 declaration
- always@(negedge clk or negedge rst_n)
- begin
- if(!rst_n)
- begin
- div2 <= 1'b0;
- end
- else
- begin
- div2 <= div1;//delay 1period of div1
- end
- end
-
- // divclkout declaration
- assign divout = div1 | div2;
- endmodule
测试文件如下:
- `timescale 1ns / 1ps
- //
- // Company:
- // Engineer:
- //
- // Create Date: 2020/02/17 13:54:02
- // Design Name:
- // Module Name: clk_div_tsb
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //
-
-
- module clk_div_tsb(
-
- );
- //port declaration
- reg clk;
- reg rst_n;
- wire divout;
-
- //
- initial
- begin
- rst_n = 1'b1;
- clk = 1'b1;
- #20 rst_n = 1'b0;
- #20 rst_n = 1'b1;
- end
-
- always #5 clk = ~clk;
-
- // instance
- clk_5div_1 mdiv(
- //clk_5div_2 mdiv(
- //clk_5div_3 mdiv(
- .clk(clk),
- .rst_n(rst_n),
- .divout(divout)
- );
- endmodule
仿真结果如下:
分析可知,功能正确;
RTL电路如下:
1/2奇数分频是否有另一种更简单的实现方式?如时钟上升与下降沿均进行计数时,因为是双边沿计数,就算分频数N为奇数,分频结果周期时间也是源时钟clk驱动下偶数次计数(2N)对应时间;因此1/2占空比奇分频可以类似偶数分频一样,计数N次输出divout反转一次,即可实现1/2占空比的奇分频设计;
仍为1/2占空比的5分频电路设计如下:
- `timescale 1ns / 1ps
- //
- // Company:
- // Engineer:
- //
- // Create Date: 2020/02/17 14:10:15
- // Design Name:
- // Module Name: clk_5div_2
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description: correct in language but wrong in circuit
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //
-
-
- module clk_5div_2(
- input clk,
- input rst_n,
- output reg divout
- );
-
- //
- reg [2:0]count;
- wire clk_r;
- // reverse clk
- assign clk_r = ~clk;
- // count declaration
- always@(posedge clk or posedge clk_r or negedge rst_n)
- begin
- if(!rst_n)
- begin
- count <= 3'd0;
- end
- else if(count == 3'd4)
- begin
- count <= 3'd0;
- end
- else
- begin
- count <= count + 3'd1;
- end
- end
-
- // divout declaration
- always@(posedge clk or posedge clk_r or negedge rst_n)
- begin
- if(!rst_n)
- begin
- divout <= 1'b0;
- end
- else if(count == 3'd4)
- begin
- divout <= ~divout;
- end
- else
- begin
- divout <= divout;
- end
- end
- endmodule
-
测试文件不变(实例化时名称不同)
行为仿真结果如下:
可以看出测试功能正确;
但是真能这样设计分频电路吗?答案是不能,因为Verilog不仅仅是一门语言,它描述的永远更是硬件电路;满足语法要求,行为仿真验证通过的设计,并不一定能够综合;
电路综合出错:
详细分析会在Verilog中always@()语句双边沿触发(语法与综合的差异)部分进行记录;
学习这些知识时参考了一些前辈大神的博客,他们的精彩分析以及严谨的态度让我获益匪浅,感谢他们。
在此附上参考文献:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。