【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

但是其结果如下:

问题出现在哪里??

相关推荐
Dizzy.5176 分钟前
数据结构(查找)
数据结构·学习·算法
lalapanda29 分钟前
Unity学习part4
学习
啄缘之间2 小时前
4.6 学习UVM中的“report_phase“,将其应用到具体案例分为几步?
学习·verilog·uvm·sv
viperrrrrrrrrr75 小时前
大数据学习(49) - Flink按键分区状态(Keyed State)
大数据·学习·flink
red_redemption5 小时前
自由学习记录(36)
学习
黑金IT6 小时前
将Neo4j用于Python学习的创新方法
python·学习·neo4j
StickToForever6 小时前
第4章 信息系统架构(二)
经验分享·笔记·学习·职场和发展
19岁开始学习7 小时前
Go学习-入门
开发语言·学习·golang
ianozo8 小时前
CTF 代码学习日记 PHP
java·学习·php
大G哥8 小时前
用DeepSeek来帮助学习three.js加载3D太极模形
开发语言·前端·javascript·学习·ecmascript