声明

本文代码是在亢神代码基础上的完善与魔改,原blog地址:

@Hellsegamosken [SystemVerilog] 基于 FPGA 的数字钟设计

亢神人帅心善orz orz orz

下附完整代码与约束文件,可直接烧录使用

题目

请使用SystemVerilog实现一个数字钟。
要求:
(1)能够显示时分秒;
(2)能够设置开始时间;
(3)使用你自己的7段数码管显示译码电路实现;
(4)可以使用动态显示方法实现;
(5)依据实现的其他附加功能,酌情加分:秒表、倒计时、闹钟、…
(6)需要在Basys3 FPGA开发板上实现,并通过验收

实现描述

        实现了 正常计时、日期、秒表、倒计时、闹钟 功能,使用按键在功能间进行循环切换

        在实现上,尽可能多的利用了按键而非拨码开关来实现功能,并且更多的使用了LED来进行数字钟本体信息的展示(高低位、闹钟是否开启、模式)

        如果大家想完善的更好一点,可以考虑完善日期设置功能,drawbay指出了其中存在一定问题,但是我没改(懒)。另外,还可以尝试将所有功能都做成按键式的,这样上板后显得更加简练

        总而言之,这是一个相对而言比较完善全面的数字钟项目。大家一定不要纯抄袭,而是要从代码中学习逻辑与coding tricks,能从项目/作业中找到能化为己用的东西才是最重要的。看完代码后,可以问自己几个问题:

        1. 按键消抖的逻辑是什么?如果我想将按键变为逻辑上按进去不复位的版本应该怎么做?

        2. 数码管位选显示的逻辑是什么?如何使用更少的逻辑/代码实现这一功能?

        3. 代码中时间自增DFF的clk用的是什么?为什么这么用会是对的?有没有更简练的实现方式? 

       

代码

        1. main_module   (使用说明可参考io部分注释)  

module clock(
    input logic clk_pre,
    // 输入的100MHZ时钟信号,不解释

    input logic TU, TL, TC, TD, TR,
    // 四个按钮,分别控制
    // TU:设置模式下当前位+1
    // TL:设置模式下向左循环切换当前设置位
    //         秒表模式下设置模式无效
    // TC:秒表模式下暂停/开始
    // TD:重置当前模式
    //         主模式下无法重置
    // TR:循环切换当前显示的模式

    input logic SET_TIME, DISPLAY_SWITCHER, ALARM_ENABLE, 
    // 三个拨动开关,分别控制
    // SET_TIME:进入/不进入设置模式
    // DUSISPLAY_SWITCHER:当前显示高位组合/低位组合
    // ALARM_ENABLE:控制闹钟是否启用

    output logic dp, 
    // 冒号,以小数点代替

    output logic [10:0] disp_7seg, 
    // 数码管显示信号,采用动态显示逻辑
    // 前四位为独热位选,控制当前显示的数码管(低电平有效)--注意,位选逻辑对小数点同样生效
    // 后七位控制数码管显示(低电平有效)

    output logic mode1_date, mode2_stopwatch, mode3_countdown, mode4_alarm, // 表示当前处于的模式
    output logic alarm_light, down_light, // 闹钟/倒计时到时亮起
    output logic tag0, tag1, tag2 // tag0 & tag1 -> 时时:分分   tag1 & tag2 -> 分分:秒秒
    // 这些output均对应LED显示灯
);

logic [3:0] disp_A0, disp_A1, disp_B0, disp_B1;
logic [3:0] h0 = 4'b0000, h1 = 4'b0001, m0 = 4'b0010, m1 = 4'b0001, s0 = 4'b0000, s1 = 4'b0100; // 时钟
logic [3:0] ah0 = 4'b0000, ah1 = 4'b0001, am0 = 4'b0011, am1 = 4'b0001, as0 = 4'b0000, as1 = 4'b0000; // 闹钟
logic [3:0] dh0 = 4'b0000, dh1 = 4'b0000, dm0 = 4'b0000, dm1 = 4'b0000, ds0 = 4'b0000, ds1 = 4'b0000; // 倒计时
logic [3:0] ch0 = 4'b0000, ch1 = 4'b0000, cm0 = 4'b0000, cm1 = 4'b0000, cs0 = 4'b0000, cs1 = 4'b0000; // 秒表
logic [3:0] yy3 = 4'b0010, yy2 = 4'b0000, yy1 = 4'b0010, yy0 = 4'b0110, mm1 = 4'b0000, mm0 = 4'b0001, dd1 = 4'b0000, dd0 = 4'b0111; // 日期

