一、行波时钟

  任意分频电路,相信很多人都听说过这个专业名词,好多视频上都说不建议使用计数器产生的分频时钟。其实在FPGA领域当中,由寄存器分频产生的时钟还有一个学名叫做,行波时钟。是由时序逻辑产生比如A寄存器的输出作为B寄存的时钟输入(一般不建议使用),如下图所示;驱动右边那个触发器的时钟即为行波时钟。之所以不建议使用在FPGA中使用行波时钟,因为这样会在FPGA设计中引入新的时钟域,,增加时序分析的难度,并且由于行波时钟的相位通常会滞后于原始时钟,会导致后续触发器的保持时间不一定能满足。

  事实上,采用行波时钟的目的无非是为后续时序电路的处理速度进行降频,而要实现降频的功能,除了通过降低时钟信号的频率外,仍然可以通过控制后续时序电路存储单元的使能端来实现,因此,上例中的电路完全可以修改如下:这样一来,整个时序逻辑将只被一个时钟信号所驱动。

二、任意分频电路

  虽然说比建议使用分屏电路。但是在一些对时序要求不高的情况下是完全可以用的。而且还可以节省PLL和DCM等资源。那么设计一个任意分频的电路。这里的关键是偶数分频和奇数分频两大块。占空比一般都是50%。分频电路的整体架构如下:

   1、偶数分频:可以不用介绍,计数到N/2翻转就可以。

   2、奇数分频    第一步:上升沿触发进行模N计数,从0开始计数,计数到0+(n-1)/2,进行翻转,即为clk_odd= ~clk_odd

            第二步:还是在上升沿的条件下,从接着第一步计数,在其基础上再计数(n-1)/2,再次翻转;clk_odd= ~clk_odd

第三步:在下降沿的条件下,采集clk_odd,即:clk_odd_r = clk_odd

         第四步;输出clk_odd_out = clk_odd_r |clk_odd;即为所求‘。

三、实现  

 1 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2 // Project Name : 3 // Website      : https://home.cnblogs.com/lgy-gdeu/4 // Author         : LGY GUET Uiversity5 // Weixin         : li152264998356 // Email          : 15277385992@163.com7 // File           : 8 // Create         : 2020-07-019 // Revise         : 10 // Editor         : sublime text{SUBLIME_VERSION}, tab size ({TABS})11 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++12 // Modification History:13 // Date             By              Version                 Change Description14 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~15 // {DATE} {TIME}    LGY           1.0                        ++++++++++++++++ 16 // *********************************************************************************17 `timescale      1ns/1ns18 module mux_cnt(19 input            wire                     sclk     ,20 input            wire                    s_rst_n  ,21 input             wire[3:0]               div      ,22 output          wire                    clk_out 23     );24 25 //========================================================================\26 // ################ Define Parameter and Internal signals ################ 27 //========================================================================/28 localparam             DIV1 = 1                ;29 localparam            DIV2 = 2                ;30 localparam          DIV3 = 3                ;31 localparam          DIV4 = 4                ;32 localparam          DIV5 = 5                ;33 localparam          DIV6 = 6                ;34 localparam            DIV7 = 7                ;35 localparam          DIV8 = 8                ;36 reg        [7:0]            fre_en          ;37 //=============================================================================38 //+++++++++++++++++++++++++     Main Code    +++++++++++++++++++++++++++++++39 //=============================================================================40 //分频模式的使能,一共是8种模式41 always @(posedge sclk or negedge s_rst_n)begin42         if(!s_rst_n)begin43             fre_en    <=   0;44         end    45         else begin46             case(div )47                 DIV1 :   fre_en   <=  8'b0000_0001 ;48                 DIV2 :   fre_en   <=  8'b0000_0010 ;49                 DIV3 :   fre_en   <=  8'b0000_0100 ;50                 DIV4 :   fre_en   <=  8'b0000_1000 ;51                 DIV5 :   fre_en   <=  8'b0001_0000 ;52                 DIV6 :   fre_en   <=  8'b0010_0000 ;53                 DIV7 :   fre_en   <=  8'b0100_0000 ;54                 DIV8 :   fre_en   <=  8'b1000_0000 ;                55             endcase56         end57 end58 59 //计数模块60 reg                [3:0]            fre_cnt       ;61 always @(posedge sclk or negedge s_rst_n)begin62     if(!s_rst_n)begin63         fre_cnt   <=    0 ;64     end65     else begin66         case (1'b1)67             fre_en[0]  :  begin68                 ;69             end70             fre_en[1]  :  begin71                 ;72             end73             fre_en[2]  : begin74                 if(fre_cnt < 2)75                     fre_cnt  <= fre_cnt + 1'b1 ;76                 else 77                     fre_cnt  <= 0 ;    78             end79             fre_en[3]  : begin80                 if(fre_cnt<3)81                     fre_cnt   <= fre_cnt + 1'b1 ;82                 else 83                     fre_cnt   <= 0;    84             end85             fre_en[4]  : begin86                 if(fre_cnt<4)87                     fre_cnt   <= fre_cnt +  1'b1 ;88                 else 89                     fre_cnt   <= 0;90             end91             fre_en[5]  : begin92                 if(fre_cnt<5)93                     fre_cnt   <= fre_cnt +  1'b1 ;94                 else 95                     fre_cnt   <= 0;    96             end97             fre_en[6]  : begin98                 if(fre_cnt<6)99                     fre_cnt   <= fre_cnt + 1'b1 ;
