我是靠谱客的博主 愤怒小虾米,这篇文章主要介绍Verilog语法基础HDL Bits训练11:CountersCircuits:Sequential Logic:Counters,现在分享给大家,希望可以做个参考。

文章目录

  • Circuits:Sequential Logic:Counters
    • 一、Four-bit binary counter
    • 二、Decade counter
    • 三、Decade counter again
    • 四、Slow decade counte
    • 五、Counter 1-12
    • 六、Counter 1000
    • 七、4-digit decimal counter
    • 八、12-hour clock

Circuits:Sequential Logic:Counters

一、Four-bit binary counter

在这里插入图片描述
设计一个四位的计数器,从0计数到15,并且有同步复位。

  • RTL代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module top_module ( input clk, input reset, // Synchronous active-high reset output reg[3:0] q); always @(posedge clk) if(reset) q <= 1'b0; else if(q == 4'd15) q <= 1'b0; else q <= q + 1'b1; endmodule
  • 仿真波形图
    在这里插入图片描述

二、Decade counter

在这里插入图片描述
设计一个计数值为10的十进制计数器,从0计数到9,并且有同步复位

  • RTL代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module top_module ( input clk, input reset, // Synchronous active-high reset output [3:0] q); always @(posedge clk) if(reset) q <= 1'b0; else if(q == 4'd9) q <= 1'b0; else q <= q + 1'b1; endmodule
  • 仿真波形图
    在这里插入图片描述

三、Decade counter again

在这里插入图片描述
设计一个计数值为10的十进制计数器,计数值从1到10,且有同步复位

  • RTL代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
module top_module ( input clk, input reset, output [3:0] q); always @(posedge clk) if(reset) q <= 1'b1; else if(q == 4'd10) q <= 1'b1; else q <= q + 1'b1; endmodule
  • 仿真波形图
    在这里插入图片描述

四、Slow decade counte

在这里插入图片描述
设计一个缓慢的计数值为10的从0到9的十进制计数器,要求在slowena信号为高电平的时候计数值进行计数,否则保持原来的计数状态。

  • RTL代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module top_module ( input clk, input slowena, input reset, output [3:0] q); always @(posedge clk) if(reset) q <= 1'b0; else if(q == 4'd9 && slowena) q <= 1'b0; else if(slowena) q <= q + 1'b1; else q <= q; endmodule
  • 仿真波形图
    在这里插入图片描述
    在这里插入图片描述

五、Counter 1-12

在这里插入图片描述

  • RTL代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module top_module ( input clk, input reset, input enable, output [3:0] Q, output c_enable, output c_load, output [3:0] c_d ); // count4 the_counter (clk, c_enable, c_load, c_d ,Q); assign c_enable = enable; assign c_load = ((Q >= 4'd12) && enable) | reset; assign c_d = c_load? 4'd1:4'd0; endmodule
  • 仿真波形图
    在这里插入图片描述

六、Counter 1000

在这里插入图片描述

  • RTL代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module top_module ( input clk, input reset, output OneHertz, output [2:0] c_enable ); // wire [3:0] one,ten,hundred; assign c_enable = {one == 4'd9&&ten == 4'd9,one == 4'd9,1'b1}; assign OneHertz = one == 4'd9&&ten == 4'd9&&hundred == 4'd9; bcdcount counter0 (clk, reset, c_enable[0],one); bcdcount counter1 (clk, reset, c_enable[1],ten); bcdcount counter2 (clk, reset, c_enable[2],hundred); endmodule
  • 仿真波形图
    在这里插入图片描述
    在这里插入图片描述

七、4-digit decimal counter

在这里插入图片描述

  • RTL代码
复制代码
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
module top_module ( input clk, input reset, // Synchronous active-high reset output [3:1] ena, output [15:0] q); reg [3:0]one; reg [3:0]ten; reg [3:0]hundred; reg [3:0]thousand; always @(posedge clk) if(reset) one <= 1'b0; else if(one == 4'd9) one <= 1'b0; else one <= one + 1'b1; always @(posedge clk) if(reset) ten <= 1'b0; else if(ten == 4'd9 && one == 4'd9) ten <= 1'b0; else if(one == 4'd9) ten <= ten + 1'b1; always @(posedge clk) if(reset) hundred <= 1'b0; else if(hundred == 4'd9 && ten == 4'd9 && one == 4'd9) hundred <= 1'b0; else if(ten == 4'd9 && one == 4'd9) hundred <= hundred + 1'b1; always @(posedge clk) if(reset) thousand <= 1'b0; else if(thousand == 4'd9 && hundred == 4'd9 && ten == 4'd9 && one == 4'd9) thousand <= 1'b0; else if(hundred == 4'd9 && ten == 4'd9 && one == 4'd9) thousand <= thousand + 1'b1; assign q = {thousand,hundred,ten,one}; assign ena[1] = (one == 4'd9)? 1'b1:1'b0; assign ena[2] = (ten == 4'd9 && one == 4'd9)? 1'b1:1'b0; assign ena[3] = (hundred == 4'd9 && ten == 4'd9 && one == 4'd9)? 1'b1:1'b0; endmodule
  • 仿真波形图
    在这里插入图片描述

八、12-hour clock

在这里插入图片描述
设计一个12小时计的时钟

  • RTL代码
复制代码
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
62
63
64
65
module top_module( input clk, input reset, input ena, output reg pm, output [7:0] hh, output [7:0] mm, output [7:0] ss); reg [3:0]s1,s2; reg [3:0]m1,m2; reg [3:0]h1,h2; always @(posedge clk) if(reset) s1 <= 1'b0; else if(s1 == 4'd9 && ena) s1 <= 1'b0; else if(ena) s1 <= s1 + 1'b1; always @(posedge clk) if(reset) s2 <= 1'b0; else if(s2 == 4'd5 && s1 == 4'd9 && ena) s2 <= 1'b0; else if(s1 == 4'd9 && ena) s2 <= s2 + 1'b1; always @(posedge clk) if(reset) m1 <= 1'b0; else if(m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) m1 <= 1'b0; else if(s2 == 4'd5 && s1 == 4'd9 && ena) m1 <= m1 + 1'b1; always @(posedge clk) if(reset) m2 <= 1'b0; else if(m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) m2 <= 1'b0; else if(m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) m2 <= m2 + 1'b1; always @(posedge clk) if(reset) h1 <= 4'd2; else if(h1 == 4'd2 && h2 == 4'd1 && m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) h1 <= 1'b1; else if(h1 == 4'd9 && h2 == 4'd0 && m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) h1 <= 1'b0; else if(m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) h1 <= h1 + 1'b1; always @(posedge clk) if(reset) h2 <= 4'd1; else if(h1 == 4'd2 && h2 == 4'd1 && m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) h2 <= 1'b0; else if(h1 == 4'd9 && m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) h2 <= h2 + 1'b1; assign hh = {h2,h1}; assign mm = {m2,m1}; assign ss = {s2,s1}; always @(posedge clk) if(reset) pm <= 1'b0; else if(h2 == 4'd1 && h1 == 4'd1 && m2 == 4'd5 && m1 == 4'd9 && s2 == 4'd5 && s1 == 4'd9 && ena) pm <= ~pm; endmodule
  • 仿真波形图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

最后

以上就是愤怒小虾米最近收集整理的关于Verilog语法基础HDL Bits训练11:CountersCircuits:Sequential Logic:Counters的全部内容,更多相关Verilog语法基础HDL内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部