设为首页收藏本站帮助中心
查看: 40|回复: 0
收起左侧

Quartus Verilog HDL/FPGA 已知年月日求星期几算法 年月日算星期(一个时钟周期出结果)

[复制链接]
发表于 2022-1-6 08:48:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?加入我们

x
main.png
  1. module ymd2week(                                //已知年月日 求星期几
  2.         input [15:0] year,                //年 0~65535
  3.         input [3:0]        month,                //月 1~12
  4.         input [4:0] day,                        //日 1~31
  5.         output [2:0] week                        //输出星期 1~7 (星期一:1、星期日:7 失败:0)
  6. );
  7.         wire leap = (year %4 == 0 && year %100 !=0 || year %400 ==0);                //是否为闰年
  8.         wire [13:0] leap_num =  year / 4 - year / 100 + year / 400;                        //公元0年到指定年有多少个闰年 14位宽最大:15891
  9.         wire [24:0] year_day = year * 365 + leap_num;                                                        //年乘以365再加闰年数 25位宽最大:23936166
  10.         wire [2:0] w11 = ((1 + year_day - (leap ? 366 : 365)) %7);                        //1月1日的星期 星期日:0 星期一:1 星期二:2 以此类推
  11.         wire [3:0] ycode = leap ? ((w11 + 2) % 7) : ((w11 + 8) % 7);                //年代码
  12.         reg [3:0] mcode;                //月代码
  13.         reg [2:0] w;                        //星期
  14.         function [4:0] ym2d;                        //已知年月 获取有多少天 (返回日:28~31)
  15.                 input [15:0] year;                //年:0~65535
  16.                 input [3:0] month;                //月:1~12
  17.                 reg [4:0] i;
  18.                 begin
  19.                         case(month)
  20.                                 1:i=31;
  21.                                 2:i = leap ? 29 : 28;
  22.                                 3:i=31;4:i=30;5:i=31;
  23.                                 6:i=30;7:i=31;8:i=31;
  24.                                 9:i=30;10:i=31;11:i=30;
  25.                                 12:i=31;
  26.                                 default:i=0;
  27.                         endcase
  28.                         ym2d = i;
  29.                 end
  30.         endfunction
  31.         assign week = (month >= 1 && month <= 12 && day >= 1 && day <= ym2d(year,month)) ? w : 0;
  32.         always @(*) begin
  33.                 case(month)
  34.                         1:mcode = leap ? 5 : 6;
  35.                         2:mcode = leap ? 1 : 2;
  36.                         3:mcode = 2;4:mcode = 5;
  37.                         5:mcode = 0;6:mcode = 3;
  38.                         7:mcode = 5;8:mcode = 1;
  39.                         9:mcode = 4;10:mcode = 6;
  40.                         11:mcode = 2;12:mcode = 4;
  41.                         default:mcode = 0;
  42.                 endcase
  43.                 w = (ycode + mcode + day) % 7;
  44.                 w = (w == 0) ? 7 : w;
  45.                 w = (w - 1 == 0) ? 7 : w - 1;
  46.         end
  47. endmodule

  48. module main(
  49.         input clk,                                        //50Mhz时钟输入 Pin17
  50.         output reg led                                //LED (低电平点亮) Pin3 计算正确点亮 否则熄灭
  51. );
  52. reg [15:0] year;
  53. reg [3:0] month;
  54. reg [4:0] day;
  55. wire [2:0] week;

  56. ymd2week ymd2week(
  57.         .year(year),
  58.         .month(month),
  59.         .day(day),
  60.         .week(week)
  61. );

  62. always @(posedge clk) begin
  63.                 year = 2022;
  64.                 month = 1;
  65.                 day = 6;
  66.                 led = !(week == 4);
  67. end

  68. endmodule
复制代码

相关帖子

这个小可爱很神秘,什么都没留下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则