Count clock 创建时钟计数器

 注意:

1. 二进制中9后面为a,而不是10,因此十位以上的数需要将个位和十位分开讨论,即 s[3:0]==4‘d9是否成立,若成立再判断s[7:4]==4'd5是否成立

2. 此题中12表示为十六进制的 8'h12 , 而不是十进制的 8'd12

3. 复位为12:00:00,pm为0

4.时针为12后不复位到0,而复位到1

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    
    wire enam,enah,enap;
    assign enam=(ss==8'h59);
    assign enah=(ss==8'h59 && mm==8'h59);
    assign enap=(ss==8'h59 && mm==8'h59 && hh==8'h11);
    
    s s1(.clk(clk),.reset(reset),.ena(ena),.ss(ss));
    m m1(.clk(clk),.reset(reset),.ena(enam),.mm(mm));
    h h1(.clk(clk),.reset(reset),.ena(enah),.hh(hh));
    p p1(.clk(clk),.reset(reset),.ena(enap),.pm(pm));

endmodule

module s(input clk, input reset, input ena, output [7:0]ss);
    always@(posedge clk) begin
        if(reset) ss<=0;
        else if(ena) begin
            if(ss[3:0]==4'd9) begin ss[3:0]<=0;
                if(ss[7:4]==4'd5) ss[7:4]<=0;
                else ss[7:4]++; end
            else ss[3:0]++;
        end
    end
endmodule

module m(input clk, input reset, input ena, output [7:0]mm);
    always@(posedge clk) begin
        if(reset) mm<=0;
        else if(ena) begin
            if(mm[3:0]==4'd9) begin mm[3:0]<=0;
                if(mm[7:4]==4'd5) mm[7:4]<=0;
                else mm[7:4]++; end
            else mm[3:0]++;
        end
    end
endmodule

module h(input clk, input reset, input ena, output [7:0]hh);
    always@(posedge clk) begin
        if(reset) hh<=8'h12;
        else if(ena) begin
            if(hh==8'h12) hh<=1;
            else if(hh[3:0]==4'd9) begin hh[3:0]<=0; hh[7:4]++; end
            else hh[3:0]++;
        end
    end
endmodule

module p(input clk, input reset, input ena, output pm);
    always@(posedge clk) begin
        if(reset) pm<=0;
        else if(ena) pm=~pm;
    end
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog时钟计数器是一种用于对时钟信号进行计数的电路设计。它可以用于分频器、FIFO设计等场景中。在Verilog中,可以使用计数器模块来实现时钟计数器的功能。例如,可以使用8位计数器模块来实现一个8位的时钟计数器。 在给定的Verilog代码中,模块Count_1是一个8位计数器模块。它有一个时钟输入clk和一个复位输入rst_n。在每个时钟上升沿或复位信号下降沿时,计数器会根据当前计数值进行更新。当复位信号为低电平时,计数器会被清零。当计数值达到49时,计数器会重新计数。同时,模块还有一个输出out,根据计数值的不同,在特定的计数值时会改变输出值。 在测试文件Count_1_tb中,模块实例化了Count_1模块,并提供了时钟信号clk和复位信号rst_n。在初始化阶段,时钟信号被初始化为低电平,并通过always块进行周期性翻转。复位信号在开始时被置为低电平,经过一段时间后再置为高电平。测试文件中的时钟周期定义为`Clock,可以根据需要进行调整。 综上所述,给定的Verilog代码实现了一个8位的时钟计数器,可以根据时钟信号进行计数,并在特定的计数值时改变输出值。 #### 引用[.reference_title] - *1* [计数器(Verilog)](https://blog.csdn.net/SummerXRT/article/details/119107916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Verilog基础知识-——计数器设计以及任意分频设计与modelsim仿真](https://blog.csdn.net/H19981118/article/details/115353714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值