专栏前言
本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网


分析
用此编码器实现键盘的编码电路。
注意:编码器的输出是低电平有效,而键盘编码电路输出的是正常的8421BCD码,是高电平有效。因此将编码器的输出取反就是8421编码输出的结果
S_n[0]~S_n[9]表示10个按键,分别对应编码器的10个输入端,工作状态用GS表示,当有按键按下时,GS是1,当无按键按下时,GS是0.
需要考虑的是如何将10个按键对应到编码器的9个输入端。
仅有一种情况GS为0 即Y_n的四位均为1且S_n[0]也为1 即所有按键都没按下
- `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; // 若0被按下 Y_n会赋值为默认值
- 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