verilog语言实现的分频

点击蓝字关注我们

关注、星标公众号,精彩内容每日送达
来源:网络素材

一 、占空比50%的任意奇数分频

如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。这种方法可以实现任意的奇数分频。归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。

1 /*********************************************************************************
 2 * Company                    :
 3 * Engineer                    : 空气微凉
 4 *
 5 * Create Date                : 00:00:00 22/03/2013
 6 * Design Name                :
 7 * Module Name                :
 8 * Project Name                :
 9 * Target Devices            :
10 * Tool versions            :
11 * Description                :
12 *                       http://www.cnblogs.com/kongqiweiliang/             
13 * Dependencies                :
14 *
15 * Revision                    :
16 * Revision                    : 0.01 - File Created
17 * Additional Comments    :
18 ********************************************************************************/
19 `timescale 1ns/1ps
20 `define    UD  #1
21 /*******************************************************************************/
22 module three
23 (
24     //system interface
25     input                                     iCLK_50    ,//50MHz
26     input                                     iRESET     ,//system interface
27     //Interface package
28     output                                oCLK_3    ,//
29     output                                oCLK_5    ,//
30     output                                oCLK_7    ,//
31     output                                oCLK_9    ,//
32     output                                oCLK_11    ,//
33     output                                oCLK_13    ,//
34     output                                oCLK_15    ,//
35     output                                oCLK_17    ,//
36     output                                oCLK_19     //
37     //hardware interface
38 );
39 //-------------------------------------------------------------------------------
40 parameter   N = 9;
41 
42 reg  [9:0]  TIME_CNT1,TIME_CNT1_N;
43 reg  [9:0]  TIME_CNT2,TIME_CNT2_N;
44 
45 always@(posedge iCLK_50 or negedge iRESET)begin
46     if(!iRESET)
47         TIME_CNT1 <= 10'h0;
48     else
49         TIME_CNT1 <= TIME_CNT1_N;
50 end
51 always@(*)begin
52     if(TIME_CNT1 == N - 1)
53         TIME_CNT1_N = 10'h0;
54     else
55         TIME_CNT1_N = TIME_CNT1 + 1'h1;
56 end
57 
58 always@(negedge iCLK_50 or negedge iRESET)begin
59     if(!iRESET)
60         TIME_CNT2 <= 10'h0;
61     else
62         TIME_CNT2 <= TIME_CNT2_N;
63 end
64 always@(*)begin
65     if(TIME_CNT2 == N - 1)
66         TIME_CNT2_N = 10'h0;
67     else
68         TIME_CNT2_N = TIME_CNT2 + 1'h1;
69 end
70 
71 assign oCLK_3  = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
72 assign oCLK_5  = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
73 assign oCLK_7  = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
74 assign oCLK_9  = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
75 assign oCLK_11 = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
76 assign oCLK_13 = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
77 assign oCLK_15 = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
78 assign oCLK_17 = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
79 assign oCLK_19 = (TIME_CNT1 < ((N - 1)/2)) | (TIME_CNT2 < ((N - 1)/2));
80 //-------------------------------------------------------------------------------
81 endmodule
1 /*********************************************************************************
 2 * Company                    :
 3 * Engineer                    : 空气微凉
 4 *
 5 * Create Date                : 00:00:00 22/03/2013
 6 * Design Name                :
 7 * Module Name                :
 8 * Project Name                :
 9 * Target Devices            :
10 * Tool versions            :
11 * Description                :
12 *                        http://www.cnblogs.com/kongqiweiliang/             
13 * Dependencies                :
14 *
15 * Revision                    :
16 * Revision                    : 0.01 - File Created
17 * Additional Comments    :
18 ********************************************************************************/
19 `timescale 1ns/100ps
20 `define    UD  #1
21 /*******************************************************************************/
22 module three_tb();
23 //-------------------------------------------------------------------------------
24 //system interface
25 reg                                        iSYSCLK    ;
26 reg                                        iRESET     ;
27 //Interface package
28 wire                                        oCLK_3    ;
29 wire                                        oCLK_5    ;
30 wire                                        oCLK_7    ;
31 wire                                        oCLK_9    ;
32 wire                                        oCLK_11    ;
33 wire                                        oCLK_13    ;
34 wire                                        oCLK_15    ;
35 wire                                        oCLK_17    ;
36 wire                                        oCLK_19    ;
37 //hardware interface
38 //-------------------------------------------------------------------------------
39 //测试实例设计
40 //-------------------------------------------------------------------------------
41 initial begin 
42     iRESET  = 0;
43     iSYSCLK = 0;
44     #100
45     iRESET  = 1;
46     iSYSCLK = 1;
47 end
48 
49 always #10 iSYSCLK = ~iSYSCLK    ;
50 
51 //-------------------------------------------------------------------------------
52 //例化被测试工程
53 //-------------------------------------------------------------------------------
54 three                                        m_three
55 (
56     //system interface
57     .iCLK_50                                (iSYSCLK                ),//50MHz
58     .iRESET                                 (iRESET                ),//system interface
59     //Interface package
60     .oCLK_3                                (oCLK_3                ),//
61     .oCLK_5                                (oCLK_5                ),//
62     .oCLK_7                                (oCLK_7                ),//
63     .oCLK_9                                (oCLK_9                ),//
64     .oCLK_11                                (oCLK_11                ),//
65     .oCLK_13                                (oCLK_13                ),//
66     .oCLK_15                                (oCLK_15                ),//
67     .oCLK_17                                (oCLK_17                ),//
68     .oCLK_19                              (oCLK_19                ) //
69     //hardware interface
70 );
71 //*******************************************************************************
72 endmodule
346bb5e066a1758618a4158ac7c4b5e6.jpeg

