偶分频、奇分频、任意整数分频

一、偶分频电路,占空比为1:2

 1 //**************************************************************************
 2 // *** 名称 : div_clk.v
 3 // *** 作者 : xianyu_FPGA
 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/
 5 // *** 日期 : 2018-11-30
 6 // *** 描述 : 任意偶数分频,占空比为 1:2
 7 //**************************************************************************
 8 
 9 module div_clk
10 //==================<参数>==================================================
11 #(
12 parameter DIV               = 4                   //分频系数(必须是偶数)
13 )
14 //==================<端口>==================================================
15 (
16 input  wire                 clk                 , //时钟,50Mhz
17 input  wire                 rst_n               , //复位,低电平有效
18 output wire                 div_clk               //分频时钟
19 );
20 //==================<信号>==================================================
21 reg  [31:0]                 cnt                 ;
22 wire                        add_cnt             ;
23 wire                        end_cnt             ;
24 
25 //==========================================================================
26 //==    分频计数
27 //==========================================================================
28 always @(posedge clk or negedge rst_n) begin
29     if(!rst_n)
30         cnt <= 0;
31     else if(add_cnt) begin
32         if(end_cnt)
33             cnt <= 0;
34         else
35             cnt <= cnt + 1;
36     end
37 end
38 
39 assign add_cnt = 1;
40 assign end_cnt = add_cnt && cnt== DIV-1;
41 
42 //==========================================================================
43 //==    分频时钟
44 //==========================================================================
45 assign div_clk = (cnt < DIV/2) ? 0 : 1;
46 
47 
48 
49 endmodule

 

二、奇分频电路,占空比为1:2

 1 //**************************************************************************
 2 // *** 名称 : div_clk.v
 3 // *** 作者 : xianyu_FPGA
 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/
 5 // *** 日期 : 2018-11-30
 6 // *** 描述 : 任意奇数分频,占空比为 1:2
 7 //**************************************************************************
 8 
 9 module div_clk
10 //==================<参数>==================================================
11 #(
12 parameter DIV               = 3                   //分频系数(必须是奇数)
13 )
14 //==================<端口>==================================================
15 (
16 input  wire                 clk                 , //时钟,50Mhz
17 input  wire                 rst_n               , //复位,低电平有效
18 output wire                  div_clk              //分频时钟
19 );
20 //==================<信号>==================================================
21 reg  [31:0]                 pos_cnt             ;
22 wire                        pos_add_cnt         ;
23 wire                        pos_end_cnt         ;
24 reg                         pos_clk             ;
25 reg  [31:0]                 neg_cnt             ;
26 wire                        neg_add_cnt         ;
27 wire                        neg_end_cnt         ;
28 reg                         neg_clk             ;
29 
30 //==========================================================================
31 //==    clk上升沿触发,得到DIV分频的前半段分频pos_clk
32 //==========================================================================
33 always @(posedge clk or negedge rst_n)begin
34     if(!rst_n)
35         pos_cnt <= 0;
36     else if(pos_add_cnt)begin
37         if(pos_end_cnt)
38             pos_cnt <= 0;
39         else
40             pos_cnt <= pos_cnt + 1;
41     end
42 end
43 
44 assign pos_add_cnt = 1;
45 assign pos_end_cnt = pos_add_cnt && pos_cnt==DIV-1;
46 
47 always @(posedge clk or negedge rst_n)begin
48     if(!rst_n) begin
49         pos_clk <= 0;
50     end
51     else if(pos_cnt==DIV/2) begin
52         pos_clk <= 1;
53     end
54     else if(pos_end_cnt) begin
55         pos_clk <= 0;
56     end
57 end
58 
59 //==========================================================================
60 //==    clk下降沿触发,得到DIV分频的后半段分频neg_clk
61 //==========================================================================
62 always @(negedge clk or negedge rst_n)begin
63     if(!rst_n)
64         neg_cnt <= 0;
65     else if(neg_add_cnt)begin
66         if(neg_end_cnt)
67             neg_cnt <= 0;
68         else
69             neg_cnt <= neg_cnt + 1;
70     end
71 end
72 
73 assign neg_add_cnt = 1;
74 assign neg_end_cnt = neg_add_cnt && neg_cnt==DIV-1;
75 
76 always @(negedge clk or negedge rst_n)begin
77     if(!rst_n) begin
78         neg_clk <= 0;
79     end
80     else if(neg_cnt==DIV/2) begin
81         neg_clk <= 1;
82     end
83     else if(neg_end_cnt) begin
84         neg_clk <= 0;
85     end
86 end
87 
88 //==========================================================================
89 //==    相或,输出占空比为 1:2 的DIV分频
90 //==========================================================================
91 assign div_clk = pos_clk || neg_clk;
92 
93 
94 
95 endmodule

 

