三态门(总线)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2 三态门
1.基本原理
在数字系统中,常常需要把多个门电路的输出端连接在一起,比如接到数据总线上。
但一般的门电路都只有两个输出状态:输出高电平状态与输出低电平状态。
把这些门电路的输出端连接在一起,在某一个时刻,可能会出现一个以上的门电路的输出同时为高电平状态或者低电平状态,这样就会引起逻辑电平的不确定。
使用三态门可以很好地解决这个问题。
三态门电路有三个输出状态:输出高电平状态、输出低电平状态,以及输出高阻状态。
当三态门电路输出为高阻状态时,三态门的输出端相当于开路,对总线上连接的其它器件没有影响。
我们可以利用三态门的这个优点对需要通过总线的数据进行分时传送,这样数据的传送就不会出现混乱了。
简单的三态门电路如图2.2.1a所示,图2.2.1b是它的代表符号。
其中EN为片选信号输入端,A为数据输入端,L为数据输出端。
图2.2.1 三态门电路
(a) 电路图(b) 代表符号
当EN=0时,TP2和TN2同时导通,为正常的非门,输出L=-
A;当EN=1
时,TP2和TN2同时截止,输出为高阻状态。
所以,这是一个低电平有效的三态门。
三态门的真值表如表2.2.1所示。
由真值表可以得出逻辑表达式:当EN=0
时,L=-
A;当EN=1时,L=Z。
其中Z表示高阻状态。
表2.2.1 三态门的真值表
2.实现方案
通过FPGA来实现三态门的功能有以下几种方式:
(1) 用case语句和if….else语句来实现。
先判断EN是否等于1,如果EN 等于1,则输出端L=Z;如果不等于1,再判断A是否等于0,如果等于0,则输出端L=1,如果不等于0,则输出端L=0。
(2) 用if….else语句来实现。
先判断EN是否等于1,如果EN等于1,则输出端L=Z;如果不等于1,则输出L=~A。
(3) 用“?:”语句来实现,输出端L=EN ? 1’bZ : (~A)。
3.FPGA的实现
下面以第三种方案为例来进行FPGA的实现。
(1) 创建工程并设计输入
①在E:\project\目录下,新建名为notif的新工程
器件族类型(Device Family)选择“Virtex2P”,
器件型号(Device)选“XC2VP30 ff896 -7”,
综合工具(Synthesis Tool)选“XST (VHDL/Verilog)”,
仿真器(Simulator)选“ISE Simulator(VHDL/Verilog)”。
②设计输入
在源代码窗口中单击右键,在弹出的快捷菜单中选择“New Source”,在弹出的对话框中选择“Verilog Moudle”,在右端的File name中输入源文件名“notif”,再依次点击“Next—Next—Finish”,然后在弹出的源代码编辑框内输入下面的源代码并保存即可。
Verilog HDL 代码如下:
module notif(A,EN,L);
input A,EN;
output L;
wire L;
assign L=EN?1'bZ:(~A);
endmodule
(2) 功能仿真
①在sources窗口的“sources for”中选择“Behavioral Simulation”。
②由Test Bench WaveForm添加激励源,如图2.2.2所示。
仿真结果如图2.2.3所示。
图2.2.2 激励波形
图2.2.3 仿真结果
从仿真的结果中我们可以看到:当使能端EN为低电平时,输出端L= A,
当EN为高电平时,输出端呈现高阻状态,这就实现了三态门电路的功能。
(3) 进行ChipScope在线调试
①生成ICON核和VIO核并添加到工程。
这里使用的是核生成法。
因为ICON核只需要控制VIO核,所以控制端口数为1,如图2.2.4所示。
VIO核使用异步输入、输出端口,异步输入位宽为1,异步输出位宽为2,如图2.2.5所示。
图2.2.4 操作示意图1
图2.2.5 操作示意图2
最后得到的代码如下:
module notif(A,EN,L);
wire A,EN;
output L;
wire L;
wire [35 : 0] CONTROL0;
wire [1 : 0] ASYNC_OUT;
wire [0 : 0] ASYNC_IN;
ICON I_ICON
(
.CONTROL0(CONTROL0)
);
VIO I_VIO
(
.CONTROL(CONTROL0),
.ASYNC_IN(ASYNC_IN),
.ASYNC_OUT(ASYNC_OUT)
);
assign ASYNC_IN=L;
assign A=ASYNC_OUT[0];
assign EN=ASYNC_OUT[1];
assign L=EN?1'bZ:(~A);
endmodule
②在ISE里进行综合和实现,然后生成bit文件。
③在ChipScope里观测调试。
在Processes窗口中选择双击“Analyze Design Using Chipscope”进入ChipScope Pro Analyzer窗口,点击图标检查连接情况,然后下载bit文件进行在线观测。
调试结果如图2.2.6和图2.2.7所示。
图2.2.6 调试结果1
图2.2.7 调试结果2
从上面的调试结果可以看出三态门的设计是正确的。
4.总结
上面采用的是数据流描述方式来实现三态门的功能,这种方式相对于其他两种方式来说,思路更简单、清晰,它只用了一个条件运算符“?:”就描述了三态门的功能。
使用这种方式需要注意的是assign赋值语句中等号左边的变量是wire类型的。