二 、任意占空比的任意分频

FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。很容易想到用计数的方式来分频:50000000/880 = 56818。显然这个数字不是2的整幂次方,那么我们可以设定一个参数,让它到56818的时候重新计数就可以实现了。程序如下:

1 module div(clk, clk_div);
 2 
 3 input clk;
 4 
 5 output clk_div;
 6 
 7 reg [15:0] counter;
 8 
 9 always @(posedge clk)
10 
11 if(counter==56817) counter <= 0;
12 
13 else counter <= counter+1;
14 
15 assign clk_div = counter[15];
16 
17 endmodule

下面我们来算一下它的占空比:我们清楚地知道,这个输出波形在counter为0到32767的时候为低,在32768到56817的时候为高,占空比为40%多一些,如果我们需要占空比为50%,那么我们需要再设定一个参数,使它为56817的一半,使达到它的时候波形翻转,就可以实现结果了。程序如下:

1 module div(clk, clk_div);
 2 
 3 input clk;
 4 
 5 output clk_div;
 6 
 7 reg [14:0] counter;
 8 
 9 always @(posedge clk)
10 
11 if(counter==28408) counter <= 0;
12 
13 else counter <= counter+1;
14 
15 reg clk_div;
16 
17 always @(posedge clk)
18 
19        if(counter==28408) clk_div <= ~clk_div;
20 
21 endmodule

继续让我们来看如何实现任意占空比,比如还是由50 M分频产生880Hz,而分频得到的信号的占空比为30%。 56818×30%=17045

1 module div(clk,reset,clk_div,counter);
 2 
 3 input clk,reset;
 4 
 5 output clk_div;
 6 
 7 output [15:0] counter;
 8 
 9 reg [15:0] counter;
10 
11 reg clk_div;
12 
13 always @(posedge clk)
14 
15 if(!reset) counter <= 0;
16 
17 else if(counter==56817) counter <= 0;
18 
19 else counter <= counter+1;
20 
21 always @(posedge clk)
22 
23 if(!reset) clk_div <= 0;
24 
25 else if(counter<17045) clk_div <= 1;
26 
27 else clk_div <= 0;
28 
29 endmodule
eb8c6b4a1a6bacfeda8c0eee52a86bb1.jpeg

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值