HDU 5387 Clock

本文介绍了一种计算特定时间下时钟上时针、分针及秒针之间角度的方法,并通过编程实现这一计算过程。利用时间与角度之间的转换公式,将时间转换为度数,进而计算出三者间的精确夹角。

分析:给你一个时间,让你输出3个时分,时秒,分秒的夹角。如果时间是hh(0<=hh<12),mm,ss,那么度数分别是s=6*ss; m=6*mm+ss/10; h=30*hh+mm/2+ss/120; 然后给每个角度都乘以120,这样得出来的角度都是整数了,用k先记录着,这样夹角除以k就行了。

# include <stdio.h>
# define abs(x) x>0?x:-(x);
  int gcd(int a,int b)
  {
      return b?gcd(b,a%b):a;
  }
  int main()
  {
      int i,k,t,hh,mm,ss,h,m,s,ans[4],g[4];
      scanf("%d",&t);
      while(t--)
      {
          scanf("%d:%d:%d",&hh,&mm,&ss);
          if(hh>=12)
            hh-=12;
          k=120;
          h=3600*hh+60*mm+ss;
          m=720*mm+12*ss;
          s=720*ss;
          ans[1]=abs(h-m);ans[2]=abs(h-s);ans[3]=abs(m-s);
          for(i=1;i<=3;i++)
            if(ans[i]>180*k)
              ans[i]=360*k-ans[i];
          for(i=1;i<=3;i++)
          {
              g[i]=gcd(ans[i],k);
              if(k/g[i]==1)
                printf("%d ",ans[i]/g[i]);
              else
                printf("%d/%d ",ans[i]/g[i],k/g[i]);
          }
          putchar('\n');
      }
      return 0;
  }


### 16位补码加减运算设计:顶层文件、运算器、缓存寄存器、仿真寄存器及约束文件 以下内容详细描述了在Vivado平台上为FPGA型号`xa7100tfgg484-2L`和板卡`HDU-XL-01`生成用于16位补码加减运算的完整设计流程,包括顶层文件、运算器文件、缓存寄存器文件、仿真寄存器文件以及约束文件。 --- ### ### 顶层文件设计 顶层文件负责整合各个模块,并提供接口供外部调用。以下是顶层文件的Verilog代码示例: ```verilog module top_module ( input wire clk, // 时钟信号 input wire reset, // 复位信号 input wire [15:0] a, // 输入A(16位有符号数) input wire [15:0] b, // 输入B(16位有符号数) input wire op, // 操作选择:0-加法,1-减法 output reg [15:0] result // 输出结果 ); // 缓存寄存器实例化 reg [15:0] a_reg; reg [15:0] b_reg; reg op_reg; always @(posedge clk or posedge reset) begin if (reset) begin a_reg <= 16'b0; b_reg <= 16'b0; op_reg <= 1'b0; end else begin a_reg <= a; b_reg <= b; op_reg <= op; end end // 运算器实例化 signed_add_sub add_sub_inst ( .a(a_reg), .b(b_reg), .op(op_reg), .result(result) ); endmodule ``` --- ### ### 运算器文件设计 运算器模块实现了16位补码加减运算的核心逻辑。以下是运算器的Verilog代码: ```verilog module signed_add_sub ( input wire [15:0] a, // 输入A(16位有符号数) input wire [15:0] b, // 输入B(16位有符号数) input wire op, // 操作选择:0-加法,1-减法 output reg [15:0] result // 输出结果 ); always @(*) begin if (op == 1'b0) begin result = a + b; // 加法操作 end else begin result = a - b; // 减法操作 end end endmodule ``` --- ### ### 缓存寄存器文件设计 缓存寄存器模块用于存储输入数据和操作指令,确保在时钟周期内数据稳定。以下是缓存寄存器的Verilog代码: ```verilog module cache_register ( input wire clk, // 时钟信号 input wire reset, // 复位信号 input wire [15:0] data_in, // 输入数据 output reg [15:0] data_out // 输出数据 ); always @(posedge clk or posedge reset) begin if (reset) begin data_out <= 16'b0; end else begin data_out <= data_in; end end endmodule ``` --- ### ### 仿真寄存器文件设计 仿真寄存器文件用于测试和验证设计的功能正确性。以下是仿真寄存器的Verilog代码: ```verilog module testbench; reg clk; reg reset; reg [15:0] a; reg [15:0] b; reg op; wire [15:0] result; // 实例化顶层模块 top_module uut ( .clk(clk), .reset(reset), .a(a), .b(b), .op(op), .result(result) ); initial begin clk = 0; forever #5 clk = ~clk; // 生成时钟信号 end initial begin $dumpfile("testbench.vcd"); $dumpvars(0, testbench); // 初始化信号 reset = 1; a = 16'b0; b = 16'b0; op = 1'b0; #10; reset = 0; // 测试加法 a = 16'b0000000000001100; // +12 b = 16'b0000000000000101; // +5 op = 1'b0; // 加法 #20; $display("Addition: %d + %d = %d", a, b, result); // 测试减法 a = 16'b0000000000001100; // +12 b = 16'b0000000000000101; // +5 op = 1'b1; // 减法 #20; $display("Subtraction: %d - %d = %d", a, b, result); $finish; end endmodule ``` --- ### ### 约束文件设计 约束文件用于指定时钟频率、引脚分配等信息。以下是XDC格式的约束文件示例: ```xdc # 时钟约束 create_clock -name clk -period 10 [get_ports clk] # 引脚分配 set_property PACKAGE_PIN AF10 [get_ports clk] set_property PACKAGE_PIN AE9 [get_ports reset] set_property PACKAGE_PIN Y10 [get_ports {a[0]}] set_property PACKAGE_PIN Y11 [get_ports {a[1]}] ... set_property PACKAGE_PIN AA10 [get_ports {result[15]}] ``` --- ### ### 设计说明 1. **顶层文件**整合了缓存寄存器和运算器模块,通过时钟信号实现同步操作[^1]。 2. **运算器文件**实现了16位补码加减运算的核心逻辑,支持动态切换加法和减法操作[^2]。 3. **缓存寄存器文件**确保输入数据在时钟周期内稳定,避免毛刺影响[^3]。 4. **仿真寄存器文件**提供了完整的测试平台,验证设计的功能正确性[^4]。 5. **约束文件**定义了时钟频率和引脚分配,适配目标FPGA型号`xa7100tfgg484-2L`和板卡`HDU-XL-01`[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值