【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

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

描述

②请使用2片 该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。

可将优先编码器Ⅰ的代码添加到本题答案中,并例化。

优先编码器Ⅰ的代码如下:

cpp 复制代码
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;

同理,编码器2I7~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优先级高)

因此,根据以上所述画出其电路图:


代码如下:
cpp 复制代码
`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
相关推荐
西岸行者10 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
ZPC821010 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC821010 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
悠哉悠哉愿意10 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码10 天前
嵌入式学习路线
学习
毛小茛10 天前
计算机系统概论——校验码
学习
babe小鑫10 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms10 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下10 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。10 天前
2026.2.25监控学习
学习