INOUT双向端口仿真

标签:
inout三态门双向端口杂谈 |
分类: 工作札记 |
转载自:http://blog.sina.com.cn/s/blog_66eaee8f0100hrjl.html
本文将使用一个DSP EMIF接口逻辑的例子,详细讲述:
(0)什么叫做Z态?三态的晶体管级实现是怎样的?
(1)VHDL语言下同步、异步三态门的实现和仿真;
(2)VerilogHDL语言下同步、异步三态门的实现和仿真;
(3)综述两种语言下仿真的要点。
一 双向管脚INOUT与三态门介绍
http://s3/mw690/66eaee8fg83d06e002ad2&690
图1 一个典型的FPGA的管脚
由图1可以看出,一个FPGA的管脚由一个输入缓冲器和一个三态输出缓冲器构成。
三态输出缓冲器,即三态门,是指逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。高阻态相当于隔断状态(电阻很大,相当于开路)。三态门都有一个EN控制使能端,来控制门电路的通断。可以具备这三种状态的器件就叫做三态。
准确来讲,三态的高阻态(Z态)指的就是门的输出脚的两个驱动TTL或MOS管都处于截止状态时的输出状态。参考图2、图3和图4有更详细的理解。
图2
当http://s5/mw690/66eaee8fg83d0757b9d34&690 端接低电平时,反相器输出一个高电平给T1 ,使整个电路处于工作状态,这样,电路将按与非关系把A, B接受到的信号传送到输出端,使Y或为高电平,或为低电平。当http://s5/mw690/66eaee8fg83d0757b9d34&690 端接高电平时,反相器输出低电平给T1,使 T1、T5截止。另一方面,通过D把T4的基极电位钳在1v左右,使T4截止。由于T4、T5均截止,从输出端Y看进去,电路处于高阻状态。
图3 CMOS三态门实现A
对于CMOS的三态门,可以分析:当http://s5/mw690/66eaee8fg83d0757b9d34&690为0时,T1’和T2’都处于导通状态,因此T1和T2能够在A为1或0时分别导通,因此Y输出A的状态;反之,当http://s5/mw690/66eaee8fg83d0757b9d34&690为1时,T1’和T2’都处于截止状态,T1和T2自然也处于截止状态,因此Y就处于高阻状态。
http://s2/mw690/66eaee8fg83d073cd23c1&690
图4 CMOS三态门实现B—利用传输门实现的三态门
图5 传输门的逻辑构成图
对于利用传输门实现的三态门,分析传输门的逻辑购成可知,当S即EN为0时,传输门导通,反之,传输门的两个MOS管截止,门输出高阻态。
通过上面几种情况的介绍,希望大家能够深刻理解下面这句话:
高阻态(Z态)指的就是门的输出脚的两个驱动TTL或MOS管都处于截止状态时的输出状态。
http://s11/mw690/66eaee8fg83d074d0c86a&690
图6 文章中的所要仿真的三态总线
如图7所示,总线宽度设为4bit。WE和RE分别是读写使能信号,低有效。假设这是一个和DSP的EMIF接口的逻辑模块,在DSP写(WE=0)时,将dataInOut(EMIF)上的数据从dataOut输出;当DSP读(RE=0)时,将dataIn上的数据送到dataInOut(EMIF)上。约定WE和RE在空闲时都为高,并且二者不能同时为低。[附:DSP总线往往还有CE即片选信号,这里为简单计,略去。]
二 VHDL的三态门实现与仿真
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity vhdlTBUF is
end vhdlTBUF;
architecture Behavioral of vhdlTBUF is
begin
process(clk,we) begin
if(clk'event and clk='1') then
end if;
end process;
--读取部分
process(clk,re) begin
if(clk'event and clk='1') then
end if;
---================================================================
--如果期望和verilog的代码有一样的综合结果,请使用下面的话描述读取,即异步读取。
--dsta<=datain when re='0' else
--
---================================================================
end process;
end Behavioral;
在上面的程序中可以看出,对DSP的写数据,三态逻辑模块直接将其同步锁存到寄存器中;对DSP的读数据,在RE有效时输出数据,RE无效时输出Z态。这样的实现符合图1所示的FPGA的管脚结构。
testbench:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE STD.TEXTIO.ALL;
ENTITY test IS
END test;
ARCHITECTURE testbench_arch OF test IS
END COMPONENT;
END testbench_arch;
在VHDL语言里三态门仿真最重要的一点就是在初始化的时候必须将总线初始化成Z态。不仅如此,在往总线上写的时候,写数据满足要求后要立即将总线恢复成Z态,这样才不至于影响总线上的读取。原因还是如图1的FPGA管脚结构决定的。每一个总线管脚都可以看成输入和输出两部分,这里总线的初始化和赋值相当于总线的输出,即DSP的写。总线赋值如果不是Z,那么当RE=1,三态逻辑模块的输出是Z,总线即为所赋值;当RE=0时,逻辑模块输出dataIn的值,这些值如果和总线上的DSP写的值不一样,如0和1相遇,那么总线上就会出现X状态,这是我们所不期望的。
综述一句,对于VHDL语言三态门仿真,对待总线只要不是DSP写,就要将其置成Z态。
仿真和综合结果参考图7、图8和图9。从图上可以看出,同步的三态总线和异步的三态总线差别在于三态门的前面是否加了一个同步的D触发器。仿真时序图上能够清楚的看出来同步三态门的输出和时钟的同步。在实际的逻辑设计中建议尽可能使用同步逻辑。
http://s1/mw690/66eaee8fg83d12dfc2540&690
图7 VHDL 三态门的ModelSim仿真结果
http://s5/mw690/66eaee8fg83d12edff6b4&690
图9 异步实现综合后的结果[红色代码]
三 VerilogHDL的三态门实现与仿真
module threestategate(
assign dirdata=(!dspre)?datain:4'bZZZZ;
always @ (posedge(clk)) begin
if(we==1'b0)
end
endmodule
上面的是VerilogHDL实现的三态逻辑。读取是异步的。如果期望同步的读取,修改assign语句为下面的语句:
always @ (posedge(clk)) begin
if(re==1'b0)
dirdata <= datain;
else
end
TestBench:
`timescale 1ns/1ps
module test3z;
endmodule
在VerilogHDL语言下的三态门仿真中,很多人遇到双向总线无法写或者读的问题。这里一个关键的错误就是将dirdata在TestBench中定义成了reg或者wire。如果仅仅做这样的定义,那么dirdata要么做输入,要么做输出,自然只能仿真一种情况了。
注意看上面代码的红色部分。这里将dirdata定义为wire,自然只能够做输出了,同时定义了dirdata$inout$reg,用来做reg,是输入。通过dirdata= dirdata$inout$reg来将二者联系起来。这样,dirdata作输出,dirdata$inout$reg作输入,考虑了两个方面,完成了一个真正的双向端口。
这里有人称dirdata$inout$reg为dirdata 的“影像寄存器”,或许有道理,但是,本人认为这是从FPGA的管脚即图1所示的结构层次上的一个考虑,抓住了双向口必须同时考虑到输入和输出两个方面的关键,因此能够顺利实现仿真。
仿真和综合结果如图10和图11。
http://s2/mw690/66eaee8fg83d132d6c941&690
图10 verilog双向端口仿真
http://s15/mw690/66eaee8fg7394eb8b706e&690
图11 verilog的异步读双向端口综合结果
四 总结
1、三态门的三态指的是除了0和1外的第三种状态。高阻态(Z态)指的就是门的输出脚的两个驱动TTL或MOS管都处于截止状态时的输出状态;
2、对于VHDL语言三态门仿真,对待总线只要不是DSP写,就要将其置成Z态;
3、在verilog中进行双向端口仿真时,将dirdata定义为wire,用作输出,同时定义了dirdata$inout$reg,定义成reg,用来作输入。通过dirdata= dirdata$inout$reg来将二者联系起来。这样,dirdata作输出,dirdata$inout$reg作输入,考虑了两个方面,完成了一个真正的双向端口,自然就能顺利仿真了。