Verilog – 奇数分频器
偶数分频的原理就是计数到N/2-1后对分频输出取反。而如果分频数N为基数,则需要:
clk_out1 在clk 上升沿计数到 (N-1)/2-1后取反, 计数到N-1以后再取反
clk_out2 在clk 下降沿计数到 (N-1)/2-1后取反, 计数到N-1以后再取反
clk_out 取clk_out1 和 clk_out2的或。
代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62module clk_div #( parameter DIV = 3 ) ( input clk_in, input rst_n, output clk_out ); parameter WIDTH = $clog2(DIV); parameter HALF_DIV = (DIV-1)/2; reg [WIDTH-1:0] cnt; reg clk_div1; reg clk_div2; assign clk_out = clk_div1 | clk_div2; always@(posedge clk_in or negedge rst_n) begin if (!rst_n) begin cnt <= 0; end else begin if(cnt == DIV-1) cnt <= 0; else cnt <= cnt + 1; end end always@(posedge clk_in or negedge rst_n) begin if (!rst_n) begin clk_div1 <= 0; end else begin if(cnt==HALF_DIV-1) begin clk_div1 <= 0; end else if(cnt == DIV-1)begin clk_div1 <= 1; end else begin clk_div1 <= clk_div1; end end end always@(negedge clk_in or negedge rst_n) begin if (!rst_n) begin clk_div2 <= 0; end else begin if(cnt==HALF_DIV-1) begin clk_div2 <= 0; end else if(cnt == DIV-1)begin clk_div2 <= 1; end else begin clk_div2 <= clk_div2; end end end endmodule
testbench:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35`timescale 1ns/1ps module clk_div_tb(/*autoarg*/); reg clk_in; reg rst_n; wire clk_out; always #1 clk_in = ~clk_in; initial begin clk_in = 1; rst_n = 1; #2 rst_n = 0; #2 rst_n = 1; end initial begin $fsdbDumpvars(); $fsdbDumpMDA(); $dumpvars(); #100 $finish; end clk_div #( .DIV ( 3 )) U_CLK_DIV_0( .clk_in ( clk_in ), .rst_n ( rst_n ), .clk_out ( clk_out ) ); endmodule
仿真波形:
最后
以上就是欣喜萝莉最近收集整理的关于Verilog -- 奇数分频器Verilog – 奇数分频器的全部内容,更多相关Verilog内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复