100                 else
101                     fre_cnt   <= 0;
102             end
103             fre_en[7]  : begin
104                 if(fre_cnt<7)
105                     fre_cnt   <= fre_cnt + 1'b1  ;
106                 else
107                     fre_cnt   <= 0;
108             end
109
110         endcase
111     end
112 end
113 //分频模块
114 reg          clk_out_odd_r    ;   //奇数分频,中间变量
115 reg          clk_out_even     ;   //偶数分频,直接输出
116 always @ (posedge sclk or negedge s_rst_n) begin
117     if(s_rst_n == 1'b0)begin
118         clk_out_even  <= 0;
119         clk_out_odd_r <= 0;
120     end
121     else begin
122         case  (1'b1)
123             fre_en[0] :  begin
124                 ;
125             end
126             fre_en[1] :  begin
127                 clk_out_even <= ~clk_out_even ;
128             end
129             fre_en[2] :  begin// 3 div
130                 if (fre_cnt==1)
131                     clk_out_odd_r   <=  ~clk_out_odd_r;
132                 else if(fre_cnt==2)
133                     clk_out_odd_r   <=  ~clk_out_odd_r;
134                 else
135                     clk_out_odd_r   <= clk_out_odd_r;
136             end
137             fre_en[3] :  begin//4 div
138                 if(fre_cnt == 1)
139                     clk_out_even    <= ~clk_out_even  ;
140                 else if(fre_cnt ==3)
141                     clk_out_even    <= ~clk_out_even   ;
142                 else
143                     clk_out_even    <=  clk_out_even   ;
144             end
145             fre_en[4] :  begin//5 div
146                 if(fre_cnt == 2)
147                     clk_out_odd_r   <=  ~clk_out_odd_r;
148                 else if(fre_cnt == 4)
149                     clk_out_odd_r   <=  ~clk_out_odd_r;
150                 else
151                     clk_out_odd_r   <=  clk_out_odd_r ;
152
153             end
154             fre_en[5] : begin// 6 div
155                 if (fre_cnt == 2)
156                     clk_out_even    <=  ~clk_out_even  ;
157                 else if(fre_cnt == 5)
158                     clk_out_even    <=  ~clk_out_even  ;
159                 else
160                     clk_out_even    <=  clk_out_even;
161             end
162             fre_en[6] :  begin //7div
163                 if(fre_cnt == 3)
164                     clk_out_odd_r    <=  ~clk_out_odd_r ;
165                 else if(fre_cnt ==6)
166                     clk_out_odd_r    <=  ~clk_out_odd_r ;
167                 else
168                     clk_out_odd_r    <=  clk_out_odd_r ;
169             end
170             fre_en[7] : begin // 8 div
171                 if(fre_cnt == 3)
172                     clk_out_even     <=  ~clk_out_even  ;
173                 else if(fre_cnt ==7)
174                     clk_out_even     <=  ~clk_out_even  ;
175                 else
176                     clk_out_even     <=  clk_out_even ;
177             end
178
179         endcase
180     end
181
182 end
183
184 //中间输出模块
185 reg             clk_out_odd_r1 ;//用来存放下降沿采集的数据
186 always @(negedge  sclk or negedge s_rst_n)begin
187     if(!s_rst_n)
188         clk_out_odd_r1   <=   0;
189     else begin
190         case (1'b1 )
191             fre_en[0] : begin
192                 ;
193             end
194             fre_en[1] : begin
195                 ;
196             end
197             fre_en[2] : begin
198                 clk_out_odd_r1   <=  clk_out_odd_r ;
199             end
200             fre_en[3] : begin
201                 ;
202             end
203             fre_en[4] : begin
204                 clk_out_odd_r1   <=  clk_out_odd_r ;
205             end
206             fre_en[5] : begin
207                 ;
208             end
209             fre_en[6] : begin
210                 clk_out_odd_r1   <=  clk_out_odd_r ;
211             end
212             fre_en[7] : begin
213                 ;
214             end
215         endcase
216     end
217 end
218
219 //最后的输出
220 //assign     clk_out   =  ( fre_en[0] | fre_en[1] | fre_en[3] | fre_en[5] | fre_en[7] )?clk_out_even:clk_out_odd_r|clk_out_odd_r1;
221 assign    clk_out   =  fre_en[0]? sclk :(( fre_en[1] | fre_en[3] | fre_en[5] | fre_en[7])?clk_out_even:clk_out_odd_r|clk_out_odd_r1);
222
223 endmodule

激励文件

 1 `timescale 1ns / 1ps2 //3 // Company: 4 // Engineer: 5 // 6 // Create Date: 2020/07/01 14:59:387 // Design Name: 8 // Module Name: mux_cnt_tb9 // Project Name:
10 // Target Devices:
11 // Tool Versions:
12 // Description:
13 //
14 // Dependencies:
15 //
16 // Revision:
17 // Revision 0.01 - File Created
18 // Additional Comments:
19 //
20 //
21
22
23 module mux_cnt_tb();
24 reg            sclk     ;
25 reg            s_rst_n  ;
26 reg  [3:0]     div      ;
27 wire           clk_out  ;
28
29 //=============================================================================
30 //+++++++++++++++++++++++++     Main Code    +++++++++++++++++++++++++++++++里
31 //=============================================================================
32
33 //initial begin
34 //    sclk   =  0 ;
35 //    forever  begin
36 //        #2  sclk = ~sclk ;
37 //    end
38 //end
39
40
41
42
43 initial begin
44     sclk  = 0;
45     s_rst_n = 0;
46     div = 3 ;
47     #20
48     s_rst_n = 1;
49     #400
50     div = 1;
51     #600
52     s_rst_n = 1;
53     div = 5;
54     #1200
55     div = 2;
56     #600
57
58     $finish;
59
60 end
61 always #10 sclk = ~sclk ;
62
63
64 mux_cnt inst_mux_cnt (.sclk(sclk), .s_rst_n(s_rst_n), .div(div), .clk_out(clk_out));
65
66
67 endmodule

Verilog实现之任意分频电路相关推荐

  1. verilog 语言实现任意分频

    1.偶分频 偶分频比较简单,假设为N分频,只需计数到N/2-1,然后时钟翻转.计数清零,如此循环就可以得到N(偶)分频.代码如下. module fp_even(clk_in,rst_n,clk_ou ...

  2. IC/FPGA校招笔试题分析(二)任意切换的时钟分频电路

    今天的笔试题是某芸科技的现场笔试题,数字前端的笔试题,要求很简单,就是现场写出代码实现: 任意切换1-8分频,且无论奇分频还是偶分频,占空比均为50%,我至今仍然认为,在那种紧张且时间有限的情况下(本 ...

  3. FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)

    https://blog.csdn.net/weixin_43950612/article/details/104687942(简介明了,奇数,偶数,小数,任意分频) http://www.myexc ...

  4. 【Verilog HDL 训练】第 11 天(分频电路)

    设计一个占空比50%的三分频电路. 针对这个分频器,博文的末尾会给出一个反面教材,这是我上次写的一个分频器,看起来很好,其实是不能综合的.针对其中的错误,我令立博文记录之:[ Verilog ]alw ...

  5. verilog分频电路

    二分频电路: module div2( input clk, input rst_n, output reg clk_o );always@(posedge clk or negedge rst_n) ...

  6. 奇数分频电路—5分频(verilog实现)

    文章目录 前言 占空比不为50%的奇数分频 占空比为50%的5分频电路 扩展 前言 前文我们讲到,可以通过计数器的方法实现偶数分频,实现方式可以参考4分频电路实现 那么对于奇数分频电路应该如何实现呢? ...

  7. 题目:用Verilog实现三分频电路,要求输出50%占空比。

    题目:用Verilog实现三分频电路,要求输出50%占空比. module Div_three(input clk,input rst_n,output div_three ); reg [1:0] ...

  8. 一、verilog编写三分频电路

    1.目标:使用verilog编写三分频电路,要求占空比大小为50%. 2.方法:分别使用上升沿和下降沿计数cnt_p以及cnt_n,并且计数从0到N-1(N为分频的次数,此时为3):分别对clk_p以 ...

  9. Verilog实现25分频电路代码

    可以使用一个计数器实现 25 分频电路.可以设置计数器的计数范围为 0 到 24,每次计数器增加 1.在计数器的值为 24 时,将其设置为 0 并触发输出信号.这样就能实现 25 分频.以下是一个简单 ...

最新文章

  1. server sql 数据c盘迁移d盘_oracle 11g dbf数据文件从C盘迁移到D盘
  2. 树莓派+百度api实现人脸识别
  3. 第二章 Python数据类型详解
  4. Exchange 邮件投递被拒的问题分析
  5. 我从机器人先生那里了解到了有关InfoSec的全部信息
  6. mysql innodb 报错_mysql报错1286 Unknown storage engine 'InnoDB'
  7. 哈佛开源 | 从零开始教你计算机图形学
  8. 组装台式电脑配置清单_萌新攒机必备!多价位台式电脑配置清单!
  9. np-hard证明实例 规约
  10. Extjs项目实战视频教程
  11. Mac 下的破解版软件真的安全吗?
  12. 局域网桌面监控软件_如何促进局域网监控软件在企业中的普及
  13. 2017中国之旅系列之十:山西张壁古堡之旅
  14. 汇编(三):DEBUG
  15. vue 登录 动态树 表格 cud
  16. matlab创作歌曲——《月半小夜曲》
  17. k8s集群ClusterIP不能使用
  18. 2022年葡萄糖基甜菊糖市场前景分析及研究报告
  19. python中,Microsoft Visual C++ 14.0 or greater is required问题解决方案
  20. STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

热门文章

  1. 只有rear指针的环形循环队列
  2. 易语言开发微信机器人插件
  3. 开篇-后端工程师的开发利器
  4. 2014微软校园招聘笔试试题(英文)
  5. 万剑归宗之七剑下天山,redisson的百锁解构(下)
  6. VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题
  7. linux 修改 bcast,Linux Ubuntu下IP的查看和修改
  8. 远程审批、远程会议及远程培训就用天翼云办公
  9. 分形理论在地理信息科学研究中的应用
  10. 阿里云视频直播开发----java