我是靠谱客的博主 快乐树叶,最近开发中收集的这篇文章主要介绍HDLBits练习汇总-11-时序逻辑设计测试--计数器4 位二进制计数器十进制计数器十进制计数器1慢计数1-12计数计数器10004 位 BCD计数器Count clock,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

4 位二进制计数器

构建一个 4 位二进制计数器,从 0 到 15(含)计数,周期为 16。复位输入是同步的,应将计数器复位为 0。

image-20210824143731705

Module Declaration

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);

答案:

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);
    always @ (posedge clk)begin
        if(reset==1)begin
        	q <= 0; 
        end
        else begin
            q <= q + 1;
        end
    end
endmodule

十进制计数器

构建一个十进制计数器,从 0 到 9(含)计数,周期为 10。复位输入是同步的,应将计数器复位为 0。

Module Declaration

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);

答案:

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output [3:0] q);
	always @ (posedge clk)begin
        if(reset==1)begin
        	q <= 0; 
        end
        else if(q==9)begin
        	q <= 0;
        end
        else begin
            q <= q + 1;
        end
    end
endmodule

十进制计数器1

制作一个从 1 到 10(包括 1 到 10)计数的十年计数器。复位输入是同步的,应将计数器复位为 1。

image-20210824144418702

Module Declaration

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);

答案:

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output [3:0] q);
	always @ (posedge clk)begin
        if(reset==1)begin
        	q <= 1; 
        end
        else if(q==10)begin
        	q <= 1;
        end
        else begin
            q <= q + 1;
        end
    end
endmodule

慢计数

构建一个从 0 到 9 计数的十进制计数器,周期为 10。重置输入是同步的,应该将计数器重置为 0。我们希望能够暂停计数器而不是每个时钟周期总是递增,所以slowena输入指示计数器何时应该增加。
在这里插入图片描述
Module Declaration

module top_module (
    input clk,
    input slowena,
    input reset,
    output [3:0] q);

答案:

module top_module (
    input clk,
    input slowena,
    input reset,
    output [3:0] q);
    always @(posedge clk)begin
        if(reset == 1)begin
        	q <= 0; 
        end
        else if(slowena ==1)begin
            if(q==9)begin
            	q <= 0; 
            end
            else begin
        		q <= q + 1; 
            end
        end
    end
endmodule

1-12计数

设计一个具有以下输入和输出的 1-12 计数器:

Reset : 同步高电平有效复位,强制计数器为 1
Enable : 使计数器运行设置为高
Clk : 正边沿触发时钟输入
Q[3:0] : 计数器的输出
c_enable, c_load, c_d[3:0] : 进入提供的 4 位计数器的控制信号,因此可以验证正确的操作。
您可以使用以下组件:
下面的 4 位二进制计数器 ( count4 ),它具有使能和同步并行加载输入(加载的优先级高于使能)。该count4模块提供给你。在您的电路中实例化它。

module count4(
	input clk,
	input enable,
	input load,
	input [3:0] d,
	output reg [3:0] Q
);

c_enable、c_load 和 c_d 输出分别是进入内部计数器的启用、加载和 d 输入的信号。 它们的目的是允许检查这些信号的正确性。
Module Declaration

module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0] Q,
    output c_enable,
    output c_load,
    output [3:0] c_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
); //
    always@(posedge clk)begin 
        if(reset == 1)begin
        	Q <= 1;
        end
        else if(enable == 1)begin 
            if(Q==12)begin
            	Q<=1; 
            end
            else begin
            	Q <= Q + 1;
            end
        end
    end
    assign c_enable = enable;
    assign c_load = (reset==1)|(Q==12&&enable);
    assign c_d = (reset==1)|(Q==12) ;
        count4 the_counter (clk, c_enable, c_load, c_d /*, ... */ );

endmodule

计数器1000

从 1000 Hz 时钟导出一个 1 Hz 信号,称为OneHertz,可用于驱动一组小时/分钟/秒计数器的启用信号以创建数字挂钟。由于我们希望时钟每秒计数一次,因此OneHertz信号必须每秒被断言恰好一个周期。使用模 10 (BCD) 计数器和尽可能少的其他门构建分频器。还从您使用的每个 BCD 计数器输出启用信号(c_enable[0] 表示最快的计数器,c_enable[2] 表示最慢的计数器)。

为您提供了以下 BCD 计数器。Enable必须为高电平才能运行计数器。复位是同步的并设置为高电平以强制计数器归零。电路中的所有计数器必须直接使用相同的 1000 Hz 信号。

module bcdcount (
	input clk,
	input reset,
	input enable,
	output reg [3:0] Q
);

Module Declaration

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); 

答案:

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    wire [3:0] Q1,Q2,Q3;
    assign c_enable[0] = 1;
    assign c_enable[1] =(Q1==9);
    assign c_enable[2] =(Q2==9 && Q1==9);
    assign OneHertz =(Q1==9 && Q2==9 && Q3==9);
    bcdcount counter0 (clk, reset, c_enable[0],Q1);
    bcdcount counter1 (clk, reset, c_enable[1],Q2);
    bcdcount counter2 (clk, reset, c_enable[2],Q3);
endmodule

4 位 BCD计数器

构建一个 4 位 BCD(二进制编码的十进制)计数器。每个十进制数字使用 4 位编码:q[3:0] 是个位,q[7:4] 是十位等。对于数字 [3:1],还输出一个使能信号,指示每个上面的三位数字应该递增。
在这里插入图片描述
Module Declaration

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);

