
图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.显示界面切换
界面之间的切换:由移动闪动的小数点完成。
- 当闪动的小数点移动到小时(最左边),继续左移时,即从第一个界面切换到第二个界面。
- 当闪动的小数点移动到日(最右边),继续右移时,可以从第二个界面返回到第一个界面。
因此对移动的小数点有要求:
- 当闪动的小数点移动到秒的低位(最右边),继续按下右移键时,闪动的小数点保持原位置不变;
- 当闪动的小数点移动到月的高位,继续按下左移键时,闪动的小数点保持原位置不变
调度代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
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 |