题意整理

②用此编码器实现键盘的编码电路。

注意:编码器的输出是低电平有效,而键盘编码电路输出的是正常的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的输出。

编码器是9个输出端,键盘编码器需要10个,因此将S_n[0]接与非门的输入端,当S_n[1]~S_n[9]是1,S_n[0]是0时,L编码是0000,GS是1,进而可画出键盘编码电路如下:

结合电路图,将电路转换成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