
图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