HDLBits Day12 count clock 做一个钟表

在这里插入图片描述
1.BCD码进位时,判断条件是 if(m < 8’h59),这里是用16进制数表示,即4位二进制数表示5,四位二进制数表示9,BCD数实际上就是十六进制数,不过是人为设置满10进1.
自己写的:

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

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

endmodule 

tb文件:

`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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个基本的 Java 程序,用于绘制时钟表。它使用 Graphics2D 类来绘制表盘和指针。 ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.Calendar; import javax.swing.JFrame; import javax.swing.JPanel; public class Clock extends JPanel { private int hour; private int minute; private int second; public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 获取当前时间 Calendar calendar = Calendar.getInstance(); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); second = calendar.get(Calendar.SECOND); // 绘制表盘 g2.setColor(Color.WHITE); g2.fillOval(10, 10, 200, 200); g2.setColor(Color.BLACK); g2.drawOval(10, 10, 200, 200); // 绘制时针 g2.rotate(Math.toRadians((hour * 30) + (minute / 2)), 110, 110); g2.setColor(Color.BLACK); g2.drawLine(110, 110, 110, 60); // 绘制分针 g2.rotate(Math.toRadians((minute * 6) + (second / 10)), 110, 110); g2.setColor(Color.BLACK); g2.drawLine(110, 110, 110, 40); // 绘制秒针 g2.rotate(Math.toRadians(second * 6), 110, 110); g2.setColor(Color.RED); g2.drawLine(110, 110, 110, 20); // 绘制中心点 g2.setColor(Color.BLACK); g2.fillOval(105, 105, 10, 10); } public static void main(String[] args) { JFrame frame = new JFrame("Clock"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(240, 240); frame.setResizable(false); Clock clock = new Clock(); frame.add(clock); frame.setVisible(true); // 每秒钟重绘一次 while (true) { clock.repaint(); try { Thread.sleep(1000); } catch (InterruptedException ex) {} } } } ``` 该程序创建了一个 JFrame 窗口,将 Clock 对象添加到其中,并使用 while 循环每秒钟重绘一次。在 Clock 对象的 paint() 方法中,绘制了表盘、时针、分针和秒针。绘制时针、分针和秒针时,使用 Graphics2D 的 rotate() 方法使其旋转到正确的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值