三、任意整数分频

  任意偶数分频和任意奇数分频结合即可以扩展为任意整数分频。

  1 //**************************************************************************
  2 // *** 名称 : div_clk.v
  3 // *** 作者 : xianyu_FPGA
  4 // *** 博客 : https://www.cnblogs.com/xianyufpga/
  5 // *** 日期 : 2018-11-30
  6 // *** 描述 : 任意整数分频,占空比为 1:2
  7 //**************************************************************************
  8 
  9 module div_clk
 10 //==================<参数>==================================================
 11 #(
 12 parameter DIV               = 3                   //分频系数(奇偶任意)
 13 )
 14 //==================<端口>==================================================
 15 (
 16 input  wire                 clk                 , //时钟,50Mhz
 17 input  wire                 rst_n               , //复位,低电平有效
 18 output wire                 div_clk               //分频时钟
 19 );
 20 
 21 //==================<信号>==================================================
 22 reg  [31:0]                 cnt                 ;
 23 wire                        add_cnt             ;
 24 wire                        end_cnt             ;
 25 wire                        div_clk_even        ;
 26 reg  [31:0]                 pos_cnt             ;
 27 wire                        pos_add_cnt         ;
 28 wire                        pos_end_cnt         ;
 29 reg                         pos_clk             ;
 30 reg  [31:0]                 neg_cnt             ;
 31 wire                        neg_add_cnt         ;
 32 wire                        neg_end_cnt         ;
 33 reg                         neg_clk             ;
 34 wire                        div_clk_odd         ;
 35 
 36 //==========================================================================
 37 //==    偶分频
 38 //==========================================================================
 39 always @(posedge clk or negedge rst_n) begin
 40     if(!rst_n)
 41         cnt <= 0;
 42     else if(add_cnt) begin
 43         if(end_cnt)
 44             cnt <= 0;
 45         else
 46             cnt <= cnt + 1;
 47     end
 48 end
 49 
 50 assign add_cnt = 1;
 51 assign end_cnt = add_cnt && cnt== DIV-1;
 52 
 53 assign div_clk_even = (cnt < DIV/2) ? 0 : 1;
 54 
 55 //==========================================================================
 56 //==    奇分频
 57 //==========================================================================
 58 always @(posedge clk or negedge rst_n)begin
 59     if(!rst_n)
 60         pos_cnt <= 0;
 61     else if(pos_add_cnt)begin
 62         if(pos_end_cnt)
 63             pos_cnt <= 0;
 64         else
 65             pos_cnt <= pos_cnt + 1;
 66     end
 67 end
 68 
 69 assign pos_add_cnt = 1;
 70 assign pos_end_cnt = pos_add_cnt && pos_cnt==DIV-1;
 71 
 72 always @(posedge clk or negedge rst_n)begin
 73     if(!rst_n) begin
 74         pos_clk <= 0;
 75     end
 76     else if(pos_cnt==DIV/2) begin
 77         pos_clk <= 1;
 78     end
 79     else if(pos_end_cnt) begin
 80         pos_clk <= 0;
 81     end
 82 end
 83 
 84 always @(negedge clk or negedge rst_n)begin
 85     if(!rst_n)
 86         neg_cnt <= 0;
 87     else if(neg_add_cnt)begin
 88         if(neg_end_cnt)
 89             neg_cnt <= 0;
 90         else
 91             neg_cnt <= neg_cnt + 1;
 92     end
 93 end
 94 
 95 assign neg_add_cnt = 1;
 96 assign neg_end_cnt = neg_add_cnt && neg_cnt==DIV-1;
 97 
 98 always @(negedge clk or negedge rst_n)begin
 99     if(!rst_n) begin
100         neg_clk <= 0;
101     end
102     else if(neg_cnt==DIV/2) begin
103         neg_clk <= 1;
104     end
105     else if(neg_end_cnt) begin
106         neg_clk <= 0;
107     end
108 end
109 
110 assign div_clk_odd = pos_clk || neg_clk;
111 
112 //==========================================================================
113 //==    奇偶判断后,输出正确的分频
114 //==========================================================================
115 assign div_clk = (DIV%2) ? div_clk_odd : div_clk_even;
116 
117 
118 endmodule

 

参考资料:[1]威三学院FPGA教程

转载于:https://www.cnblogs.com/xianyufpga/p/11012938.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值