参考我之前的问题here,我一直在使用三态来使用公共总线。我似乎还有一些实施问题。
三态使用这种类型的代码:
指定io [width-1:0] =(re)?rd_out [width-1:0]:{width {1'bz}};
合成和翻译顺利。没有警告或错误我没想到(我期待一些,因为这只是试运行,大多数组件不做任何事情,因此将保持不连接)。但是当我实际尝试实现它时,所有总线(有三个)输出一个1111111111111111或-1,由我的二进制转换为BCD转换器。我通过指示控制矩阵停止,如果在总线上收到的指令是-1,并且它确实停止,我检查是否确实如此。
我收到的三态转换为逻辑的警告是:
Xst:2040 - 海王星单位_I:16个多源信号被逻辑替换(上拉是)
Xst:2042 - 单位alu:16个内部三态由逻辑替换(上拉是):
等等。 Neptune_I是顶级模块,我相信它所指的多源信号是总线。
我怀疑 pull-up yes 是否是此问题的根源。它只是简单地拉动所有东西,导致它一直是-1?但这对我来说没有意义,因为当激活三态时,信号应该由它应该被控制的任何实体控制。
我想花时间用逻辑而不是三态替换代码,但我不确定如何继续。
任何帮助都将不胜感激。
答案 0 :(得分:2)
这些信号是否在片外?或者它们是FPGA内部的?如果答案是后者,则需要更改代码。现代FPGA(如Spartan 6)不再支持内部三态缓冲器。它们仅存在于片外信号中。
您需要编写所有内部代码以避免三态缓冲区。在组件之间创建专用路径,没有双向接口。