Menu Close

复杂数字钟设计(5)–调度

%title插图%num

图1

调度或资源分配,由于需要显示的内容有10个BCD码计数器,而数码管只有6个,因此在显示之前进行资源调度。调度的原则如下:

数码管显示内容

1.常规显示

数码管显示由dp_in_pos[9:0]决定,dp_in_pos每时刻只有一位为1,其它位都为0;

  • 当dp_in_pos[5:0]的任意一位为1时,数码管显示的内容。
  • 当dp_in_pos[9:6]的任意一位为1时,数码管显示字符“dd”的内容。

 

2.显示界面切换

界面之间的切换:由移动闪动的小数点完成。

  • 闪动的小数点移动到小时(最左边),继续左移时,即从第一个界面切换到第二个界面。
  • 闪动的小数点移动到日(最右边),继续右移时,可以从第二个界面返回到第一个界面。

因此对移动的小数点有要求:

  • 闪动的小数点移动到秒的低位(最右边),继续按下右移键时,闪动的小数点保持原位置不变;
  • 闪动的小数点移动到月的高位,继续按下左移键时,闪动的小数点保持原位置不变

调度代码如下:

module schdl_adjust
(
    input rst,
    input clk,
    input s_p,

    input [ 9: 0 ] dp_in_pos,


    input [ 3: 0 ] s_in_l,
    input [ 3: 0 ] s_in_h,
    input [ 3: 0 ] m_in_l,
    input [ 3: 0 ] m_in_h,
    input [ 3: 0 ] h_in_l,
    input [ 3: 0 ] h_in_h,
    input [ 3: 0 ] d_in_l,
    input [ 3: 0 ] d_in_h,
    input [ 3: 0 ] mh_in_l,
    input [ 3: 0 ] mh_in_h,



    output reg[ 3: 0 ] seg_out_a,
    output reg[ 3: 0 ] seg_out_b,
    output reg[ 3: 0 ] seg_out_c,
    output reg[ 3: 0 ] seg_out_d,
    output reg[ 3: 0 ] seg_out_e,
    output reg[ 3: 0 ] seg_out_f,
    output reg[ 5: 0 ] dp_out
);

//从10个BCD码中为6个数码管选择对应的计数器
always@( posedge clk or posedge rst )
begin
    if ( rst )
    begin
        seg_out_a <= 0;
        seg_out_b <= 0;
        seg_out_c <= 0;
        seg_out_d <= 0;
        seg_out_e <= 0;
        seg_out_f <= 0;
    end
    else
    begin
        case ( dp_in_pos )
            10'b00_0000_0001,
            10'b00_0000_0010,
            10'b00_0000_0100,
            10'b00_0000_1000,
            10'b00_0001_0000,
            10'b00_0010_0000:
            begin //page one displays second, minute, and hour
                seg_out_a <= s_in_l;
                seg_out_b <= s_in_h;
                seg_out_c <= m_in_l;
                seg_out_d <= m_in_h;
                seg_out_e <= h_in_l;
                seg_out_f <= h_in_h;
            end

            10'b00_0100_0000,
            10'b00_1000_0000,
            10'b01_0000_0000,
            10'b10_0000_0000:
            begin //page two displays day and month
                seg_out_a <= d_in_l;
                seg_out_b <= d_in_h;
                seg_out_c <= mh_in_l;
                seg_out_d <= mh_in_h;
                seg_out_e <= 4'hd;
                seg_out_f <= 4'hd;
            end

            default:
            begin
                seg_out_a <= s_in_l;
                seg_out_b <= s_in_h;
                seg_out_c <= m_in_l;
                seg_out_d <= m_in_h;
                seg_out_e <= h_in_l;
                seg_out_f <= h_in_h;
            end

        endcase

    end
end

//小数点选择
always@( posedge clk or posedge rst )
begin
    if ( rst )
    begin
        dp_out <= 6'b111111;
    end
    else
    begin
        if ( s_p )
        begin
            if ( dp_in_pos > 32  ) dp_out <= 6'b111010; //月,日显示的固定小数点
            else dp_out <= 6'b101011;                   //时,分,秒显示的固定小数点

            case ( dp_in_pos   )
                //显示界面1
                1:   dp_out[ 0 ] <= ~dp_out[ 0 ];
                2:   dp_out[ 1 ] <= ~dp_out[ 1 ];
                4:   dp_out[ 2 ] <= ~dp_out[ 2 ];
                8:   dp_out[ 3 ] <= ~dp_out[ 3 ];
                16:  dp_out[ 4 ] <= ~dp_out[ 4 ];
                32:  dp_out[ 5 ] <= ~dp_out[ 5 ];
                
                //显示界面2
                64:  dp_out[ 0 ] <= ~dp_out[ 0 ];
                128: dp_out[ 1 ] <= ~dp_out[ 1 ];
                256: dp_out[ 2 ] <= ~dp_out[ 2 ];
                512: dp_out[ 3 ] <= ~dp_out[ 3 ];
                default: dp_out[ 0 ] <= ~dp_out[ 0 ];
            endcase
        end
    end
end


endmodule

 

 

Posted in FPGA, FPGA, Quartus II, Verilog, 开发工具, 教材与教案, 文章, 编程语言

发表评论

相关链接