代码
module key_encoder(
input [9:0] S_n ,
output wire[3:0] L ,
output wire GS
);
wire [3:0] Y_n;
encoder_0 myEncoder(.I_n(S_n[9:1]), .Y_n(Y_n));
assign L = ~Y_n;
assign GS = S_n!='b11_1111_1111;
endmodule
简析
本质上就是将给出的9-4编码器扩展为10-4编码器。其中输入为低电平有效,输出为高电平有效,并且额外添加GS
信号来指示是否有按键按下。
原9-4编码器真值表的输出取反就是对应输入的8421BCD码。额外添加逻辑使得S_n=='b11_1111_1110
时L=0
即可。也就是:
assign L = (S_n=='b11_1111_1110)? 4'b0: ~Y_n;
又因为原9-4编码器默认输出就是4'b1111
,取反就是0
,所以可以直接写成:
assign L = ~Y_n;
最开始我的第一种代码没有添加括号,也就是:
assign L = S_n=='b11_1111_1110? 4'b0: ~Y_n;
一直报错“syntax error in continuous assignment”。反复检查才发现,S_n=='b11_1111_1110?
把问号也当成数值的一部分了...