typedef enum integer {MAIN, ALARM, STOP_WATCH, DOWN, DATE} ModeType;
typedef enum logic {LOW, HIGH} DispType;
typedef enum logic {OFF, ON} HandType;

ModeType mode = MAIN;
DispType DISP = LOW;
logic on_set = OFF;
integer alarm_time = 0, down_time = 0;
logic [7:0] Handsome_ksj;
logic down_sig = 1'b1, alarm_sig = 1'b1, counting = 1'b0;
integer disp_pos = 0;
logic [3:0] disp_number;

logic tmpU1, tmpU2, tmpU3, UP;
logic tmpL1, tmpL2, tmpL3, LEFT;
logic tmpC1, tmpC2, tmpC3, CENTER;
logic tmpD1, tmpD2, tmpD3, RESET;
logic tmpR1, tmpR2, tmpR3, RIGHT;

integer cnt_sec = 0, cnt_centi = 0, cnt_disp = 0, cnt_flip = 0, cnt_blink = 0;
logic clk_sec = 1'b0, clk_centi = 1'b0, clk_disp = 1'b0, clk_blink = 1'b0;
logic flip = 1'b1;
logic jw_d = 1'b0, jw_m = 1'b0, jw_y = 1'b0;
logic preon_set = 1'b0, preleft = 1'b0, preup = 1'b0, predown_sig = 1'b0, prealarm_sig = 1'b0, precenter, prereset, preright;
integer set_pos = 0;

// 消除 button 抖动
always_ff @ (posedge clk_centi) begin 
    tmpU3 <= tmpU2;
    tmpU2 <= tmpU1;
    tmpU1 <= TU;

    tmpL3 <= tmpL2;
    tmpL2 <= tmpL1;
    tmpL1 <= TL;

    tmpC3 <= tmpC2;
    tmpC2 <= tmpC1;
    tmpC1 <= TC;

    tmpD3 <= tmpD2;
    tmpD2 <= tmpD1;
    tmpD1 <= TD;

    tmpR3 <= tmpR2;
    tmpR2 <= tmpR1;
    tmpR1 <= TR;
end

// 译码,得到当前模式等信息
always_comb begin
    if (SET_TIME) on_set = ON;
    else on_set = OFF;

    if 	(mode == ALARM) 			begin {mode4_alarm, mode2_stopwatch, mode3_countdown, mode1_date} = 4'b1000; end
    else if (mode == STOP_WATCH) 	begin {mode4_alarm, mode2_stopwatch, mode3_countdown, mode1_date} = 4'b0100; end
    else if (mode == DOWN) 			begin {mode4_alarm, mode2_stopwatch, mode3_countdown, mode1_date} = 4'b0010; end
    else if (mode == DATE) 			begin {mode4_alarm, mode2_stopwatch, mode3_countdown, mode1_date} = 4'b0001; end
    else {mode4_alarm, mode2_stopwatch, mode3_countdown, mode1_date} = 4'b0000; //MAIN

    if (DISPLAY_SWITCHER) DISP = HIGH;
    else DISP = LOW;

    UP = tmpU1 & tmpU2 & tmpU3;
    LEFT = tmpL1 & tmpL2 & tmpL3;
    CENTER = tmpC1 & tmpC2 & tmpC3;
    RESET = tmpD1 & tmpD2 & tmpD3;
    RIGHT = tmpR1 & tmpR2 & tmpR3;
end

