根据所提供的真值表进行分析,可以知道有效状态为6~15,因此,根据优先编码器的逻辑可以得出最基本的代码逻辑,如下:
always@(I_n) begin
if(I_n == 9'b111111111) Y_n = 4'b1111;
if(I_n[8]==0) Y_n =4'b0110;
if(I_n[7]==0&&I_n[8]!=0) Y_n =4'b0111;
if(I_n[6]==0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1000;
if(I_n[5]==0&&I_n[6]!=0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1001;
if(I_n[4]==0&&I_n[5]!=0&&I_n[6]!=0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1010;
if(I_n[3]==0&&I_n[4]!=0&&I_n[5]!=0&&I_n[6]!=0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1011;
if(I_n[2]==0&&I_n[3]!=0&&I_n[4]!=0&&I_n[5]!=0&&I_n[6]!=0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1100;
if(I_n[1]==0&&I_n[2]!=0&&I_n[3]!=0&&I_n[4]!=0&&I_n[5]!=0&&I_n[6]!=0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1101;
if(I_n[0]==0&&I_n[1]!=0&&I_n[2]!=0&&I_n[3]!=0&&I_n[4]!=0&&I_n[5]!=0&&I_n[6]!=0&&I_n[7]!=0&&I_n[8]!=0) Y_n =4'b1110;
end
也可以使用case语句进行赋值,这个就使用了通配符,更加推荐(简单地说,三者都是可以综合的。case
进行全等匹配,casez
忽略?
或z
对应的位进行匹配,casex
忽略x
、?
或z
对应的位进行匹配。):
always@(*) begin
casez (I_n)
9'b1_1111_1111: Y_n = 4'b1111;
9'b0_????_????: Y_n = 4'b0110;
9'b1_0???_????: Y_n = 4'b0111;
9'b1_10??_????: Y_n = 4'b1000;
9'b1_110?_????: Y_n = 4'b1001;
9'b1_1110_????: Y_n = 4'b1010;
9'b1_1111_0???: Y_n = 4'b1011;
9'b1_1111_10??: Y_n = 4'b1100;
9'b1_1111_110?: Y_n = 4'b1101;
9'b1_1111_1110: Y_n = 4'b1110;
default: Y_n = 4'b0000;
endcase
end