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

实现3-8译码器①

描述

下表是74HC138译码器的功能表.

|--------|----------|----------|--------|--------|--------|----------|----------|----------|----------|----------|----------|----------|----------|
| E3 | E2_n | E1_n | A2 | A1 | A0 | Y0_n | Y1_n | Y2_n | Y3_n | Y4_n | Y5_n | Y6_n | Y7_n |
| x | 1 | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| x | x | 1 | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | x | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |

①请用基础门电路实现该译码器电路,用Verilog将电路描述出来。基础门电路包括:非门、多输入与门、多输入或门。

输入描述:

input E1_n ,

input E2_n ,

input E3 ,

input A0 ,

input A1 ,

input A2

输出描述:

output wire Y0_n ,

output wire Y1_n ,

output wire Y2_n ,

output wire Y3_n ,

output wire Y4_n ,

output wire Y5_n ,

output wire Y6_n ,

output wire Y7_n

解题思路:

由功能表可以看出,当且仅当E3 = 1、E2_n = 0、E1_n=0时,3-8译码器正常工作;

由于要求使用门电路实现 ,因此给出输出信号Y0_n~Y1_7的逻辑函数式:

代码如下所示:

使用行为级建模

cpp 复制代码
`timescale 1ns/1ns

module decoder_38(
   input             E1_n   ,
   input             E2_n   ,
   input             E3     ,
   input             A0     ,
   input             A1     ,
   input             A2     ,
   
   output wire       Y0_n   ,  
   output wire       Y1_n   , 
   output wire       Y2_n   , 
   output wire       Y3_n   , 
   output wire       Y4_n   , 
   output wire       Y5_n   , 
   output wire       Y6_n   , 
   output wire       Y7_n   
);

reg [7:0] Y_t;
always @(*) begin
    Y_t = 8'b1111_1111;
    if (E3 == 1'b1 && E2_n == 1'b0 && E1_n == 1'b0) begin
        Y_t[0] = A2 | A1 | A0;
        Y_t[1] = A2 | A1 | ~A0;
        Y_t[2] = A2 | ~A1 | A0;
        Y_t[3] = A2 | ~A1 | ~A0;
        Y_t[4] = ~A2 | A1 | A0;
        Y_t[5] = ~A2 | A1 | ~A0;
        Y_t[6] = ~A2 | ~A1 | A0;
        Y_t[7] = ~A2 | ~A1 | ~A0;
    end
    else begin
        Y_t = 8'b1111_1111;
    end
end

assign Y0_n = Y_t[0];
assign Y1_n = Y_t[1];
assign Y2_n = Y_t[2];
assign Y3_n = Y_t[3];
assign Y4_n = Y_t[4];
assign Y5_n = Y_t[5];
assign Y6_n = Y_t[6];
assign Y7_n = Y_t[7];

endmodule
在使用门级建模时,出现以下问题:

代码如下:

cpp 复制代码
`timescale 1ns/1ns

module decoder_38(
   input             E1_n   ,
   input             E2_n   ,
   input             E3     ,
   input             A0     ,
   input             A1     ,
   input             A2     ,
   
   output wire       Y0_n   ,  
   output wire       Y1_n   , 
   output wire       Y2_n   , 
   output wire       Y3_n   , 
   output wire       Y4_n   , 
   output wire       Y5_n   , 
   output wire       Y6_n   , 
   output wire       Y7_n   
);

//代码二

wire work;

and a1 (work, ~E1_n, ~E2_n, E3_n);

or o0(Y0_n, A0, A1, A2, ~work);
or o1(Y1_n, ~A0, A1, A2, ~work);
or o2(Y2_n, A0, ~A1, A2, ~work);
or o3(Y3_n, ~A0, ~A1, A2, ~work);
or o4(Y4_n, A0, A1, ~A2, ~work);
or o5(Y5_n, ~A0, A1, ~A2, ~work);
or o6(Y6_n, A0, ~A1, ~A2, ~work);
or o7(Y7_n, ~A0, ~A1, ~A2, ~work);

endmodule

但是其结果如下:

问题出现在哪里??

相关推荐
ChaseVLSI36 分钟前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
Z21-X3 小时前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生
Rabitebla11 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
无心水16 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd16 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
La Pulga21 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd21 小时前
秋招学习笔记 day106
笔记·学习
9527华安1 天前
FPGA实现ARINC818总线协议,基于GT Transceivers Wizard高速收发器,提供7套工程源码和技术支持
fpga开发·transceivers·arinc818
小李不想当小白1 天前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
小蘇的FPGA1 天前
fpga-wide-data-crc32
fpga开发