题解 | #使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器#

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

http://www.nowcoder.com/practice/dcfa838e43de4744bc976abee96dc566

题意整理

②使用2片编码器Ⅰ实现16线-4线优先编码器,要注意EI和EO端口的连接。

题解主体

②16线-4线优先编码器

根据功能表,可画出两片编码器Ⅰ的电路连接图如下:



当EI1=0时、U1禁止编码,其输出端Y为000,GS1、EO1均为0。同时EO1使EI0=0,U0也禁止编码,其输出端及GS0、EO0均为0。由电路图可知GS=GS1+GS0=0,表示此时电路输出端的代码L=0000是非编码输出。

当E=1时,U1允许编码,若A[15:8]均无有效电平输人,则EO1=1,使EI0=1,从而允许U0编码,因此U1的优先级高于U0。

此时A[15:8]没有有效电平输入,U1的输出均为0。使4个或门都打开,L[2:0]取决于U0的输出,而L[3]=GS1总是等于0,所以输出代码在0000-0111之间变化。若只有A[0]有高电平输入,输出为0000,若A[7]及其他输入同时有高电平输人,则输出为0111。A[0]的优先级别最低。

(3)当EI1=1且A[15:8]中至少有一个为高电平输人时,EO1=0,使EI0=0,U0禁止编码,此时L[3]=GS1=1,L[2:0]取决于U1的输出,输出代码在1000~1111之间变化,并且A的优先级别最高。

根据电路图和分析思路,将电路转换成Verilog代码描述如下:


wire       EO1 ;
wire [2:0] Y0  ;
wire [2:0] Y1  ;
wire       GS0 ;

encoder_83 U0(
   .I   (A[7:0]),
   .EI  (EO1   ),

   .Y   (Y0    ),
   .GS  (GS0   ),
   .EO  (EO    ) 

);

encoder_83 U1(
   .I   (A[15:8]),
   .EI  (EI     ),

   .Y   (Y1    ),
   .GS  (GS1   ),
   .EO  (EO1   ) 

);


assign L[3] = GS1;
assign L[2] = Y1[2] | Y0[2];
assign L[1] = Y1[1] | Y0[1];
assign L[0] = Y1[0] | Y0[0];

assign GS = GS1 | GS0;

参考答案

`timescale 1ns/1ns

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


module encoder_164(
   input      [15:0]      A   ,
   input                  EI  ,
   
   output wire [3:0]      L   ,
   output wire            GS  ,
   output wire            EO    
);

wire       EO1 ;
wire [2:0] Y0  ; 
wire [2:0] Y1  ;
wire       GS0 ; 
encoder_83 U0(
   .I   (A[7:0]),
   .EI  (EO1   ),
   
   .Y   (Y0    ),
   .GS  (GS0   ),
   .EO  (EO    )  
);
encoder_83 U1(
   .I   (A[15:8]),
   .EI  (EI     ),
   
   .Y   (Y1    ),
   .GS  (GS1   ),
   .EO  (EO1   )  
);

assign L[3] = GS1;
assign L[2] = Y1[2] | Y0[2];
assign L[1] = Y1[1] | Y0[1];
assign L[0] = Y1[0] | Y0[0];

assign GS = GS1 | GS0;

         
endmodule
全部评论
用L[2:0] = Y1 | Y0; 是有问题的,Y1 = 010表示高八位的首个1出现在第2位, Y0 = 001表示低八位的首个1出现在第1位,则L3 = 1, L[2:0] = 011,表示高八位的首个1出现在第3位。然而实际L[2:0]应该是010。
点赞 回复 分享
发布于 06-15 17:36 上海
wire [2:0] L_r1; wire [2:0] L_r2; reg [3:0] L_r; reg GS_r; reg EO_r; always@(*)begin if((!A[15:8]) && A[7:0]) L_r <= {1'b0, L_r1}; else if(A[15:8]) L_r <= {1'b1, L_r2}; else L_r <= 4'b0000; end always@(*)begin if(!EI) {GS_r, EO_r} <= 2'b0_0; else if(!A) {GS_r, EO_r} <= 2'b0_1; else {GS_r, EO_r} <= 2'b1_0; end assign L = L_r; assign GS = GS_r; assign EO = EO_r; encoder_83 encoder_83_07( .I (A[7:0]), .EI (EI), .Y (L_r1), .GS (), .EO () ); encoder_83 encoder_83_815( .I (A[15:8]), .EI (EI), .Y (L_r2), .GS (), .EO () ); endmodule请问大佬,这种方法为什么行不通
点赞 回复 分享
发布于 2024-08-14 11:07 陕西

相关推荐

12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
33
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务