三态双向口的设计。
但发现一个问题:不能向信号赋值为“Z”。但是信号的取值范围可以有‘Z’呀。
因此想请教大虾们,该如何处理这个问题,谢谢大家了。
三态双向口的设计。
一般不会出现你说的问题,由于你说的不是很明白,所以可能的情况是:
1. 请检查此信号是不是output或inout类型
2. 此信号是不是在不同block里赋值了
3. verilog的话,请定义该信号为tri类型
三态双向口的设计。
我用的是VHDL。把信号定义成了一个STD—LOGIC-VECTOR(),可不能向它赋值为‘Z’。
而且信号不能定义成 “INPUT”或“OUTPUT”的啊。
三态双向口的设计。
如果是xilinx的话:
端口定义需要是inout;
a: inout std_logic_vector(3 downto 0);
a<=b when tri_a='1' else "zzzz";
b为内部信号,是你要输出的信号,tri_a为三态控制信号;
三态双向口的设计。
好象只能在仿真时才有第三态情况,实际电路中(在芯片中)无法实现高阻态的输出。
三态双向口的设计。
三态是实实在在存在的,在芯片中有三态门;
一般的总线设计都会用到三态,因为有双向;
但是由于三态带来的DFT问题以及可靠性问题,所以当总线在片内时,一般不鼓励用三态,而代之以mux来实现;
在fpga里,三态就更麻烦;xilinx和altera应该都是支持三态设计的,但具体怎么实现各有千秋,俺记得以前的xilinx里面有一些三态门,而altera是在综合时以mux替代的;不知道现在它们是怎么对待的,俺好久没关注fpga设计了。
三态双向口的设计。
在Xilinx的VirtexII中,每个CLB均有两个TBUF,每个TBUF的输出都可以驱动水平长线,因此可以利用TBUF实现片内总线,进一步可以实现MUX的功能。但我个人在使用时基本上不用片内的TBUF来实现MUX,由于他对CLB放置位置的要求,实际上不利于其他逻辑的布线,而且延时也并不小。如果要实现宽输入的MUX,我宁愿用F5、F6、F7、F8完成。ALTERA的器件已经好几年没用了,具体情况不太清楚。
三态双向口的设计。
但是使用Tbuf可以节省其他逻辑资源,有时候还是值得考虑的。
Altera的器件应该不支持内部三态。
三态双向口的设计。
感谢大家,让我受益非浅。是不是Altera的器件内部的总线不能做成三态的了?
三态双向口的设计。
三态通常只用在端口上,内部没有高阻状态。
如果你使用Altera器件,它的三态控制我可以写给你。
三态双向口的设计。
谢谢 shadow 。
我正是用的7128S。
三态双向口的设计。
if(tri='0') then
fd<="ZZZZZZZZZZZZZZZZ";
a<=fd;
else
fd<=b;
end if;
这里tri为三态控制信号
三态双向口的设计。
那你看我这样写行不行?
SIGNAL A: STD_LOGIC_VECTOR;
SIGNAL B : STD_LOGIC_VECTOR;
IF TRI=‘0’ THEN
DATA<= A;
B<="ZZZZZZZZ";
ELSE
B<=DATA;
DATA<="ZZZZZZZZ";
这里,DATA定义成了INOUT类型。TRI是控制信号。A,B都是内部信号可是综合时是通过了。但当我把它生成成模块而加以引用时,却提示说给B赋值是错误的。真郁闷了。
三态双向口的设计。
你的意思是当TRI=‘0’时双向端口作为输出,舍去B<=“ZZZZZZZZ"这条语句。
不知你注意到没有,虽然VHDL-93的STD_LOGIC_VECTOR增加了“ZZZZZZZZ”这一状态,但是仿真是按照“11111111”来处理的。它内部信号不出现高阻状态。
学习了!
我习惯VerilogHDL,大概的写法是wire x = (条件)? a:b;
有些FPGA芯片内部是有三态资源的,不能完全说不能实现三态总线,但是成熟的做法是不在片内实现三态,而仅在引脚实现三态,原因代码的可重用原则。
学习中~
有很多东西是在实际测试是才发现的
好的解释.以前用过的.XILINX的比较好用的