答案:

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    assign ena[1] =(q[3:0]==9) ;
    assign ena[2] =(q[3:0]==9&&q[7:4]==9) ;
    assign ena[3] =(q[3:0]==9&&q[7:4]==9&&q[11:8]==9) ;
    bcd bcd0(clk,reset,1,q[3:0]);
    bcd bcd1(clk,reset,ena[1],q[7:4]);
    bcd bcd2(clk,reset,ena[2],q[11:8]);
    bcd bcd3(clk,reset,ena[3],q[15:12]);
endmodule

module bcd (
    input clk,
    input reset,// Synchronous active-high reset
    input ena,
    output [3:0] q);
	always @ (posedge clk)begin
        if(reset==1)begin
        	q <= 0; 
        end
        else if (ena==1)begin 
            if(q==9)begin
                q <= 0;
            end
            else begin
                q <= q + 1;
            end
        end
        else begin
           q<=q; 
        end
    end
endmodule

Count clock

创建一组适合用作 12 小时制的计数器(带有 am/pm 指示器)。您的计数器由快速运行的clk计时,每当您的时钟应增加(即每秒一次)时,就会在ena上发出脉冲。

reset将时钟重置为 12:00 AM。pm是 0 代表上午,1 ​​代表下午。hh、mm和ss是两个BCD(二进制编码的十进制)数字,每个数字表示小时 (01-12)、分钟 (00-59) 和秒 (00-59)。复位的优先级高于使能,即使未使能也可能发生。

以下时序图显示了从上午 11:59:59到下午 12:00:00的翻转行为以及同步复位和启用行为。
在这里插入图片描述
Note that 11:59:59 PM advances to 12:00:00 AM, and 12:59:59 PM advances to 01:00:00 PM. There is no 00:00:00.

Module Declaration

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 

答案:

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    always @ (posedge clk)begin
        if(reset==1)
            pm <= 0;
        else if(ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9 && mm[7:4]==5 && hh[3:0]==1 && hh[7:4]==1)
            pm <= ~pm; 
        else
            pm <= pm;
    end

    always @ (posedge clk)begin
        if(reset==1)begin
            hh[7:4] <= 1; 
        end
        else if (ena==1)begin 
            if(ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9 && mm[7:4]==5 && hh[3:0]==2 && hh[7:4]==1)begin
                hh[7:4]<= 0;
            end
            else if(ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9 && mm[7:4]==5 && hh[3:0]==9) begin
                hh[7:4] <= hh[7:4] + 1;
            end
        end
        else begin
            hh[7:4]<=hh[7:4]; 
        end
    end
	always @ (posedge clk)begin
        if(reset==1)begin
            hh[3:0] <= 2; 
        end
        else if (ena==1)begin 
            if(ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9 && mm[7:4]==5 && hh[3:0]==2 && hh[7:4]==1)begin
                hh[3:0]<= 1;
            end
            else if(hh[3:0]==9 && ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9 && mm[7:4]==5)begin
            	hh[3:0]<= 0;
            end
            else if(ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9 && mm[7:4]==5)begin
                hh[3:0] <= hh[3:0] + 1;
            end
        end
        else begin
           hh[3:0]<=hh[3:0]; 
        end
    end
    
    always @ (posedge clk)begin
        if(reset==1)begin
            mm[7:4] <= 0; 
        end
        else if (ena==1)begin 
            if(mm[7:4]==5 && ss[3:0]==9 && ss[7:4]==5 && mm[3:0]==9)begin
            	mm[7:4]<= 0;
            end
            else if(mm[3:0]==9 && ss[3:0]==9 && ss[7:4]==5 ) begin
                mm[7:4] <= mm[7:4] + 1;
            end
        end
        else begin
           mm[7:4]<=mm[7:4]; 
        end
    end
	always @ (posedge clk)begin
        if(reset==1)begin
            mm[3:0] <= 0; 
        end
        else if (ena==1)begin 
            if(mm[3:0]==9 && ss[3:0]==9 && ss[7:4]==5)begin
               mm[3:0]<= 0;
            end
            else if( ss[3:0]==9 && ss[7:4]==5 )begin
                mm[3:0] <= mm[3:0] + 1;
            end
        end
        else begin
           mm[3:0]<=mm[3:0]; 
        end
    end
    
    
    always @ (posedge clk)begin
        if(reset==1)begin
            ss[7:4] <= 0; 
        end
        else if (ena==1)begin 
            if(ss[7:4]==5 && ss[3:0]==9)begin
            	ss[7:4]<= 0;
            end
            else if(ss[3:0]==9) begin
                ss[7:4] <= ss[7:4] + 1;
            end
            else begin
            	ss[7:4]<=ss[7:4];   
            end
        end
        else begin
           ss[7:4]<=ss[7:4]; 
        end
    end
	always @ (posedge clk)begin
        if(reset==1)begin
            ss[3:0] <= 0; 
        end
        else if (ena==1)begin 
            if(ss[3:0]==9)begin
               ss[3:0]<= 0;
            end
            else begin
                ss[3:0] <= ss[3:0] + 1;
            end
        end
        else begin
           ss[3:0]<=ss[3:0]; 
        end
    end

endmodule

最后

以上就是快乐树叶为你收集整理的HDLBits练习汇总-11-时序逻辑设计测试--计数器4 位二进制计数器十进制计数器十进制计数器1慢计数1-12计数计数器10004 位 BCD计数器Count clock的全部内容,希望文章能够帮你解决HDLBits练习汇总-11-时序逻辑设计测试--计数器4 位二进制计数器十进制计数器十进制计数器1慢计数1-12计数计数器10004 位 BCD计数器Count clock所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部