HDLBits Count clock

HDLBits Count clock_第1张图片

 1、这个题难点在于分和秒采用两个四位的计数器来进行计数。分开一下就可以,以及计算pm那里我当时用assign赋值仿真会有错误不知道怎么解决。不过采用always赋值就没有这个错误了。

2、pm=0为上午。pm=1为下午。注意pm要变是在11:59:59之后变,之前想成12:59:59那变想错了。

HDLBits Count clock_第2张图片

完整代码如下:

完整代码如下:

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,//用来检测上午还是下午
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    wire en1,en2;
    assign en1=(ss==8'h59)?1'b1:1'b0;
    assign en2=(ss==8'h59&&mm==8'h59)?1'b1:1'b0; 
    //assign pm=(ss==8'h59&&mm==8'h59&&hh==8'h11)?(pm==0?1:0):pm;//这里仿真会报错但是波形图上没啥问题
    always@(posedge clk)begin
        if(reset)
            pm<=0;
        else if(ss==8'h59&&mm==8'h59&&hh==8'h11)begin
            pm<=!pm;
        end
    end
    
    
    sm sm_u1( .clk(clk),.reset(reset),.ena(ena),.ss(ss));
    sm sm_u2( .clk(clk),.reset(reset),.ena(en1),.ss(mm));
    hhh hhh_u1(.clk(clk),.reset(reset),.ena(en2),.hh(hh));
endmodule

module sm( //分钟和秒钟
    input clk,
    input reset,
    input ena,
    output [7:0] ss);
    
    always@(posedge clk)begin
        if(reset)begin
           ss<=8'd0; 
        end
        else if(ena)begin
            if(ss[3:0]==4'd9)begin
                ss[3:0]<=4'h0;
                if(ss[7:4]==4'd5)
                    ss[7:4]<=4'h0; 
                else
                    ss[7:4]<=ss[7:4]+1'b1;
            end
            else 
                ss[3:0]<=ss[3:0]+1'b1;   
        end
        else
            ss<=ss;           
    end 
endmodule

module hhh( //小时
    input clk,
    input reset,
    input ena,
    output [7:0] hh);
    
  always@(posedge clk)begin
        if(reset)begin
            hh[7:4]<=4'd1;
            hh[3:0]<=4'd2;
        end
        else if(ena)begin
            if(hh[7:4]==4'h1)begin
                if(hh[3:0]==4'h2)begin
                    hh[7:4]<=4'd0;
                    hh[3:0]<=4'd1;
                end
                else 
                    hh[3:0]<=hh[3:0]+4'd1;
            end
            else begin
                if(hh[3:0]==4'h9)begin
                    hh[7:4]<=4'd1;
                    hh[3:0]<=4'd0;
                end
                else
                    hh[3:0]<=hh[3:0]+4'd1; 
           end 
        end
        else
            hh<=hh;  
      
  end
endmodule

你可能感兴趣的:(FPGA,HDLBits刷题,fpga开发)