Circuits--Sequential Logic--Counters--Count clock

网址:https://hdlbits.01xz.net/wiki/Count_clock
自己写:

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 )
        if (reset == 1'b1) 
            ss <= 8'h00;
   	 	else if(ena == 1'b1) 
            begin
        		if(ss == 8'h59)
        		   ss <= 8'h00;
        		else   
                    begin
                        if(ss[3:0] < 4'h9)
                           ss[3:0] <= ss[3:0] + 1'h1; 
                         else
                              begin
                               ss[3:0] <= 0;
                               ss[7:4] <= ss[7:4] + 1'h1;
                               end 
        			end
        	end
    
    always@(posedge clk) begin
        if (reset == 1'b1) 
            mm <= 8'h00;
        else if(ena == 1'b1) 
            begin
            	  if(ss == 8'h59)
                      begin
                      		if(mm == 8'h59 )
            	  				mm <= 8'h00;
            	  			else  
                                begin
            	  			    	if(mm[3:0] < 4'h9)
            	  			    	    mm[3:0] <= mm[3:0] + 1'h1; 
            	  			    	 else
            	  			    	     begin
            	  			    	        mm[3:0] <= 0;
            	  			    	         mm[7:4] <= mm[7:4] + 1'h1;
            	  			    	     end 
                                end
                      end
            end

    end

       
    always@(posedge clk )
        if (reset == 1'b1)
            hh <= 8'h12;
    else if(ena == 1'b1) 
            begin
            	if(mm == 8'h59 && ss == 8'h59) 
            	    begin
            			if(hh == 8'h12)
            				hh <= 8'h01;
            			else  if(hh[3:0] < 4'h9)
            			    hh[3:0] <= hh[3:0] + 1'h1; 
            			else
            			     begin
            			         hh[3:0] <= 0;
            			         hh[7:4] <= hh[7:4] + 1'h1;
            			     end 
            	     end                    
           end
    	else
            hh <= hh;
    
    always@(posedge clk )
        if (reset == 1'b1) 
                 pm <= 0;
    else if(hh ==  8'h11 && mm == 8'h59 && ss == 8'h59)
        	pm =!pm;
        

endmodule

整体写_顶层文件:

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

    reg p;	//0 was am, 1 was pm
    reg [7:0] h;
    reg [7:0] m;
    reg [7:0] s;

    always @ (posedge clk)
        begin
            if(reset)
                begin
                    p <= 0;
                    h <= 8'h12;
                    m <= 8'h00;
                    s <= 8'h00;
                end
            else
                begin
                    if(ena)
                        begin
                            if(s < 8'h59)
                                begin
                                    if(s[3:0] < 4'h9)
                                        begin
                                            s[3:0] <= s[3:0] + 1'h1; 
                                        end
                                    else
                                        begin
                                            s[3:0] <= 0;
                                            s[7:4] <= s[7:4] + 1'h1;
                                        end 
                                end
                            else
                                begin
                                    s <= 0;
                                    if(m < 8'h59)
                                        begin
                                            if(m[3:0] < 4'h9)
                                                begin
                                                    m[3:0] <= m[3:0] + 1'h1; 
                                                end 
                                            else
                                                begin
                                                    m[3:0] <= 0;
                                                    m[7:4] <= m[7:4] + 1'h1;
                                                end
                                        end
                                    else
                                        begin
                                            m <= 1'h0;
                                            if(h == 8'h11)
                                                p = !p;
                                            if(h < 8'h12)
                                                begin
                                                    if(h[3:0] < 4'h9)
                                                        h[3:0] <= h[3:0] + 1'h1;
                                                    else
                                                        begin
                                                            h[3:0] <= 4'h0;
                                                            h[7:4] <= h[7:4] + 1'h1;
                                                        end
                                                end
                                            else
                                                begin
                                                   h <= 8'h01; 
                                                end
                                        end
                                end
                        end
                end
        end

    assign pm = p;
    assign hh = h;
    assign mm = m;
    assign ss = s;

endmodule 

整体写_测试文件:

`timescale 1ns / 1ns
module tb();

	reg clk,reset,ena;
	wire pm;
	wire[7:0] hh,mm,ss;
	syn_fifo syn_fifo 
    (
         clk,
        reset,
        ena,
         pm,
         hh,
         mm,
        ss
    );
	initial begin 
		clk = 1'b0;
		forever #10 clk = ~clk;
	end
	
	initial begin
		reset = 1'b0;
		ena = 1'b1;
		#100 reset = 1'b1;
		#100 reset = 1'b0;
	end
	
endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余睿Lorin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值