HDLBits刷题合集—12 Counters
HDLBits-99 Count15
Problem Statement
构建一个4位二进制计数器,其计数范围从0到15(包括0和15),周期为16。置位输入是同步的,应该将计数器重置为0。
module 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。
代码如下:
module 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。
module 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输入指出计数器应该何时递增。
module 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模块在你的电路中实例化它。
·逻辑门
module 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输入的信号。它们的目的是为了检查这些信号的正确性。
代码如下:
module 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信号。
module bcdcount (
input clk,
input reset,
input enable,
output reg [3:0] Q
);
代码如下:
module 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信号,指示高三位数字中的每一位何时应该递增。
你可能需要实例化或修改一些一位十进制计数器。
module 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的翻转行为以及同步置位和使能行为。
module 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
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!