【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16
使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器
描述
②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。
可将优先编码器Ⅰ的代码添加到本题答案中,并例化。
优先编码器Ⅰ的代码如下:
module encoder_83(
input [7:0] I ,
input EI ,
output wire [2:0] Y ,
output wire GS ,
output wire EO
);
assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]);
assign Y[1] = EI & (I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]);
assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]);
assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0];
assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]);
//assign GS = EI&(| I);
endmodule
下表是8线-3线优先编码器Ⅰ的功能表
EI | I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0] | Y[2] | Y[1] | Y[0] | GS | EO |
0 | x | x | x | x | x | x | x | x | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 1 | x | x | x | x | x | x | x | 1 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | x | x | x | x | x | x | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | x | x | x | x | x | 1 | 0 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 | x | x | x | x | 1 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 1 | x | x | x | 0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | x | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | x | 0 | 0 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
输入描述:
input [15:0] A ,
input EI
输出描述:
output wire [3:0] L ,
output wire GS ,
output wire EO
解题思路:
16-4线优先编码器与8-3优先编码器工作状态类似:
对于编码器1:令其I7~I0对应16-4编码器的A7~A0,将编码器1记为EN1;
同理,编码器2:I7~I0对应16-4编码器的A15~A8,将编码器2记为EN2;
将EN1的使能端EI做为整个编码器的使能端EI;
其中,我们希望当EN1为EI=1时,EN2的EI端同样为1,即两个编码器EN1,EN2同时进入工作状态;根据8-3编码器的功能表,发现,当E1=1时,无论什么情况,GS和EO端的输出值总有一个值为1,即GS | EO = 1;因此,将EN1的GS端和EO端经过一个或门(OR)再接入EN2的EI端;
GS:当且仅当A[15:0]为全0时,GS=0,因此,将两个EN的GS端经过一个或门(OR)输出,可包含以上情况;
EO:当且仅当A[15:0]为全0时,EO=1,因此,将两个EN的EO端经过一个与门(AND)输出;
对于输出变量L的判断:
L[3]:当L[3]=0时,说明待编码的数据为前8个数据(EN1);当L[3]=1时,说明待编码的数据为后8个数据(EN2);
对于L[3]的状态的判定,只需要判定EN2的输出端Y与GS的按位相或是否为1(观察8-3编码器功能表),
L[3]=1则说明EN2处于输出状态,最终输出的L[2:0]同样应为EN2的Y端;
L[3]=0:说明L[2:0]应对应于EN1的输出端Y;
(因为设定的是EN2的为高端输出,因此EN2优先级高)
因此,根据以上所述画出其电路图:
代码如下:
`timescale 1ns/1ns
module encoder_164(
input [15:0] A ,
input EI ,
output wire [3:0] L ,
output wire GS ,
output wire EO
);
wire [2:0] E1_Y, E2_Y;
wire Eo_1, Eo_2;
wire Ei_2;
wire GS_1, GS_2;
//编码器1
encoder_83 EN1(.I(A[7:0]),
.EI(EI),
.Y(E1_Y),
.GS(GS_1),
.EO(Eo_1));
//编码器2
assign Ei_2 = GS_1 | Eo_1;
encoder_83 EN2(.I(A[15:8]),
.EI(Ei_2),
.Y(E2_Y),
.GS(GS_2),
.EO(Eo_2));
assign L[3] = |{E2_Y[2:0], GS_2} ;
assign L[2:0] = (L[3])? E2_Y : E1_Y;
assign EO = Eo_1&Eo_2;
assign GS = GS_1 | GS_2;
endmodule