HDLBits刷题合集—12 Counters

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输入指出计数器应该何时递增。

HDLBits刷题合集—12 Counters_第1张图片
代码如下:

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信号,指示高三位数字中的每一位何时应该递增。

你可能需要实例化或修改一些一位十进制计数器。

HDLBits刷题合集—12 Counters_第2张图片
代码如下:

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的翻转行为以及同步置位和使能行为。

HDLBits刷题合集—12 Counters_第3张图片
代码参考12小时时钟的Verilog设计如下:

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
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!

你可能感兴趣的:(HDLBits刷题合集—12 Counters)