题解 | #优先编码器Ⅰ#
优先编码器Ⅰ
https://www.nowcoder.com/practice/a7068b8f4c824d6a9592f691990b21de
首先要明确一个概念:优先编码器电路中,允许同时输入两个以上的编码信号。不过在设计优先编码器时已经将所有的输入信号按优先顺序排了队,但几个信号同时出现时,只对其中优先权最高的一个进行编码。
1. 由功能表可知I的高位优先权高,可得Y与I的关系为:
Y[2] = I[7] | I[6] | I[5] | I[4]
Y[1] = I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]
Y[0] = I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]
Y[1] = I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]
Y[0] = I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]
2. I≠0时,GS=1,否则为0。
3. I=0时,EO=1,否则为0。
4. 如果EI=0,Y,GS,EO=0,如果EI=1,优先编码器正常工作。
`timescale 1ns/1ns
module encoder_83(
input [7:0] I ,
input EI ,
output wire [2:0] Y ,
output wire GS ,
output wire EO
);
reg [2:0] Y_reg ;
reg GS_reg,EO_reg;
//求Y_reg
always @(*) begin
if(~EI) begin
Y_reg<= 0;
end
else begin
Y_reg[2] = I[7] | I[6] | I[5] | I[4];
Y_reg[1] = I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2];
Y_reg[0] = I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1];
end
end
//求GS_reg
always @(*) begin
if(~EI) begin
GS_reg<= 0;
end
else if(I==0)begin
GS_reg = 0;
end
else GS_reg = 1;
end
//求EO_reg
always @(*) begin
if(~EI) begin
EO_reg<= 0;
end
else if(I==0)begin
EO_reg = 1;
end
else EO_reg = 0;
end
assign Y = Y_reg;
assign GS = GS_reg;
assign EO = EO_reg;
endmodule
#FPGA#module encoder_83(
input [7:0] I ,
input EI ,
output wire [2:0] Y ,
output wire GS ,
output wire EO
);
reg [2:0] Y_reg ;
reg GS_reg,EO_reg;
//求Y_reg
always @(*) begin
if(~EI) begin
Y_reg<= 0;
end
else begin
Y_reg[2] = I[7] | I[6] | I[5] | I[4];
Y_reg[1] = I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2];
Y_reg[0] = I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1];
end
end
//求GS_reg
always @(*) begin
if(~EI) begin
GS_reg<= 0;
end
else if(I==0)begin
GS_reg = 0;
end
else GS_reg = 1;
end
//求EO_reg
always @(*) begin
if(~EI) begin
EO_reg<= 0;
end
else if(I==0)begin
EO_reg = 1;
end
else EO_reg = 0;
end
assign Y = Y_reg;
assign GS = GS_reg;
assign EO = EO_reg;
endmodule