// 主逻辑,处理时钟/秒表的自增以及时间设定
always_ff @ (posedge clk_pre) begin
    cnt_sec <= cnt_sec + 1;
    cnt_centi <= cnt_centi + 1;
    cnt_disp <= cnt_disp + 1;
    cnt_flip <= cnt_flip + 1;
    cnt_blink <= cnt_blink + 1;


    

    // 锁存按键上一周期状态
    preon_set <= on_set ;
    preleft <= LEFT;
    preup <= UP;
    precenter <= CENTER;
    prereset <= RESET;
    preright <= RIGHT;


    if (cnt_blink == 50000000) begin  
        cnt_blink <= 0;
        clk_blink <= ~clk_blink;
    end

    if (!preon_set && on_set || !preleft && LEFT) begin
        cnt_flip <= 0;
        flip <= 1'b1;
    end
    
    else if (cnt_flip == 50000000) begin
        cnt_flip <= 0;
        flip = ~flip;
    end
    
    if (cnt_sec == 100000000) begin
        cnt_sec <= 0;
        clk_sec <= 1'b1;
    end
    else clk_sec <= 1'b0;

    if (cnt_centi == 1000000) begin
        cnt_centi <= 0;
        clk_centi <= 1'b1;
    end
    else clk_centi <= 1'b0;
    
    if (cnt_disp == 100000) begin
        cnt_disp <= 0;
        clk_disp <= 1'b1;
    end
    else clk_disp <= 1'b0;

    // RIGHT按下切换模式
    if (!preright && RIGHT) begin
        case (mode)
            MAIN :  	 mode <= DATE;
            DATE : 		 mode <= STOP_WATCH; 
            STOP_WATCH : mode <= DOWN;
            DOWN  : 	 mode <= ALARM;  
			ALARM : 	 mode <= MAIN;
            default : 	 mode <= MAIN;
        endcase
    end

    // 日期自增
    if (jw_d) begin
        if (dd0 == 9) begin dd0 <= 0; dd1 <= dd1 + 1; end
        else if ({dd1, dd0} == Handsome_ksj) begin dd0 <= 1; dd1 <= 0; jw_m <= 1'b1; end
        else dd0 <= dd0 + 1;
        jw_d <= 1'b0;
    end
    if (jw_m) begin
        if (mm0 == 9) begin mm0 <= 0; mm1 <= mm1 + 1; end
        else if ({mm1, mm0} == {4'd1, 4'd2}) begin mm0 <= 1; mm1 <= 0; jw_y <= 1'b1; end
        else mm0 <= mm0 + 1;
        jw_m <= 1'b0;
    end
    if (jw_y) begin
        if (yy0 == 9) begin
            if (yy1 == 9) begin
                if (yy2 == 9) begin
                    if (yy3 == 9) begin
                        yy3 <= 0;
                    end
                    else yy3 <= yy3 + 1;
                    yy2 <= 0;
                end
                else yy2 <= yy2 + 1;
                yy1 <= 0;
            end	
            else yy1 <= yy1 + 1;
            yy0 <= 0;
        end
        else yy0 <= yy0 + 1;
        jw_y <= 1'b0;
    end

    // 秒表
    if (clk_centi) begin
        if (!(mode == STOP_WATCH && on_set ) && counting) begin
            if (cs0 == 9) begin
                if (cs1 == 9) begin
                    if (cm0 == 9) begin
                        if (cm1 == 5) begin
                            if (ch0 == 9) begin
                                if (ch1 == 5) begin
                                    {cs0, cs1, cm0, cm1, ch0, ch1} = 24'd0;
                                end
                                else ch1 <= ch1 + 1;
                                ch0 <= 0;
                            end
                            else ch0 <= ch0 + 1;
                            cm1 <= 0;
                        end
                        else cm1 <= cm1 + 1;
                        cm0 <= 0;
                    end
                    else cm0 <= cm0 + 1;
                    cs1 <= 0;
                end
                else cs1 <= cs1 + 1;
                cs0 <= 0;
            end
            else cs0 <= cs0 + 1;
        end
    end

    // 秒级时钟逻辑
    if (clk_sec) begin
        if (alarm_time != 0) alarm_time <= alarm_time - 1;
        if (down_time != 0) down_time <= down_time - 1;
        
        // 主时钟自增
        if (!(mode == MAIN && on_set )) begin
            if (s0 == 9) begin
                if (s1 == 5) begin
                    if (m0 == 9) begin
                        if (m1 == 5) begin
                            if (h0 == 3 && h1 == 2) begin 
                                {s0, s1, m0, m1, h0, h1} <= 24'd0;
                                jw_d <= 1'b1;
                            end
                            else if (h0 == 9) begin
                                h0 <= 4'd0;
                                h1 <= h1 + 1;
                            end
                            else h0 <= h0 + 1;
                            m1 <= 0;
                        end
                        else m1 <= m1 + 1;
                        m0 <= 0;
                    end
                    else m0 <= m0 + 1;
                    s1 <= 0;
                end
                else s1 <= s1 + 1;
                s0 <= 0;
            end
            else s0 <= s0 + 1;
        end
        
        // 倒计时自减
        if (!(mode == DOWN && on_set)) begin 
            if ({dh1, dh0, dm1, dm0, ds1, ds0} != 24'd0) begin
                if (ds0 == 0) begin
                    ds0 <= 4'd9;
                    if (ds1 == 0) begin
                        ds1 <= 4'd5;
                        if (dm0 == 0) begin
                            dm0 <= 4'd9;
                            if (dm1 == 0) begin
                                dm1 <= 4'd5;
                                if (dh0 == 0) begin
                                    dh0 <= 4'd9;
                                    if (dh1 > 0) begin
                                        dh1 <= dh1 - 1;
                                    end
                                end else begin
                                    dh0 <= dh0 - 1;
                                end
                            end else begin
                                dm1 <= dm1 - 1;
                            end
                        end else begin
                            dm0 <= dm0 - 1;
                        end
                    end else begin
                        ds1 <= ds1 - 1;
                    end
                end else begin
                    ds0 <= ds0 - 1;
                end
            end
        end
    end 

    // 动态显示模块,对显示位置循环
    if (clk_disp) begin 
        case (disp_pos)
            0: disp_pos <= 1;
            1: disp_pos <= 2;
            2: disp_pos <= 3;
            3: disp_pos <= 0;
        endcase
    end

    // 设时模块
    if (!preup && UP) begin
        if (mode == MAIN && on_set) begin //set clock
            if (DISP == LOW) begin
                case (set_pos)
                    0: begin if (s0 == 9) s0 <= 0; else s0 <= s0 + 1; end
                    1: begin if (s1 == 5) s1 <= 0; else s1 <= s1 + 1; end
                    2: begin if (m0 == 9) m0 <= 0; else m0 <= m0 + 1; end
                    3: begin if (m1 == 5) m1 <= 0; else m1 <= m1 + 1; end
                endcase
            end
            else begin
                case (set_pos)
                    0: begin if (m0 == 9) m0 <= 0; else m0 <= m0 + 1; end
                    1: begin if (m1 == 9) m1 <= 0; else m1 <= m1 + 1; end
                    2: begin if (h0 == 9 || h0 == 3 && h1 == 2) h0 <= 0; else h0 <= h0 + 1; end
                    3: begin if (h1 == 2) h1 <= 0; else h1 <= h1 + 1; end
                endcase
            end
        end
        if (mode == ALARM && on_set ) begin //set alarm
            if (DISP == LOW) begin
                case (set_pos)
                    0: begin if (as0 == 9) as0 <= 0; else as0 <= as0 + 1; end
                    1: begin if (as1 == 5) as1 <= 0; else as1 <= as1 + 1; end
                    2: begin if (am0 == 9) am0 <= 0; else am0 <= am0 + 1; end
                    3: begin if (am1 == 5) am1 <= 0; else am1 <= am1 + 1; end
                endcase
            end
            else begin
                case (set_pos)
                    0: begin if (am0 == 9) am0 <= 0; else am0 <= am0 + 1; end
                    1: begin if (am1 == 9) am1 <= 0; else am1 <= am1 + 1; end
                    2: begin if (ah0 == 9 || ah0 == 3 && ah1 == 2) ah0 <= 0; else ah0 <= ah0 + 1; end
                    3: begin if (ah1 == 2) ah1 <= 0; else ah1 <= ah1 + 1; end
                endcase
            end
        end
        if (mode == DOWN && on_set ) begin // set count_down
            if (DISP == LOW) begin
                case (set_pos)
                    0: begin if (ds0 == 9) ds0 <= 0; else ds0 <= ds0 + 1; end
                    1: begin if (ds1 == 5) ds1 <= 0; else ds1 <= ds1 + 1; end
                    2: begin if (dm0 == 9) dm0 <= 0; else dm0 <= dm0 + 1; end
                    3: begin if (dm1 == 5) dm1 <= 0; else dm1 <= dm1 + 1; end
                endcase
            end
            else begin
                case (set_pos)
                    0: begin if (dm0 == 9) dm0 <= 0; else dm0 <= dm0 + 1; end
                    1: begin if (dm1 == 9) dm1 <= 0; else dm1 <= dm1 + 1; end
                    2: begin if (dh0 == 9 || dh0 == 3 && dh1 == 2) dh0 <= 0; else dh0 <= dh0 + 1; end
                    3: begin if (dh1 == 2) dh1 <= 0; else dh1 <= dh1 + 1; end
                endcase
            end
        end
        if (mode == DATE && on_set ) begin // set date
            if (DISP == LOW) begin
                case (set_pos)
                    0: begin if (dd0 == 9) dd0 <= 0; else dd0 <= dd0 + 1; end
                    1: begin if (dd1 == 3) dd1 <= 0; else dd1 <= dd1 + 1; end
                    2: begin if (mm0 == 9) mm0 <= 0; else mm0 <= mm0 + 1; end
                    3: begin if (mm1 == 1) mm1 <= 0; else mm1 <= mm1 + 1; end
                endcase
            end
            else begin
                case (set_pos)
                    0: begin if (yy0 == 9) yy0 <= 0; else yy0 <= yy0 + 1; end
                    1: begin if (yy1 == 9) yy1 <= 0; else yy1 <= yy1 + 1; end
                    2: begin if (yy2 == 9) yy2 <= 0; else yy2 <= yy2 + 1; end
                    3: begin if (yy3 == 9) yy3 <= 0; else yy3 <= yy3 + 1; end
                endcase
            end
        end
    end

    // reset
    if (!prereset && RESET) begin
        case (mode) 
            STOP_WATCH: {cs0, cs1, cm0, cm1, ch0, ch1} <= 24'd0;
            MAIN: {s0, s1, m0, m1, h0, h1} <= 24'd0; 
            ALARM: {as0, as1, am0, am1, ah0, ah1} <= 24'd0;
            DOWN: {ds0, ds1, dm0, dm1, dh0, dh1} <= 24'd0;
        endcase
    end

    // 开始/停止计时
    if (!precenter && CENTER) begin
        if (mode == STOP_WATCH) begin
            counting <= 1'b1 ^ counting;
        end
    end

    // 计时器归零,亮 5s
	if (ds0 == 0 && ds1 == 0 && dm0 == 0 && dm1 == 0 && dh0 == 0 && dh1 == 0) begin
		down_sig <= 1'b1;
		if (!down_sig) down_time <= 5;
	end
	else down_sig <= 1'b0;

	// 闹钟响,亮 5s
	if (s0 == as0 && s1 == as1 && m0 == am0 && m1 == am1 && h0 == ah0 && h1 == ah1) begin
		alarm_sig <= 1'b1;
		if (!alarm_sig && ALARM_ENABLE) alarm_time <= 5;
	end
	else alarm_sig <= 1'b0;

end

// 判断月份天数的组合逻辑(不考虑闰年)
always_comb begin
    case ({mm1, mm0}) 
        {4'd0, 4'd1}: Handsome_ksj = {4'd3, 4'd1};
        {4'd0, 4'd2}: Handsome_ksj = {4'd2, 4'd8};
        {4'd0, 4'd3}: Handsome_ksj = {4'd3, 4'd1};
        {4'd0, 4'd4}: Handsome_ksj = {4'd3, 4'd0};
        {4'd0, 4'd5}: Handsome_ksj = {4'd3, 4'd1};
        {4'd0, 4'd6}: Handsome_ksj = {4'd3, 4'd0};
        {4'd0, 4'd7}: Handsome_ksj = {4'd3, 4'd1};
        {4'd0, 4'd8}: Handsome_ksj = {4'd3, 4'd1};
        {4'd0, 4'd9}: Handsome_ksj = {4'd3, 4'd0};
        {4'd1, 4'd0}: Handsome_ksj = {4'd3, 4'd1};
        {4'd1, 4'd1}: Handsome_ksj = {4'd3, 4'd0};
        {4'd1, 4'd2}: Handsome_ksj = {4'd3, 4'd1};
    endcase
end

// 设置 on_set 模式下的修改位置
always_ff @ (posedge LEFT) begin
    if (on_set == ON) begin
        if (set_pos == 3) set_pos <= 0;
        else set_pos <= set_pos + 1;
    end
end

// 显示数据选择
always_comb begin 
    case (mode)
        MAIN:
            if (DISP == LOW) begin disp_A0 = m0; disp_A1 = m1; disp_B0 = s0; disp_B1 = s1; end
            else begin disp_A0 = h0; disp_A1 = h1; disp_B0 = m0; disp_B1 = m1; end
		DATE:
            if (DISP == LOW) begin disp_A0 = mm0; disp_A1 = mm1; disp_B0 = dd0; disp_B1 = dd1; end
            else begin disp_A0 = yy2; disp_A1 = yy3; disp_B0 = yy0; disp_B1 = yy1; end
        ALARM: 
            if (DISP == LOW) begin disp_A0 = am0; disp_A1 = am1; disp_B0 = as0; disp_B1 = as1; end
            else begin disp_A0 = ah0; disp_A1 = ah1; disp_B0 = am0; disp_B1 = am1; end
        STOP_WATCH:
            if (DISP == LOW) begin disp_A0 = cm0; disp_A1 = cm1; disp_B0 = cs0; disp_B1 = cs1; end
            else begin disp_A0 = ch0; disp_A1 = ch1; disp_B0 = cm0; disp_B1 = cm1; end
        DOWN:
            if (DISP == LOW) begin disp_A0 = dm0; disp_A1 = dm1; disp_B0 = ds0; disp_B1 = ds1; end
            else begin disp_A0 = dh0; disp_A1 = dh1; disp_B0 = dm0; disp_B1 = dm1; end
        default: begin disp_A0 = 4'd0; disp_A1 = 4'd0; disp_B0 = 4'd0; disp_B1 = 4'd0; end
    endcase
end

// 7段数码管显示控制
always_comb begin 
    tag1 = 1'b1;

    if (DISP == LOW) begin 
        tag0 = 1'b0; 
        tag2 = 1'b1; 
    end
    else begin 
        tag2 = 1'b0; 
        tag0 = 1'b1; 
    end

    if (disp_pos == 2 && !(mode == DATE && DISP == HIGH)) begin
        dp = 1'b0;
    end
    else if(disp_pos == 0 && ALARM_ENABLE) begin
        dp = 1'b0;
    end
    else dp = 1'b1;

    case (disp_pos)
        0: begin disp_7seg[10:7] = 4'b1110; disp_number = disp_B0;end
        1: begin disp_7seg[10:7] = 4'b1101; disp_number = disp_B1;end
        2: begin disp_7seg[10:7] = 4'b1011; disp_number = disp_A0;end
        3: begin disp_7seg[10:7] = 4'b0111; disp_number = disp_A1;end
        default: begin disp_7seg[10:7] = 4'b0000; disp_number = 0;end
    endcase

    if (on_set && disp_pos == set_pos && flip) begin
        disp_7seg[6:0] = 7'b1111111;
    end
    else begin
        case (disp_number)
            4'd0: disp_7seg[6:0] = 7'b0000001;
            4'd1: disp_7seg[6:0] = 7'b1001111;
            4'd2: disp_7seg[6:0] = 7'b0010010;
            4'd3: disp_7seg[6:0] = 7'b0000110;
            4'd4: disp_7seg[6:0] = 7'b1001100;
            4'd5: disp_7seg[6:0] = 7'b0100100;
            4'd6: disp_7seg[6:0] = 7'b0100000;
            4'd7: disp_7seg[6:0] = 7'b0001111;
            4'd8: disp_7seg[6:0] = 7'b0000000;
            4'd9: disp_7seg[6:0] = 7'b0000100;
            default: disp_7seg[6:0] = 7'b1111111;
        endcase
    end
end

// 控制闹钟和定时器的灯
always_comb begin
    
	if (alarm_time != 0) 
        alarm_light = ((alarm_time == 5) || clk_blink) && ALARM_ENABLE;  // 闪烁
	else 
        alarm_light = 1'b0;


	if (down_time == 0) 
        down_light = 1'b0;   
	else 
        down_light = (down_time == 5) || clk_blink;   // 闪烁
end

endmodule

        2. 约束文件

set_property PACKAGE_PIN W5 [get_ports clk_pre]
set_property IOSTANDARD LVCMOS33 [get_ports clk_pre]
create_clock -period 10 -name clk_pre [get_ports clk_pre]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_clocks clk_pre]

