描述
请使用优先编码器①实现键盘编码电路,可添加并例化题目中已给出的优先编码器代码。
10个按键分别对应十进制数0-9,按键9的优先级别最高;按键悬空时,按键输出高电平,按键按下时,按键输出低电平;键盘编码电路的输出是8421BCD码。
要求:键盘编码电路要有工作状态标志,以区分没有按键按下和按键0按下两种情况。
优先编码器真值表如下图:
优先编码器代码如下:
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
输入描述
input [9:0] S_n
输出描述
output wire[3:0] L ,
output wire GS
解题分析
②实现键盘编码电路
用S_n[0]~S_n[9]表示10个按键,分别对应编码器的10个输入端,工作状态用GS表示,当有按键按下时,GS是1,当无按键按下时,GS是0.
需要考虑的是如何将10个按键对应到编码器的9个输入端。
画出此键盘编码电路真值表。
对照此键盘编码电路真值表和编码器的真值表可以看出,将编码器输出反向后,就可以实现表格中蓝色的部分功能。将所有输入信号进行与非运算后,便可作为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
注:解题分析来源于网友,如有侵权,请告删之。