FPGA开发(基于Quartus II)万年历,简单代码

设计内容:万年历

   设计一个基于FPGA的电子万年历。设计的主要任务是在Quartus II开发环境中完成电子万年历系统FPGA内部各电路模块的设计,包括各个模块的设计输入、编译、仿真、验证和硬件测试任务。具体要求如下:

  1. 能实现24小时、60分、60秒的基本计时功能,格式为08-56-36:时-分-秒;可以通过按键设置定时和调整时间,并通过数码管显示时间;
  2. 能实现年月日的日期功能,格式为05-16-2018:月-日-年;
  3. 上板复位(拨码键SW0后从2000年1月1号0时0分0秒开始计
  4. 闰年:每400年整一闰,或每4年且不为百年的一闰。即能被400整除,或不能被100整除但能被4整除的年份为闰年
  5. 平年365天(52周+1天),闰年366天(52周+2天),其中平年2月28天,闰年2月29天。
  6. 拨码键SW1用于选择是日历模式还是时间模式(高电平);SW2用于决定是时间设置模式(高电平),还是计数模式;SW3用于设置秒,SW4用于设置分,SW5用于设置小时,SW17用于设置天,SW16用于设置月,SW15,SW14, SW13, SW12分别用于设置年的千位、百位、十位、各位,高电平是选中设置状态;
  7. 按键要有防抖功能,按下按键0时任务(6)中的设置位自增1。
  8. 设计思路:计数器记够一秒,秒加一;秒记够59秒且计数器记够1秒,,分钟加1;分钟记够59分且秒记够59秒且计数器记够1秒,小时加1;小时记够23小时且分钟记够59分且秒记够59秒且计数器记够1秒,天加1;当1.3.5.7.8.10.12月时天记够31天且小时记够23小时且分钟记够59分且秒记够59秒且计数器记够1秒,月加1;当4.6.9.11月时天记够30天且小时记够23小时且分钟记够59分且秒记够59秒且计数器记够1秒,月加1;当2月时平年天记够28天且小时记够23小时且分钟记够59分且秒记够59秒且计数器记够1秒,月加1;当月记够12月且天记够31天且小时记够23小时且分钟记够59分且秒记够59秒且计数器记够1秒,年加1。
  9. 注意事项:顶层文件中有两种计数方式,一种是仿真使用,另一种加//的是上板使用(板子时钟频率为50Mkz)
  10. 代码:

  11. 顶层文件:

    module wnl (

    input clk,

    input rst_n,

    input sw1,

    input sw2,

    input sw3,//秒

    input sw4,//分钟

    input sw5,//小时

    input sw6,//年[3:0]最低位

    input sw7,//年[7:4]次低位

    input sw8,//年[11:8]次高位

    input sw9,//年[15:12]最高位

    input sw10,//日

    input sw11,//月

    input key_plus,input key_sub,

    output reg [7:0] s,output reg [7:0] m,

    output reg [7:0] h,output reg [7:0] r,

    output reg [7:0] y,output reg [15:0] n,

    output reg [6:0] data_out1,output reg [6:0] data_out2,

    output reg [6:0] data_out3,output reg [6:0] data_out4,

    output reg [6:0] data_out5,output reg [6:0] data_out6,

    output reg [6:0] data_out7,output reg [6:0] data_out8

    );

    wire up_flag;wire down_flag;

    wire key_plus_flag;wire key_sub_flag;

    wire key_plus_value;wire key_sub_value;

    reg [32:0] cnt;

    assign up_flag = key_plus_flag && (~key_plus_value);

    assign down_flag = key_sub_flag && (~key_sub_value);

    always@(posedge clk or negedge rst_n)begin

    if(!rst_n)begin

    cnt<=32'd0;end

    //else if (cnt <= 32'd49_999_999)begin

    else if(cnt <= 32'd2)begin

    cnt<=cnt+32'd1;end

    else begin

    cnt<=32'd0;end

    end

    always@(posedge clk or negedge rst_n)begin//s

    if(!rst_n)begin

    s<=0;end

    else if(sw2==0)begin

    //if(cnt == 32'd49_999_999)begin

    if(cnt == 32'd2)begin

    if((s[3:0]<9) && (s[7:4]<5))begin

    s[3:0]<=s[3:0]+1;s[7:4]<=s[7:4];end

    else if((s[3:0]==9) && (s[7:4]<5))begin

    s[3:0]<=0;s[7:4]<=s[7:4]+1;end

    else if((s[3:0]<9) && (s[7:4]==5))begin

    s[3:0]<=s[3:0]+1;s[7:4]<=s[7:4];end

    else if((s[3:0]==9) && (s[7:4]==5))begin

    s[3:0]<=0;s[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw3==1)begin

    if(up_flag)begin

    if((s[3:0]<9) && (s[7:4]<5))begin

    s[3:0]<=s[3:0]+1;s[7:4]<=s[7:4];end

    else if((s[3:0]==9) && (s[7:4]<5))begin

    s[3:0]<=0;s[7:4]<=s[7:4]+1;end

    else if((s[3:0]<9) && (s[7:4]==5))begin

    s[3:0]<=s[3:0]+1;s[7:4]<=s[7:4];end

    else if((s[3:0]==9) && (s[7:4]==5))begin

    s[3:0]<=0;s[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw3==0)begin

    s[3:0]<=s[3:0];s[7:4]<=s[7:4];end

    end

    always@(posedge clk or negedge rst_n)begin//m

    if(!rst_n)begin

    m<=0;end

    else if(sw2==0)begin

    //if((s[3:0]==9) && (s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((s[3:0]==9) && (s[7:4]==5) && (cnt == 32'd2))begin

    if((m[3:0]<9) && (m[7:4]<5))begin

    m[3:0]<=m[3:0]+1;m[7:4]<=m[7:4];end

    else if((m[3:0]==9) && (m[7:4]<5))begin

    m[3:0]<=0;m[7:4]<=m[7:4]+1;end

    else if((m[3:0]<9) && (m[7:4]==5))begin

    m[3:0]<=m[3:0]+1;m[7:4]<=m[7:4];end

    else if((m[3:0]==9) && (m[7:4]==5))begin

    m[3:0]<=0;m[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw4==1)begin

    if(up_flag)begin

    if((m[3:0]<9) && (m[7:4]<5))begin

    m[3:0]<=m[3:0]+1;m[7:4]<=m[7:4];end

    else if((m[3:0]==9) && (m[7:4]<5))begin

    m[3:0]<=0;m[7:4]<=m[7:4]+1;end

    else if((m[3:0]<9) && (m[7:4]==5))begin

    m[3:0]<=m[3:0]+1;m[7:4]<=m[7:4];end

    else if((m[3:0]==9) && (m[7:4]==5))begin

    m[3:0]<=0;m[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw4==0)begin

    m[3:0]<=m[3:0];m[7:4]<=m[7:4];end

    end

    always@(posedge clk or negedge rst_n)begin//h

    if(!rst_n)begin

    h<=0;end

    else if(sw2==0)begin

    //if((m[3:0]==9) && (m[7:4]==5) && (s[3:0]==9) && (s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((m[3:0]==9) && (m[7:4]==5) && (s[3:0]==9) && (s[7:4]==5) && (cnt == 32'd2))begin

    if((h[3:0]<9) && (h[7:4]<2))begin

    h[3:0]<=h[3:0]+1;h[7:4]<=h[7:4];end

    else if((h[3:0]==9) && (h[7:4]<2))begin

    h[3:0]<=0;h[7:4]<=h[7:4]+1;end

    else if((h[3:0]<3) && (h[7:4]==2))begin

    h[3:0]<=h[3:0]+1;h[7:4]<=h[7:4];end

    else if((h[3:0]==3) && (h[7:4]==2))begin

    h[3:0]<=0;h[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw5==1)begin

    if(up_flag)begin

    if((h[3:0]<9) && (h[7:4]<2))begin

    h[3:0]<=h[3:0]+1;h[7:4]<=h[7:4];end

    else if((h[3:0]==9) && (h[7:4]<2))begin

    h[3:0]<=0;h[7:4]<=h[7:4]+1;end

    else if((h[3:0]<3) && (h[7:4]==2))begin

    h[3:0]<=h[3:0]+1;h[7:4]<=h[7:4];end

    else if((h[3:0]==3) && (h[7:4]==2))begin

    h[3:0]<=0;h[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw5==0)begin

    h[3:0]<=h[3:0];h[7:4]<=h[7:4];end

    end

    always@(posedge clk or negedge rst_n)begin//r

    if(!rst_n)begin

    r[3:0]<=1;r[7:4]<=0;end

    else if(sw2==0)begin

    //if((h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd42))begin

    if((y[3:0]==1 && y[7:4]==0)|(y[3:0]==3 && y[7:4]==0)|(y[3:0]==5 && y[7:4]==0)|(y[3:0]==7 && y[7:4]==0)|(y[3:0]==8 && y[7:4]==0)|(y[3:0]==0 && y[7:4]==1)|(y[3:0]==2 && y[7:4]==1))begin

    if((r[3:0]<9) && (r[7:4]<3))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<3))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]==1) && (r[7:4]==3))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    else if((y[3:0]==4 && y[7:4]==0)|(y[3:0]==6 && y[7:4]==0)|(y[3:0]==9 && y[7:4]==0)|(y[3:0]==1 && y[7:4]==1))begin

    if((r[3:0]<9) && (r[7:4]<3))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<3))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]==0) && (r[7:4]==3))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    else if((y[3:0]==2 && y[7:4]==0) && ((n%4)==0))begin

    if((r[3:0]<9) && (r[7:4]<2))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<2))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]==9) && (r[7:4]==2))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    else if((y[3:0]==2 && y[7:4]==0) && ((n%4)!=0))begin

    if((r[3:0]<9) && (r[7:4]<2))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<2))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]==8) && (r[7:4]==2))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    end

    end

    else if(sw2==1 && sw10==1)begin

    if(up_flag)begin

    if((y[3:0]==1 && y[7:4]==0)|(y[3:0]==3 && y[7:4]==0)|(y[3:0]==5 && y[7:4]==0)|(y[3:0]==7 && y[7:4]==0)|(y[3:0]==8 && y[7:4]==0)|(y[3:0]==0 && y[7:4]==1)|(y[3:0]==2 && y[7:4]==1))begin

    if((r[3:0]<9) && (r[7:4]<3))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<3))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;

    end

    else if((r[3:0]<1) && (r[7:4]==3))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==1) && (r[7:4]==3))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    else if((y[3:0]==4 && y[7:4]==0)|(y[3:0]==6 && y[7:4]==0)|(y[3:0]==9 && y[7:4]==0)|(y[3:0]==1 && y[7:4]==1))begin

    if((r[3:0]<9) && (r[7:4]<3))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<3))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]==0) && (r[7:4]==3))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    else if((y[3:0]==2 && y[7:4]==0) && ((n%4)==0))begin

    if((r[3:0]<9) && (r[7:4]<2))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<2))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]<9) && (r[7:4]==2))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]==2))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    else if((y[3:0]==2 && y[7:4]==0) && ((n%4)!=0))begin

    if((r[3:0]<9) && (r[7:4]<2))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==9) && (r[7:4]<2))begin

    r[3:0]<=0;r[7:4]<=r[7:4]+1;end

    else if((r[3:0]<8) && (r[7:4]==2))begin

    r[3:0]<=r[3:0]+1;r[7:4]<=r[7:4];end

    else if((r[3:0]==8) && (r[7:4]==2))begin

    r[3:0]<=1;r[7:4]<=0;end

    end

    end

    end

    else if(sw2==1 && sw10==0)begin

    r[3:0]<=r[3:0];r[7:4]<=r[7:4];end

    end

    always@(posedge clk or negedge rst_n)begin//y

    if(!rst_n)begin

    y[3:0]<=1;y[7:4]<=0;end

    else if(sw2==0)begin

    if((y[3:0]==1 && y[7:4]==0)|(y[3:0]==3 && y[7:4]==0)|(y[3:0]==5 && y[7:4]==0)|(y[3:0]==7 && y[7:4]==0)|(y[3:0]==8 && y[7:4]==0)|(y[3:0]==0 && y[7:4]==1))begin

    //if((r[3:0]==1) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((r[3:0]==1) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd2))begin

    y[3:0]<=y[3:0]+1;y[7:4]<=y[7:4];end

    end

    else if(y[3:0]==2 && y[7:4]==1)begin

    //if((r[3:0]==1) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((r[3:0]==1) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd2))begin

    y[3:0]<=1;y[7:4]<=0;end

    end

    else if((y[3:0]==4 && y[7:4]==0)|(y[3:0]==6 && y[7:4]==0)|(y[3:0]==9 && y[7:4]==0)|(y[3:0]==1 && y[7:4]==1))begin

    //if((r[3:0]==0) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((r[3:0]==0) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd2))begin

    y[3:0]<=y[3:0]+1;y[7:4]<=y[7:4];end

    end

    else if((y[3:0]==2 && y[7:4]==0) && ((n%4)==0))begin

    //if((r[3:0]==9) && (r[7:4]==2) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((r[3:0]==9) && (r[7:4]==2) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd2))begin

    y[3:0]<=y[3:0]+1;y[7:4]<=y[7:4];end

    end

    else if((y[3:0]==2 && y[7:4]==0) && ((n%4)!=0))begin

    //if((r[3:0]==8) && (r[7:4]==2) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((r[3:0]==8) && (r[7:4]==2) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd2))begin

    y[3:0]<=y[3:0]+1;y[7:4]<=y[7:4];end

    end

    end

    else if(sw2==1 && sw11==1)begin

    if(up_flag)begin

    if((y[3:0]<9) && (y[7:4]<1))begin

    y[3:0]<=y[3:0]+1;y[7:4]<=y[7:4];end

    else if((y[3:0]==9) && (y[7:4]<1))begin

    y[3:0]<=0;y[7:4]<=y[7:4]+1;end

    else if((y[3:0]<2) && (y[7:4]==1))begin

    y[3:0]<=y[3:0]+1;y[7:4]<=y[7:4];end

    else if((y[3:0]==2) && (y[7:4]==1))begin

    y[3:0]<=1;y[7:4]<=0;end

    end

    end

    else if(sw2==1 && sw11==0)begin

    y[3:0]<=y[3:0];y[7:4]<=y[7:4];end

    end

    always@(posedge clk or negedge rst_n)begin//n

    if(!rst_n)begin

    n[3:0]<=0;n[7:4]<=0;n[11:8]<=0;n[15:12]<=2;end

    else if(sw2==0)begin

    //if((y[3:0]==2) && (y[7:4]==1) && (r[3:0]==1) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd49_999_999))begin

    if((y[3:0]==2) && (y[7:4]==1) && (r[3:0]==1) && (r[7:4]==3) && (h[3:0]==3 && h[7:4]==2) && (m[3:0]==9 && m[7:4]==5) && (s[3:0]==9 && s[7:4]==5) && (cnt == 32'd2))begin

    if((n[3:0]<9) && (n[7:4]<9) && (n[11:8]<9) && (n[15:12]<9))begin

    n[3:0]<=n[3:0]+1;n[7:4]<=n[7:4];n[11:8]<=n[11:8];n[15:12]<=n[15:12];end

    else if((n[3:0]==9) && (n[7:4]<9) && (n[11:8]<9) && (n[15:12]<9))begin

    n[3:0]<=0;n[7:4]<=n[7:4]+1;n[11:8]<=n[11:8];n[15:12]<=n[15:12];end

    else if((n[3:0]<9) && (n[7:4]==9) && (n[11:8]<9) && (n[15:12]<9))begin

    n[3:0]<=n[3:0]+1;n[7:4]<=n[7:4];n[11:8]<=n[11:8];n[15:12]<=n[15:12];end

    else if((n[3:0]==9) && (n[7:4]==9) && (n[11:8]<9) && (n[15:12]<9))begin

    n[3:0]<=0;n[7:4]<=0;n[11:8]<=n[11:8]+1;n[15:12]<=n[15:12];end

    else if((n[3:0]<9) && (n[7:4]<9) && (n[11:8]==9) && (n[15:12]<9))begin

    n[3:0]<=n[3:0]+1;n[7:4]<=n[7:4];n[11:8]<=n[11:8];n[15:12]<=n[15:12];end

    else if((n[3:0]==9) && (n[7:4]<9) && (n[11:8]==9) && (n[15:12]<9))begin

    n[3:0]<=0;n[7:4]<=n[7:4]+1;n[11:8]<=n[11:8];n[15:12]<=n[15:12];end

    else if((n[3:0]==9) && (n[7:4]==9) && (n[11:8]==9) && (n[15:12]<9))begin

    n[3:0]<=0;n[7:4]<=0;n[11:8]<=0;n[15:12]<=n[15:12]+1;end

    else if((n[3:0]==9) && (n[7:4]==9) && (n[11:8]==9) && (n[15:12]==9))begin

    n[3:0]<=0;n[7:4]<=0;n[11:8]<=0;n[15:12]<=0;end

    end

    end

    else if((sw2==1) && (sw6==1))begin

    if(up_flag)begin

    if(n[3:0]<9)begin

    n[3:0]<=n[3:0]+1;end

    else if(n[3:0]==9)begin

    n[3:0]<=0;end

    end

    end

    else if((sw2==1) && (sw7==1))begin

    if(up_flag)begin

    if(n[7:4]<9)begin

    n[7:4]<=n[7:4]+1;end

    else if(n[7:4]==9)begin

    n[7:4]<=0;end

    end

    end

    else if((sw2==1) && (sw8==1))begin

    if(up_flag)begin

    if(n[11:8]<9)begin

    n[11:8]<=n[11:8]+1;end

    else if(n[11:8]==9)begin

    n[11:8]<=0;end

    end

    end

    else if((sw2==1) && (sw9==1))begin

    if(up_flag)begin

    if(n[15:12]<9)begin

    n[15:12]<=n[15:12]+1;end

    else if(n[15:12]==9)begin

    n[15:12]<=0;end

    end

    end

    end

    always @(s[3:0] or n[3:0] or sw1)begin

    data_out1=7'b11111111;

    if(sw1==0)begin

    case (s[3:0])

    4'b0000: data_out1 = 7'b1000000; 4'b0001: data_out1 = 7'b1111001;

    4'b0010: data_out1 = 7'b0100100;4'b0011: data_out1 = 7'b0110000;

    4'b0100: data_out1 = 7'b0011001;4'b0101: data_out1 = 7'b0010010;

    4'b0110: data_out1 = 7'b0000010;4'b0111: data_out1 = 7'b1111000;

    4'b1000: data_out1 = 7'b0000000;4'b1001: data_out1 = 7'b0010000;

    default: data_out1 = 7'b1111111;

    endcase

    end

    else if(sw1==1)begin

    case (n[3:0])

    4'b0000: data_out1 = 7'b1000000;4'b0001: data_out1 = 7'b1111001;

    4'b0010: data_out1 = 7'b0100100;4'b0011: data_out1 = 7'b0110000;

    4'b0100: data_out1 = 7'b0011001;4'b0101: data_out1 = 7'b0010010;

    4'b0110: data_out1 = 7'b0000010;4'b0111: data_out1 = 7'b1111000;

    4'b1000: data_out1 = 7'b0000000;4'b1001: data_out1 = 7'b0010000;

    default: data_out1 = 7'b1111111;

    endcase

    end

    end

    always @(s[7:4] or n[7:4] or sw1)begin

    data_out2=7'b11111111;

    if(sw1==0)begin

    case (s[7:4])

    4'b0000: data_out2 = 7'b1000000;4'b0001: data_out2 = 7'b1111001;

    4'b0010: data_out2 = 7'b0100100;4'b0011: data_out2 = 7'b0110000;

    4'b0100: data_out2 = 7'b0011001;4'b0101: data_out2 = 7'b0010010;

    4'b0110: data_out2 = 7'b0000010;4'b0111: data_out2 = 7'b1111000;

    4'b1000: data_out2 = 7'b0000000;4'b1001: data_out2 = 7'b0010000;

    default: data_out2 = 7'b1111111;

    endcase

    end

    else if(sw1==1)begin

    case (n[7:4])

    4'b0000: data_out2 = 7'b1000000;4'b0001: data_out2 = 7'b1111001;

    4'b0010: data_out2 = 7'b0100100;4'b0011: data_out2 = 7'b0110000;

    4'b0100: data_out2 = 7'b0011001;4'b0101: data_out2 = 7'b0010010;

    4'b0110: data_out2 = 7'b0000010;4'b0111: data_out2 = 7'b1111000;

    4'b1000: data_out2 = 7'b0000000;4'b1001: data_out2 = 7'b0010000;

    default: data_out2 = 7'b1111111;

    endcase

    end

    end

    always @(m[3:0] or n[11:8] or sw1)begin

    data_out3=7'b11111111;

    if(sw1==0)begin

    case (m[3:0])

    4'b0000: data_out3 = 7'b1000000;4'b0001: data_out3 = 7'b1111001;

    4'b0010: data_out3 = 7'b0100100;4'b0011: data_out3 = 7'b0110000;

    4'b0100: data_out3 = 7'b0011001;4'b0101: data_out3 = 7'b0010010;

    4'b0110: data_out3 = 7'b0000010;4'b0111: data_out3 = 7'b1111000;

    4'b1000: data_out3 = 7'b0000000;4'b1001: data_out3 = 7'b0010000;

    default: data_out3 = 7'b1111111;

    endcase

    end

    else if(sw1==1)begin

    case (n[11:8])

    4'b0000: data_out3 = 7'b1000000;4'b0001: data_out3 = 7'b1111001;

    4'b0010: data_out3 = 7'b0100100;4'b0011: data_out3 = 7'b0110000;

    4'b0100: data_out3 = 7'b0011001;4'b0101: data_out3 = 7'b0010010;

    4'b0110: data_out3 = 7'b0000010;4'b0111: data_out3 = 7'b1111000;

    4'b1000: data_out3 = 7'b0000000;4'b1001: data_out3 = 7'b0010000;

    default: data_out3 = 7'b1111111;

    endcase

    end

    end

    always @(m[7:4] or n[15:12] or sw1)begin

    data_out4=7'b11111111;

    if(sw1==0)begin

    case (m[7:4])

    4'b0000: data_out4 = 7'b1000000;4'b0001: data_out4 = 7'b1111001;

    4'b0010: data_out4 = 7'b0100100;4'b0011: data_out4 = 7'b0110000;

    4'b0100: data_out4 = 7'b0011001;4'b0101: data_out4 = 7'b0010010;

    4'b0110: data_out4 = 7'b0000010;4'b0111: data_out4 = 7'b1111000;

    4'b1000: data_out4 = 7'b0000000;4'b1001: data_out4 = 7'b0010000;

    default: data_out4 = 7'b1111111;

    endcase

    end

    else if(sw1==1)begin

    case (n[15:12])

    4'b0000: data_out4 = 7'b1000000;4'b0001: data_out4 = 7'b1111001;

    4'b0010: data_out4 = 7'b0100100;4'b0011: data_out4 = 7'b0110000;

    4'b0100: data_out4 = 7'b0011001;4'b0101: data_out4 = 7'b0010010;

    4'b0110: data_out4 = 7'b0000010;4'b0111: data_out4 = 7'b1111000;

    4'b1000: data_out4 = 7'b0000000;4'b1001: data_out4 = 7'b0010000;

    default: data_out4 = 7'b1111111;

    endcase

    end

    end

    always @(h[3:0] or r[3:0] or sw1)begin

    data_out5=7'b11111111;

    if(sw1==0)begin

    case (h[3:0])

    4'b0000: data_out5 = 7'b1000000;4'b0001: data_out5 = 7'b1111001;

    4'b0010: data_out5 = 7'b0100100;4'b0011: data_out5 = 7'b0110000;

    4'b0100: data_out5 = 7'b0011001;4'b0101: data_out5 = 7'b0010010;

    4'b0110: data_out5 = 7'b0000010;4'b0111: data_out5 = 7'b1111000;

    4'b1000: data_out5 = 7'b0000000;4'b1001: data_out5 = 7'b0010000;

    default: data_out5 = 7'b1111111;

    endcase

    end

    else if(sw1==1)begin

    case (r[3:0])

    4'b0000: data_out5 = 7'b1000000;4'b0001: data_out5 = 7'b1111001;

    4'b0010: data_out5 = 7'b0100100;4'b0011: data_out5 = 7'b0110000;

    4'b0100: data_out5 = 7'b0011001;4'b0101: data_out5 = 7'b0010010;

    4'b0110: data_out5 = 7'b0000010;4'b0111: data_out5 = 7'b1111000;

    4'b1000: data_out5 = 7'b0000000;4'b1001: data_out5 = 7'b0010000;

    default: data_out5 = 7'b1111111;

    endcase

    end

    end

    always @(h[7:4] or r[7:4] or sw1)begin

    data_out6=7'b11111111;

    if(sw1==0)begin

    case (h[7:4])

    4'b0000: data_out6 = 7'b1000000;4'b0001: data_out6 = 7'b1111001;

    4'b0010: data_out6 = 7'b0100100;4'b0011: data_out6 = 7'b0110000;

    4'b0100: data_out6 = 7'b0011001;4'b0101: data_out6 = 7'b0010010;

    4'b0110: data_out6 = 7'b0000010;4'b0111: data_out6 = 7'b1111000;

    4'b1000: data_out6 = 7'b0000000;4'b1001: data_out6 = 7'b0010000;

    default: data_out6 = 7'b1111111;

    endcase

    end

    else if(sw1==1)begin

    case (r[7:4])

    4'b0000: data_out6 = 7'b1000000;4'b0001: data_out6 = 7'b1111001;

    4'b0010: data_out6 = 7'b0100100;4'b0011: data_out6 = 7'b0110000;

    4'b0100: data_out6 = 7'b0011001;4'b0101: data_out6 = 7'b0010010;

    4'b0110: data_out6 = 7'b0000010;4'b0111: data_out6 = 7'b1111000;

    4'b1000: data_out6 = 7'b0000000;4'b1001: data_out6 = 7'b0010000;

    default: data_out6 = 7'b1111111;

    endcase

    end

    end

    always @(y[3:0] or sw1)begin

    data_out7=7'b11111111;

    if(sw1==1)begin

    case (y[3:0])

    4'b0000: data_out7 = 7'b1000000;4'b0001: data_out7 = 7'b1111001;

    4'b0010: data_out7 = 7'b0100100;4'b0011: data_out7 = 7'b0110000;

    4'b0100: data_out7 = 7'b0011001;4'b0101: data_out7 = 7'b0010010;

    4'b0110: data_out7 = 7'b0000010;4'b0111: data_out7 = 7'b1111000;

    4'b1000: data_out7 = 7'b0000000;4'b1001: data_out7 = 7'b0010000;

    default: data_out7 = 7'b1111111;

    endcase

    end

    end

    always @(y[7:4] or sw1)begin

    data_out8=7'b11111111;

    if(sw1==1)begin

    case (y[7:4])

    4'b0000: data_out8 = 7'b1000000;4'b0001: data_out8 = 7'b1111001;

    4'b0010: data_out8 = 7'b0100100;4'b0011: data_out8 = 7'b0110000;

    4'b0100: data_out8 = 7'b0011001;4'b0101: data_out8 = 7'b0010010;

    4'b0110: data_out8 = 7'b0000010;4'b0111: data_out8 = 7'b1111000;

    4'b1000: data_out8 = 7'b0000000;4'b1001: data_out8 = 7'b0010000;

    default: data_out8 = 7'b1111111;

    endcase

    end

    end

    key_debounce u1_key_debounce(

        .sys_clk        (clk),

        .sys_rst_n      (rst_n),

        .key            (key_plus),

        .key_flag       (key_plus_flag),

        .key_value      (key_plus_value)

        );

    key_debounce u2_key_debounce(

        .sys_clk        (clk),

        .sys_rst_n      (rst_n),

        .key            (key_sub),

        .key_flag       (key_sub_flag),

        .key_value      (key_sub_value)

        );

    endmodule

    按键消抖:

    //***************************************************************************//

    module key_debounce(

    input sys_clk,          //外部50M时钟

    input sys_rst_n,        //外部复位信号,低有效

    input key,              //外部按键输入

    output reg key_flag,         //按键数据有效信号

    output reg key_value         //按键消抖后的数据  

    );   

    reg [31:0] delay_cnt;reg key_reg;

    always @(posedge sys_clk or negedge sys_rst_n) begin

    if (!sys_rst_n) begin

    key_reg   <= 1'b1;delay_cnt <= 32'd0;end

    else begin

    key_reg <= key;

    if(key_reg != key)begin      //一旦检测到按键状态发生变化(有按键被按下或释放)     

    delay_cnt <= 32'd1000000; //给延时计数器重新装载初始值(计数时间为20ms)   

    //delay_cnt <= 32'd10; //给延时计数器重新装载初始值(计数时间为20ms)//仿真时改为10

    end

    else if(key_reg == key) begin  //在按键状态稳定时,计数器递减,开始20ms倒计时

    if(delay_cnt > 32'd0)begin

    delay_cnt <= delay_cnt - 1'b1;end

    else begin

    delay_cnt <= delay_cnt;end

    end

    end

    end

    always @(posedge sys_clk or negedge sys_rst_n) begin

    if (!sys_rst_n) begin

    key_flag  <= 1'b0;key_value <= 1'b1;end

    else begin

    if(delay_cnt == 32'd1) begin   //当计数器递减到1时,说明按键稳定状态维持了20ms

    key_flag  <= 1'b1;         //此时消抖过程结束,给出一个时钟周期的标志信号

    key_value <= key;          //并寄存此时按键的值

    end

    else begin

    key_flag  <= 1'b0;key_value <= key_value;end

    end

    end

    endmodule

    仿真代码:

    `timescale 1ns/1ns

    module tb;

    reg clk;reg rst_n;

    reg sw2;reg sw3;

    reg sw4;reg sw5;

    reg sw6;reg sw7;

    reg sw8;reg sw9;

    reg sw10;reg sw11;

    reg key_plus;reg key_sub;

    reg [4:0] i;wire [7:0] s;

    wire [7:0] m;wire [7:0] h;

    wire [7:0] r;wire [7:0] y;

    wire [15:0] n;

    initial begin

    i=0;clk=0;

    rst_n=1;key_plus=1;

    key_sub=1;

    #20

    rst_n=0;

    #20

    rst_n=1;

    #20

    sw2=1;

    #20

    sw3=1;

    #20

    sw3=0;sw4=1;

    #20

    sw4=0;sw5=1;

    #20

    sw5=0;sw6=1;

    #20

    sw6=0;sw7=1;

    #20

    sw7=0;sw8=1;

    #20

    sw8=0;sw9=1;

    #20

    sw9=0;sw10=1;

    #20

    sw10=0;sw11=1;

    #20

    sw11=0;

    #20

    sw2=0;

    repeat(3)begin

    key_plus=1;

    for(i=0;i<10;i=i+1)

    #20

    key_plus=~key_plus;key_plus=0;

    #1000

    key_plus=1;

    for(i=0;i<10;i=i+1)

    #20

    key_plus=~key_plus;key_plus=1;

    end

    #1000

    key_sub=1;

    repeat(3)begin

    for(i=0;i<10;i=i+1)

    #20

    key_sub=~key_sub;key_sub=0;

    #1000

    key_sub=1;

    for(i=0;i<10;i=i+1)

    #20

    key_sub=~key_sub;key_sub=1;

    #1000

    key_sub=0;end

    #10000

    $stop;

    end

    always #10 clk=~clk;

    wnl u1(

    .clk(clk),

    .rst_n(rst_n),

    .s(s),

    .m(m),

    .h(h),

    .r(r),

    .y(y),

    .n(n),

    .key_plus(key_plus),

    .key_sub(key_sub),

    .sw2(sw2),

    .sw3(sw3),//s

    .sw4(sw4),//m

    .sw5(sw5),//h

    .sw6(sw6),//n[3:0]

    .sw7(sw7),//n[7:4]

    .sw8(sw8),//n[11:8]

    .sw9(sw9),//n[15:12]

    .sw10(sw10),//r

    .sw11(sw11)//y

    );

    endmodule

  12. 实验结果:

  • 实验时间为2021年12月21日18时42分12秒
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于FPGA设计万年历数字时钟课程设计Quartus工程源码+设计报告文档资料,可以做为你的学习设计参考。 系统总体设计 2.1.1 系统功能介绍 本次万年历实现的功能有: (1)年月日、时分秒的走时、设置及其显示。 (2)闹钟功能、闹钟设置及其闹钟设置显示。 2.1.2 系统硬件介绍 本次万年历设计使用的硬件资源有:6个数码管、三个微动开关、两个拨码开关和两个LED灯。 其中,6个数码管选择显示年月日、时分秒及其闹钟设置的时分秒。三个按键分别为翻页按键(选择数码管显示内容)、选择按键(选择需调整的内容)、加一按键(调整的内容加一),用于翻页和时间及其闹钟的设置。两个拨码开关分别为闹钟使能开关和复位开关,用于闹钟的打开及其关闭和将整个系统复位。两个LED灯分别为闹钟开关状态和闹钟标志(代替蜂鸣器)。 2.1.3 系统总体框图介绍 整个系统采用自顶向下的设计方法,从系统的总体功能出发,将整个系统划分为多个模块,然后再将各个模块划分为多个功能部分,编程完成后将各个部分联系起来组成整个系统。 module calendar(system_clk,reset,key_turn,key_switch,key_add,switch_alarm,led,beep,hex0,hex1,hex2,hex3,hex4,hex5); input system_clk,reset,key_turn,key_switch,key_add,switch_alarm;//系统时钟、复位、三个按键和一个拨码开关 output led,beep; //LED灯和蜂鸣器 output [6:0] hex0; //输出:数码管0 output [6:0] hex1; //输出:数码管1 output [6:0] hex2; //输出:数码管2 output [6:0] hex3; //输出:数码管3 output [6:0] hex4; //输出:数码管4 output [6:0] hex5; //输出:数码管5 wire second_add,minute_add,hour_add,day_add,month_add,year_add,alarm_second_add,alarm_minute_add,alarm_hour_add; //专属增一信号 wire [1:0] flag_turn; //翻页状态信号 wire [1:0] flag_switch; //闪烁数码管选择信号 wire select_sign; //选择状态 wire [5:0] second; //秒 wire [5:0] minute; //分 wire [4:0] hour; //小时 wire [4:0] day; //日 wire [3:0] month; //月 wire [6:0] year; //年 wire [5:0] alarm_second; //闹钟秒 wire [5:0] alarm_minute; //闹钟分 wire [4:0] alarm_hour; //闹钟小时 //例化按键模块 key_drive_module use_key_drive_module( .system_clk (system_clk), .reset (reset), .key_turn (key_turn), .key_switch (key_switch), .key_add (key_add), .flag_switch (flag_switch), .flag_turn (flag_turn), .second_add (second_add), .minute_add (minute_add), .hour_add (hour_add), .day_add (day_add), .month_add (month_add), .year_add (year_add), .alarm_second_add (alarm_second_add), .alarm_minute_add (alarm_minute_add), .alarm_hour_add (alarm_hour_add), .select_sign (select_sign) ); //例化时钟模块 clock

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值