set_property PACKAGE_PIN T18 [get_ports TU]
set_property IOSTANDARD LVCMOS33 [get_ports TU]
set_property PACKAGE_PIN W19 [get_ports TL]
set_property IOSTANDARD LVCMOS33 [get_ports TL]
set_property PACKAGE_PIN U18 [get_ports TC]
set_property IOSTANDARD LVCMOS33 [get_ports TC]
set_property PACKAGE_PIN U17 [get_ports TD]
set_property IOSTANDARD LVCMOS33 [get_ports TD]
set_property PACKAGE_PIN T17 [get_ports TR]
set_property IOSTANDARD LVCMOS33 [get_ports TR]

set_property PACKAGE_PIN R2 [get_ports SET_TIME]
set_property IOSTANDARD LVCMOS33 [get_ports SET_TIME]
set_property PACKAGE_PIN V17 [get_ports DISPLAY_SWITCHER]
set_property IOSTANDARD LVCMOS33 [get_ports DISPLAY_SWITCHER]
set_property PACKAGE_PIN T1 [get_ports ALARM_ENABLE]
set_property IOSTANDARD LVCMOS33 [get_ports ALARM_ENABLE]


set_property PACKAGE_PIN V7 [get_ports dp]
set_property IOSTANDARD LVCMOS33 [get_ports dp]
set_property PACKAGE_PIN W4 [get_ports {disp_7seg[10]}]
set_property PACKAGE_PIN V4 [get_ports {disp_7seg[9]}]
set_property PACKAGE_PIN U4 [get_ports {disp_7seg[8]}]
set_property PACKAGE_PIN U2 [get_ports {disp_7seg[7]}]
set_property PACKAGE_PIN W7 [get_ports {disp_7seg[6]}]
set_property PACKAGE_PIN W6 [get_ports {disp_7seg[5]}]
set_property PACKAGE_PIN U8 [get_ports {disp_7seg[4]}]
set_property PACKAGE_PIN V8 [get_ports {disp_7seg[3]}]
set_property PACKAGE_PIN U5 [get_ports {disp_7seg[2]}]
set_property PACKAGE_PIN V5 [get_ports {disp_7seg[1]}]
set_property PACKAGE_PIN U7 [get_ports {disp_7seg[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports disp_7seg]

set_property PACKAGE_PIN L1 [get_ports mode1_date]
set_property IOSTANDARD LVCMOS33 [get_ports mode1_date]
set_property PACKAGE_PIN P1 [get_ports mode2_stopwatch]
set_property IOSTANDARD LVCMOS33 [get_ports mode2_stopwatch]
set_property PACKAGE_PIN N3 [get_ports mode3_countdown]
set_property IOSTANDARD LVCMOS33 [get_ports mode3_countdown]
set_property PACKAGE_PIN P3 [get_ports mode4_alarm]
set_property IOSTANDARD LVCMOS33 [get_ports mode4_alarm]
set_property PACKAGE_PIN U16 [get_ports alarm_light]
set_property IOSTANDARD LVCMOS33 [get_ports alarm_light]
set_property PACKAGE_PIN E19 [get_ports down_light]
set_property IOSTANDARD LVCMOS33 [get_ports down_light]

set_property PACKAGE_PIN V3 [get_ports tag0]
set_property IOSTANDARD LVCMOS33 [get_ports tag0]

set_property PACKAGE_PIN V13 [get_ports tag1]
set_property IOSTANDARD LVCMOS33 [get_ports tag1]

set_property PACKAGE_PIN V14 [get_ports tag2]
set_property IOSTANDARD LVCMOS33 [get_ports tag2]

更多推荐