verilog 对同一端口用多个assign会不会冲突呀?
assign PORT = (DSP_EN2 && !nRD && nWR) ? AD2: 16'bz;
assign PORT = (DSP_EN3 && !nRD && nWR) ? AD3: 16'bz;
assign PORT = (DSP_EN4 && !nRD && nWR) ? AD4 : 16'bz;
assign PORT = (DSP_EN5 && !nRD && nWR) ? AD5 : 16'bz;
DSP_EN1、2、3、4、5 是前面程序的结果,只有一个为1,同时对port赋值的话,会不会一会为高阻一会有值呀,这个程序能正常运行的
这种情况下可以,程序能正常运行,当然硬件得保证DSP_EN1&& !nRD && nWR等条件同一时间只有一个会active,
要是如下面情况就会报错,
assign port = a;
assign port = b;
看你的条件,不要在同时有两个赋值assign执行就行了
当然硬件得保证DSP_EN1&& !nRD && nWR等条件同一时间只有一个会active,你说的active是啥意思呀,
DSP_EN1&& !nRD && nWR只能为0或1,如果为0则PORT=高阻,如果为1则等于一个数,assign是并行执行的,那port到底是为一个数还是高阻呢。
为什么要这样写呢,目的是什么?我猜LZ想做成这种电路吧:assign port = ? :(?:(?:(?:)))
写成楼上的这种形式比较好吧。
嗯,是这个意思,只有某一个端口的使能为1时才有值进来,否则为z,通常你会在开通的那段时间内把值传入,把该处理的事情处理完,然后再关闭也不用CARE了。就像你进自动门一样,一到门前门就开了,你进去后就再关了。
同意五楼的看法!不过小编那种编写方式也是可以的,可以对同一个变量进行多个连续赋值,但是绝对不能进行多个过程赋值(产生竞争)!
如果有两个或两个以上条件同时为真就会冲突的。
LS已经说得差不多了。我建议不要用这种写法,不是每次都能保证条件互斥的,到出问题的时候这种写法很不好检查错误
不行,会冲突
在项目中是不允许这样写的,数字这边只有PAD这块才能用到highZ,看LZ的对信号的命名也应该是PAD,而实现的功能是做个PIN MUX, 可以先做好MUX
这样写其实也不能保证每个仿真工具和合成工具都认为是对的,所以说能跑,只是某个工具可以跑。
case({EN5, EN4, EN3, EN2, EN1, EN0})
5‘b1?: PORT_MUX = AD5;
.......
endcase
或
case(1'b1)
EN5: PORT_MUX = AD5;
......
endcase
assign PORT = 条件有效 ? PORT_MUX : n'hzzz...;
