Verilog程序在4x1多路复用器上未获得所需输出
我有这个程序,我假设为这个图4x2解码器图: 我一直试图通过求反将输出数组的初始值从0更改为1,从1更改为0,但仍然没有得到期望的结果 假设我的运行时输出与此相同: (或此处的代码) 但我明白了。。。我做错了什么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
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] );