`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输出是低电平有效,key_encoder输出是高电平有效
encoder_0 encode_keyboard(S_n[9:1],L_temp);//不含0,0由GS表示;
//需注意L_temp任意位为0表示1-9有按键按下
//GS为1表示0按下
assign GS = ~(S_n[0] & &L_temp); //表示0按下(S_n[0]=1),其他键未按下(全1)
assign L = ~L_temp;
endmodule