HDLBits刷题合集—12 Counters
HDLBits-99 Count15
Problem Statement
构建一个4位二进制计数器,其计数范围从0到15(包括0和15),周期为16。置位输入是同步的,应该将计数器重置为0。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13module top_module ( input clk, input reset, // Synchronous active-high reset output [3:0] q); always @(posedge clk) begin if (reset) q <= 4'b0000; else q <= q + 1'b1; end endmodule
HDLBits-100 Count10
Problem Statement
构建一个十进制计数器,其计数范围从0到9(包括0和9),周期为10。置位输入是同步的,应该将计数器重置为0。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17module top_module ( input clk, input reset, // Synchronous active-high reset output [3:0] q); always @(posedge clk) begin if (reset) q <= 4'b0000; else if (q < 4'b1001) q <= q + 1'b1; else q <= 4'b0000; end endmodule
HDLBits-101 Count1to10
Problem Statement
构建一个十进制计数器,其计数范围从0到9(包括0和9),周期为10。置位输入是同步的,应该将计数器重置为1。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17module top_module ( input clk, input reset, output [3:0] q); always @(posedge clk) begin if (reset) q <= 4'b0001; else if (q <= 4'b1001) q <= q + 1'b1; else q <= 4'b0001; end endmodule
HDLBits-102 Countslow
Problem Statement
构建一个十进制计数器,其计数范围从0到9(包括0和9),周期为10。置位输入是同步的,应该将计数器重置为0。
我们希望能够暂停计数器,而不是总是每个时钟周期递增,因此slowena输入指出计数器应该何时递增。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20module top_module ( input clk, input slowena, input reset, output [3:0] q); always @(posedge clk) begin if (reset) q <= 4'b0000; else if (slowena == 1) begin if (q <= 4'b1000) q <= q + 1'b1; else q <= 4'b0000; end end endmodule
HDLBits-102 Countslow
Problem Statement
设计一个从1计数到12的计数器,输入和输出如下:
Reset:同步高电平复位,强制计数器为1
Enable:高电平有效,以使计数器计数
Clk:时钟输入上升沿触发
Q[3:0]:计数器的输出
c_enable, c_load, c_d[3:0]将控制信号发送到提供的4位计数器,从而验证操作是否正确。
你可以使用以下组件:
·下面的4位二进制计数器(count4)具有Enable和同步并行置位输入(load的优先级高于Enable)。提供的count4模块在你的电路中实例化它。
·逻辑门
1
2
3
4
5
6
7
8module count4( input clk, input enable, input load, input [3:0] d, output reg [3:0] Q );
c_enable、c_load和c_d输出分别是传递到计数器内部的enable、load和d输入的信号。它们的目的是为了检查这些信号的正确性。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25module top_module ( input clk, input reset, input enable, output [3:0] Q, output c_enable, output c_load, output [3:0] c_d ); // assign c_enable = enable; assign c_load = reset | (Q == 4'd12 & enable == 1'b1); assign c_d = 4'b1; count4 Inst_count4 ( .clk(clk), .enable(c_enable), .load(c_load), .d(c_d), .Q(Q) ); endmodule
HDLBits-103 Exams/ece241 2014 q7b
Problem Statement
从一个1000Hz的时钟信号,推导出一个1Hz的信号,称为OneHertz,可以用于数字挂钟。使用modulo-10 (BCD)计数器和尽可能少的逻辑门来构建分频器。还输出使用的每个BCD计数器的enable信号(c_enable[0]表示最快的计数器,c_enable[2]表示最慢的计数器)。
给定下面的BCD计数器。使能端enable必须为高电平才能使计数器运行。复位是同步的,并设置为高电平时迫使计数器为零。电路中的所有计数器必须直接使用相同的1000Hz信号。
1
2
3
4
5
6
7module bcdcount ( input clk, input reset, input enable, output reg [3:0] Q );
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17module top_module ( input clk, input reset, output OneHertz, output [2:0] c_enable ); // wire [3:0] q0, q1, q2; assign c_enable = {q1 == 4'd9 && q0 == 4'd9, q0 == 4'd9, 1'b1}; assign OneHertz = {q2 == 4'd9 && q1 == 4'd9 && q0 == 4'd9}; bcdcount counter0 (clk, reset, c_enable[0], q0); bcdcount counter1 (clk, reset, c_enable[1], q1); bcdcount counter2 (clk, reset, c_enable[2], q2); endmodule
HDLBits-104 Countbcd
Problem Statement
构建一个4位BCD(二进制编码的十进制)计数器。每一位十进制数字都用4位编码:q[3:0]是个位,q[7:4]是十位,等等。对于数字位[3:1],还输出一个enable信号,指示高三位数字中的每一位何时应该递增。
你可能需要实例化或修改一些一位十进制计数器。
代码如下:
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
65module top_module ( input clk, input reset, // Synchronous active-high reset output [3:1] ena, output [15:0] q); //one count Inst1_count ( .clk(clk), .reset(reset), .ena(1'b1), .q(q[3:0]) ); //ten count Inst2_count ( .clk(clk), .reset(reset), .ena(q[3:0] == 4'd9), .q(q[7:4]) ); //hundred count Inst3_count ( .clk(clk), .reset(reset), .ena(q[7:4] == 4'd9 && q[3:0] == 4'd9), .q(q[11:8]) ); //thousand count Inst4_count ( .clk(clk), .reset(reset), .ena(q[11:8] == 4'd9 && q[7:4] == 4'd9 && q[3:0] == 4'd9), .q(q[15:12]) ); //用来表示进位 assign ena = {q[11:8] == 4'd9 && q[7:4] == 4'd9 && q[3:0] == 4'd9, q[7:4] == 4'd9 && q[3:0] == 4'd9, q[3:0] == 4'd9}; endmodule module count ( input clk, input reset, input ena, output reg[3:0] q ); always @ (posedge clk) begin if(reset) q <= 4'b0; else if (ena) begin if(q == 4'd9) q <= 4'd0; else q <= q + 1'b1; end end endmodule
HDLBits-105 Count clock
Problem Statement
创建一组适合用作12小时时钟的计数器(带有am/pm指示)。该计数器通过一个快速的CLK进行计时,用ena使能信号来驱动时钟的递增(例如每秒一次)。
reset将时钟重置为12:00 AM。pm是0表示AM, 1表示pm。hh、mm和ss是两位BCD(二进制编码的十进制)数字,每一位代表小时(01-12)、分钟(00-59)和秒(00-59)。置位比使能具有更高的优先级,并且即使在未使能时也会发生重新置位。
下面的时序图显示了从上午11:59:59到下午12:00:00的翻转行为以及同步置位和使能行为。
代码参考12小时时钟的Verilog设计如下:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89module top_module( input clk, input reset, input ena, output pm, output [7:0] hh, output [7:0] mm, output [7:0] ss); count60 inst_second( .clk(clk), .reset(reset), .en(ena), .cnt_out(ss) ); count60 inst_min( .clk(clk), .reset(reset), .en(ena&(ss == 8'h59)), .cnt_out(mm) ); count12 inst_hour( .clk(clk), .reset(reset), .en(ena&(ss == 8'h59)&(mm == 8'h59)), .cnt_out(hh) ); reg p; always@(posedge clk) begin if(reset) p <= 0; else if(hh == 8'h11 && ss == 8'h59&& mm == 8'h59) p <= ~p; else ; end assign pm = p; endmodule module count60( input clk, input reset, input en, output reg [7:0] cnt_out ); always@(posedge clk) begin if(reset) cnt_out <= 0; else if(en) begin if(cnt_out == 8'h59) begin cnt_out <= 0; end else if(cnt_out[3:0] == 9) begin cnt_out[3:0] <= 0; cnt_out[7:4] <= cnt_out[7:4] + 1; end else begin cnt_out[3:0] <= cnt_out[3:0] + 1; end end end endmodule module count12 ( input clk, // Clock input reset, // Asynchronous reset active high input en, output reg [7:0] cnt_out ); always@(posedge clk) begin if(reset) cnt_out <= 8'h12; else if(en) begin if(cnt_out == 8'h12) begin cnt_out <= 1; end else if(cnt_out[3:0] == 9) begin cnt_out[3:0] <= 0; cnt_out[7:4] <= cnt_out[7:4] + 1; end else begin cnt_out[3:0] <= cnt_out[3:0] + 1; end end end endmodule
Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!
最后
以上就是超帅钥匙最近收集整理的关于HDLBits刷题合集—12 Counters的全部内容,更多相关HDLBits刷题合集—12内容请搜索靠谱客的其他文章。
发表评论 取消回复