使用2018.1版本编译带有INOUT 端口的代码,代码逻辑没问题,写了三态控制。但是下板子,inout端口输入数据一直是0。
最终查找原因,看RTL级原理图,并没有三态控制,端口信号只是被认为一个简单的输出信号。
后来,用IOBUF 代替 assign 语句描述的三态控制问题得到解决。
IOBUF #(
.DRIVE(12), // Specify the output drive strength
// .IBUF_LOW_PWR("TRUE"), // Low Power - "TRUE", High Performance = "FALSE"
.IOSTANDARD("LVCMOS33"), // Specify the I/O standard
.SLEW("SLOW") // Specify the output slew rate
) IOBUF_inst (
.O(MCU_XD_input), // Buffer output
.IO(MCU_XD), // Buffer inout port (connect directly to top-level port)
.I(MCU_XD_output), // Buffer input
.T(oe_n) // 3-state enable input, high=input, low=output
);
IOBUF 说明:IBUF_LOW_PWR 看很多人都屏蔽掉了,我在代码里添加这句话以后,总是有严重警告。提示不存在改类型
IOSTANDARD 电压标准 大部分人用的DEFAULT ,其实,可以看自己引脚分配用什么,对应上。
O (MCU_XD_input) 是INOUT 端口当做输入时候总线上的数据;
I (MCU_XD_output) 是INOUT 端口当做输出时候总线上的数据;
IO (MCU_XD )是INOUT 端口;
T (oe_n) 是三态控制,1表示IO 是输入,0表示IO是输出