描述
②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。
可将优先编码器Ⅰ的代码添加到本题答案中,并例化。
优先编码器Ⅰ的代码如下:
module encoder_83( input logic [7:0] I , input logic EI , output logic [2:0] Y , output logic GS , output logic 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
解答:
解析:
因为要使用8位去处理16位的工作,因此要先将16位分为两个8位的,分别为A[15:8]与A[7:0]。
首先对于A[15:8],在他全为0时,开始进行后面的判断,即:1、他的优先级高于低8位;2、他如果不为0,只需要判断高8位即可,为0,判断低8位。则把16位的分为两个8位的。
即L[3]表示他是低8位还是高8位,L[2:0]表示他的数值。
当L[3]为1时,他表示高8位有数据为1,此时输出值记为Y1,此时不用管低8位,则输出L的构成为{1,Y1},当L[3]为0时,此时不管高8为,输出记为Y2,此时L构成为{0,Y2}.
当EO为1时,代表高8位为0,需要进行低8位的判断;
对于Y1与Y2,输出在两个中进行选择,假设使用到第二个,即高8位为0,那么输出也为0,0或Y2等于Y2,同理,Y1类似,故代码如下:
`timescale 1ns/1ns
module encoder_83(
input logic [7:0] I ,
input logic EI ,
output logic [2:0] Y ,
output logic GS ,
output logic 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
module encoder_164(
input logic [15:0] A ,
input EI ,
output logic [3:0] L ,
output logic GS ,
output logic EO
);
logic [2:0]Y1;
logic GS1;
logic EO1;
logic [2:0]Y2;
logic GS2;
encoder_83 u0_encoder_83(
.I (A[15:8]),
.EI (EI),
.Y (Y1),
.GS (GS1),
.EO (EO1)
);
encoder_83 u1_encoder_83(
.I (A[7:0]),
.EI (EO1),
.Y (Y2),
.GS (GS2),
.EO (EO2)
);
assign GS = GS1 | GS2;
assign EO = EO1 & EO2;
assign L = {GS1,Y2 | Y1};
endmodule