题意整理
②用此编码器实现键盘的编码电路。
注意:编码器的输出是低电平有效,而键盘编码电路输出的是正常的8421BCD码,是高电平有效。
编码器的输入端是9个,键盘共10个按键,需要特别考虑。
题解主体
②实现键盘编码电路
用S_n[0]~S_n[9]表示10个按键,分别对应编码器的10个输入端,工作状态用GS表示,当有按键按下时,GS是1,当无按键按下时,GS是0.
需要考虑的是如何将10个按键对应到编码器的9个输入端。
画出此键盘编码电路真值表。
S_n[0] |
S_n[1] |
S_n[2] |
S_n[3] |
S_n[4] |
S_n[5] |
S_n[6] |
S_n[7] |
S_n[8] |
S_n[9] |
L[0] |
L[1] |
L[2] |
L[3] |
GS |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
x |
x |
x |
x |
x |
x |
x |
x |
x |
0 |
1 |
0 |
0 |
1 |
1 |
x |
x |
x |
x |
x |
x |
x |
x |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
x |
x |
x |
x |
x |
x |
x |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
x |
x |
x |
x |
x |
x |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
x |
x |
x |
x |
x |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
x |
x |
x |
x |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
x |
x |
x |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
x |
x |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
x |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
对照此键盘编码电路真值表和编码器的真值表可以看出,将编码器输出反向后,就可以实现表格中蓝色的部分功能。将所有输入信号进行与非运算后,便可作为GS的输出。
结合电路图,将电路转换成Verilog代码描述如下:
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]);
参考答案
`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