思路:
首先确定电路输出L是8421BCD码,即是高电平有效的,而题目中给出的优先编码器输出Y_n是低电平有效的,故应当明确L和Y_n两者的状态是恰好相反的;
注意:键盘有10个按键,而所给的优先编码器是只有9个输入的;
此题关键在于着重理解: “键盘编码电路要有工作状态标志,以区分没有按键按下和按键0按下两种情况。” : 这句话的潜台词是 按键按下和按键0按下时,电路的输出L的状态是一样的,因此在这种情况下可以通过GS信号来区分键盘是否处在工作状态,对应的真值表如下;
键盘状态 | S[9:0] | L[3:0] | GS |
无按键按下 | 1_1111_1111 | 0000 | 0 |
按键0按下 | 1_1111_1110 | 0000 | 1 |
- `timescale 1ns/1ns
- module encoder_0(
- input [8:0] I_n ,
-
- output reg [3:0] Y_n
- );
-
- always @(*)begin
- casex(I_n)
- 9'b111111111 : Y_n = 4'b1111;
- 9'b0xxxxxxxx : Y_n = 4'b0110;
- 9'b10xxxxxxx : Y_n = 4'b0111;
- 9'b110xxxxxx : Y_n = 4'b1000;
- 9'b1110xxxxx : Y_n = 4'b1001;
- 9'b11110xxxx : Y_n = 4'b1010;
- 9'b111110xxx : Y_n = 4'b1011;
- 9'b1111110xx : Y_n = 4'b1100;
- 9'b11111110x : Y_n = 4'b1101;
- 9'b111111110 : Y_n = 4'b1110;
- default : Y_n = 4'b1111;
- endcase
- end
-
- endmodule
- module key_encoder(
- input [9:0] S_n ,
-
- output wire[3:0] L ,
- output wire GS
- );
- wire [3:0] L_temp;
- encoder_0 encoder(
- S_n[9:1],L_temp
- );
- assign GS = ~((&(~L)) & S_n[0]);
- assign L = ~L_temp;
- endmodule
解法二
- `timescale 1ns/1ns
- module encoder_0(
- input [8:0] I_n ,
-
- output reg [3:0] Y_n
- );
-
- always @(*)begin
- casex(I_n)
- 9'b111111111 : Y_n = 4'b1111;
- 9'b0xxxxxxxx : Y_n = 4'b0110;
- 9'b10xxxxxxx : Y_n = 4'b0111;
- 9'b110xxxxxx : Y_n = 4'b1000;
- 9'b1110xxxxx : Y_n = 4'b1001;
- 9'b11110xxxx : Y_n = 4'b1010;
- 9'b111110xxx : Y_n = 4'b1011;
- 9'b1111110xx : Y_n = 4'b1100;
- 9'b11111110x : Y_n = 4'b1101;
- 9'b111111110 : Y_n = 4'b1110;
- default : Y_n = 4'b1111;
- endcase
- end
-
- endmodule
- module key_encoder(
- input [9:0] S_n ,
-
- output wire[3:0] L ,
- output wire GS
- );
- wire [3:0] Y_n;
- encoder_0 u0(
- .I_n(S_n[9:1]),
- .Y_n(Y_n)
- );
- assign L = ~Y_n;
- assign GS = ~(S_n[0] & Y_n[0] & Y_n[1] & Y_n[2] & Y_n[3]);
- endmodule
解法三
- `timescale 1ns/1ns
- module encoder_0(
- input [8:0] I_n ,
-
- output reg [3:0] Y_n
- );
-
- always @(*)begin
- casex(I_n)
- 9'b111111111 : Y_n = 4'b1111;
- 9'b0xxxxxxxx : Y_n = 4'b0110;
- 9'b10xxxxxxx : Y_n = 4'b0111;
- 9'b110xxxxxx : Y_n = 4'b1000;
- 9'b1110xxxxx : Y_n = 4'b1001;
- 9'b11110xxxx : Y_n = 4'b1010;
- 9'b111110xxx : Y_n = 4'b1011;
- 9'b1111110xx : Y_n = 4'b1100;
- 9'b11111110x : Y_n = 4'b1101;
- 9'b111111110 : Y_n = 4'b1110;
- default : Y_n = 4'b1111;
- endcase
- end
-
- endmodule
- module key_encoder(
- input [9:0] S_n ,
-
- output wire[3:0] L ,
- output wire GS
- );
- wire [3:0] Y_n;
- encoder_0 u0(
- .I_n(S_n[9:1]),
- .Y_n(Y_n)
- );
- assign L = ~Y_n;
- assign GS = ~&S_n;
- endmodule