什么是三态门?
三态门即三态电路。三态电路可提供三种不同的输出值:逻辑“0”,逻辑“1”和高阻态。高阻态主要用来将逻辑门同系统的其他部分加以隔离。例如双向I/O电路和共用总线结构中广泛应用三态特性。
一个简单的三态缓冲电路如上图所示,图(a)为表示符号,图(b)为逻辑结构。由允许信号E控制输出,当E=1为高电平时,电路的功能是一个正常的缓冲驱动器。输出根据输入为低电平或高电平则相应为低电平和高电平。当E=0为低电平时,不论输入为何种电平,Ma管的输入为低电平,Mp管的输入为高电平,两管均不导通。切断输出节点与电源VOD和地的通路,此时输出呈高阻态。实际上泄漏电流还是有的,但非常小,故输出阻抗非常大。 利用三态门的高阻特性,可以实现总线的功能。由于三态门资源大多存在于FPGA芯片的接口资源中而非FPGA内部,因此一般当总线位于FPGA芯片外部时,常采用这种方式。
赋值冲突问题:
错误代码:(存在赋值冲突)
1. assign c =(sel[0] == 1'b1) ? a:1'b0;
2. assign c =(sel[1] == 1'b1) ? b:1'b1;
这个例子代码,两条赋值语句肯定都是一直有效的,因此必然产生赋值冲突,从而导致出错。
正确代码:
1. assign c =(sel[0] == 1'b1) ? a:1'bz;
2. assign c =(sel[1] == 1'b1) ? b:1'bz;
这个代码的写法和上面的唯一区别就是高组态的使用。
为什么使用了高阻态,代码就是正确的了呢?
这是因为高阻态实际上就是电路中的断路,通过合理切换到高阻态,可以让上述有高阻态的例子中的两条赋值语句不会在同一时刻生效,因此不会产生赋值冲突。
一个简单的三态门式总线的FPGA实现方式,功能代码分为三个部分:
1. 选择器控制信号产生部分,采用抢占式优先级译码器的思路,根据四个外围器件的请求信号产生多路选择器的选择控制信号。
2. 写总线部分,即将四个三态门的输出连接到总线上。
3. 读总线部分,各个外围器件根据自己的情况将总线数据读入器件内部进行运算和处理。
源代码:
-----End-----