Verilog程序在4x1多路复用器上未获得所需输出

Verilog程序在4x1多路复用器上未获得所需输出,verilog,computer-science,iverilog,Verilog,Computer Science,Iverilog,我有这个程序,我假设为这个图4x2解码器图: 我一直试图通过求反将输出数组的初始值从0更改为1,从1更改为0,但仍然没有得到期望的结果 假设我的运行时输出与此相同: (或此处的代码) 但我明白了。。。我做错了什么 Time s d o ----------------- 0000 00 0000 0 0001 00 0001 0 0002 00 0010 0 0003 00 0011 0 0004 00 0100 0 0005 00 0101

我有这个程序,我假设为这个图4x2解码器图: 我一直试图通过求反将输出数组的初始值从0更改为1,从1更改为0,但仍然没有得到期望的结果

假设我的运行时输出与此相同: (或此处的代码)

但我明白了。。。我做错了什么

Time  s   d     o
-----------------
0000  00  0000  0
0001  00  0001  0
0002  00  0010  0
0003  00  0011  0
0004  00  0100  0
0005  00  0101  0
0006  00  0110  0
0007  00  0111  0
0008  00  1000  0
0009  00  1001  0
0010  00  1010  0
0011  00  1011  0
0012  00  1100  0
0013  00  1101  0
0014  00  1110  0
0015  00  1111  0
0016  01  0000  0
0017  01  0001  1
0018  01  0010  1
0019  01  0011  1
0020  01  0100  0
0021  01  0101  1
0022  01  0110  1
0023  01  0111  1
0024  01  1000  0
0025  01  1001  1
0026  01  1010  1
0027  01  1011  1
0028  01  1100  0
0029  01  1101  1
0030  01  1110  1
0031  01  1111  1
0032  10  0000  0
0033  10  0001  0
0034  10  0010  0
0035  10  0011  0
0036  10  0100  1
0037  10  0101  1
0038  10  0110  1
0039  10  0111  1
0040  10  1000  1
0041  10  1001  1
0042  10  1010  1
0043  10  1011  1
0044  10  1100  1
0045  10  1101  1
0046  10  1110  1
0047  10  1111  1
0048  11  0000  0
0049  11  0001  1
0050  11  0010  1
0051  11  0011  1
0052  11  0100  1
0053  11  0101  1
0054  11  0110  1
0055  11  0111  1
0056  11  1000  1
0057  11  1001  1
0058  11  1010  1
0059  11  1011  1
0060  11  1100  1
0061  11  1101  1
0062  11  1110  1
0063  11  1111  1

我假设“DecoderMod”应该是您几个小时前询问的2x4解码器。这里没有解码器,只有两条线成对连接到四个输出。

您的编码风格混淆了您试图编写的逻辑。您不必要地拆分了设计,以生成{1,1,0,0}扩展,然后在有更简单的方法时写入实例化的门

你已经写信了

out = ((d[0] | d[1]) & s[1]) | ((d[2] | d[3]) & s[0]);
这一行可能也不太容易阅读(我通常会将乘积项的每一个总和都拆分成一行,但括号会把它弄乱),但至少所有代码都在一个地方,而不是分散在30行左右


原来的结构似乎更可取的另一个原因是尽量减少逻辑和避免重复。事实上,现代(即从2005-2010年开始)编译器在优化逻辑方面已经相当聪明了,特别是在映射到各种奇怪的标准单元上。标准单元通常有多个输入(和/或/或反转排列),有时有正常和反转输出。防止这种优化的方法之一是在模块中放置特定的逻辑,并防止跨该边界的平坦化/优化。

使用RTL的简单Mux,更易于阅读和理解

鉴于

input [1:0] x_in;
output [3:0] x_out_v;

assign x_out_v [0] =  ( ~x_in[1] && ~x_in[0] ); 
assign x_out_v [1] =  ( ~x_in[1] &&  x_in[0] ); 
assign x_out_v [2] =  ( x_in[1] &&  ~x_in[0] ); 
assign x_out_v [3] =  ( x_in[1] &&   x_in[0] ); 

哇,所以这一行基本上就是我的全部代码!我是按照我展示的方式来做的,因为模块已经按照这种方式设置好了,我只需要编写代码。你的方法简单多了!当你在处理小设计时,这并不是很糟糕,并且更容易用层次结构进行教学,但显然,即使是琐碎的真实设计也无法扩展。在哪里划定边界是一个反复出现的问题——没有一个好的答案。
out = ((d[0] | d[1]) & s[1]) | ((d[2] | d[3]) & s[0]);
input [1:0] x_in;
output [3:0] x_out_v;

assign x_out_v [0] =  ( ~x_in[1] && ~x_in[0] ); 
assign x_out_v [1] =  ( ~x_in[1] &&  x_in[0] ); 
assign x_out_v [2] =  ( x_in[1] &&  ~x_in[0] ); 
assign x_out_v [3] =  ( x_in[1] &&   x_in[0] );