`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_INV ; encoder_0 u_enc( .I_n (S_n[9:1] ), .Y_n ( L_INV) ); assign L = ~L_INV ; assign GS = (S_n != 10'b1111111111) ; endmodule
L 是反码 , 查看真值表
GS 有效标志 ;
至于为什么S[0]不传入编码器 , 说明key 0 是靠判断S[0] == 0 && S[9:1] ==1时 , 手动认为是 L=4'b0000;