Verilog中InOut引脚、三态门实现、仿真
三态门
三态门中,EN‘为0时,门电路正常工作,EN’为1时,T1、T2均截止,整个门电路不对外输出,成高阻态,三态门常用在总线传输中,多个器件共用一个数据总线,通过控制多个EN唯一导通,实现指定器件的数据传输。
三态门还可用于引脚I/O设置,右图,当EN为1,G1作用,G2高阻态断路,D0经G1输出D0’数据到总线;EN为0,G2作用,G1高阻态断路,引脚从总线上读取数据D1经G2输入到D1‘。I/O的实现即用了两个三态门控制,一个负责O,一个负责I,通过EN与EN’作为控制信号来实现一个高阻断路,另一个真正作用。
Verilog实现及仿真
网上比较常见的InOut控制代码:
module test(input flag,input [3:0]in_a,output [3:0]out_b,inout [3:0]data
);assign data = flag?in_a:4'bz;//flag为高时,data为输出,输出in_a,flag为低时,门电路(data=in_a)为高阻态,data为输入
assign out_b = data;
//data数据连接到out_b
RTL电路图:
RTL图略微奇怪,同时会有警告:双向引脚“ data ”驱动的输出引脚“ out_b”不能处于三态(后续进行说明)
Warning (18029): Output pin “out_b[0]” driven by bidirectional pin “data[0]” cannot be tri-stated
Warning (18029): Output pin “out_b[1]” driven by bidirectional pin “data[1]” cannot be tri-stated
Warning (18029): Output pin “out_b[2]” driven by bidirectional pin “data[2]” cannot be tri-stated
Warning (18029): Output pin “out_b[3]” driven by bidirectional pin “data[3]” cannot be tri-stated
modelsim仿真代码如下:
`timescale 1 ns/ 1 ps
module test_vlg_tst();
reg [3:0]treg_data;
reg flag;
reg [3:0]in_a;
reg clk;
wire [3:0]data;
wire [3:0]out_b;
parameter clk_cnt = 20;assign data = (flag)?4'bz:treg_data;
//flag为高时,data为输入状态,接收主程序中data输出的数据;
//flag为低时,data为输出状态,输出仿真程序中的treg_data值
test i1 (.data(data),.flag(flag),.in_a(in_a),.out_b(out_b)
);
initial
beginclk = 0;forever #(clk_cnt/2) clk = ~clk;#500000 $stop;
endinitial
begin in_a <= 4'd0;treg_data <= 4'd5;flag <= 1;
endalways @(posedge clk)begin //主程序data为输出状态,仿真程序data为输入状态时,输出in_a值in_a <= in_a + 1'd1;
endalways @(posedge clk)begin //主程序data为输入状态,仿真程序data为输出状态时,接收terg_data值treg_data <= treg_data + 1'd1;
endalways
begin #410 flag <= ~flag;
end
endmodule
最终结果如图
flag为1,data输出in_a值,flag为0,data输入treg_data值,out_b始终与data值相同。RTL电路显示,out_b只起到缓冲器作用而不是三态门控制,换句话说out_b不受flag控制。结合第二张图的inout端口原理图及警告Warning (18029),可以理解该警告意思为:out_b也需要处于三态门控制状态下,不然data无论作为输入还是输出,数据都会流入out_b端。
将out_b也改为三态门控制:
assign out_b = flag?4'hz:data;
//flag为1时,out_b呈高阻断路,flag为0时,此时data作为输入引脚,out_b输出data值。
改完后RTL门电路:
仿真结果:
flag为高输出in_a,flag为低,out_b输出接收到的data。
Verilog中InOut引脚、三态门实现、仿真相关推荐
- Verilog中inout端口的使用方法
Verilog中inout端口的使用方法 (本文中所有Verilog描述仅为展示inout端口的用法,实际描述则需要更丰富的功能描述) Inout端口的使用 在芯片中为了管脚复用,很多管脚都是双向的, ...
- Verilog中inout的用法(二)
芯片外部引脚很多都使用 inout 类型的,为的是节省管腿.一般信号线用做总线等双向数据传输的时候就要用到 INOUT 类型了.就是一个端口同时做输入和 输出. inout 在具体实现上一般用三态门来 ...
- Verilog中inout的用法
芯片外部引脚很多都使用 inout 类型的,为的是节省管腿.一般信号线用做总线等双向数据传输的时候就要用到 INOUT 类型了.就是一个端口同时做输入和 输出. inout 在具体实现上一般用三态门来 ...
- FPGA设计中inout端口信号的仿真测试
inout端口作为输入输出口,其在综合中以三态门的硬件形式而存在.但在波形仿真中,其具有输入输出性质就需要特别的操作手法才可以观察到正确的仿真波形. 在inout端口信号的仿真中,测试激励文件中Ino ...
- Verilog中inout的使用
刚开始学,用到inout,记录一下 只写核心部分 inout data:reg inout_ctrl;//控制输入输出模式 reg data_out://输出模式时需要输出的数值 //当inout_c ...
- verilog中的inout端口与三态门、高阻态的使用
高阻态 百度百科:高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电 ...
- Verilog中for语句的使用
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- 关于Verilog 中的for语句的探讨
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- verilog中for语句使用
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在T ...
最新文章
- iOS 根据中文字符串排序出字母索引
- 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )
- 论记笔记的重要性:以三个电影为例
- 烂泥:文件服务器搭建与使用详解,minio文件服务器搭建(单机版)
- SpringMVC基础配置与简单的SpringMVC的程序
- Label 表达式绑定
- Linq 中的Aggregate一些用法
- 智慧数字门店管理系统、PAD、门店系统、收银开单、预约服务、会员管理、账单管理、数据统计、商品、库存、美容美体、美甲美睫、医疗美容、美发造型、医疗诊所、中医理疗、宠物服务、美业、经营业务、售卡、交班
- 四位共阳极数码管显示函数_初学者,求助!!设计一个4位LED数码管动态扫描显示电路,用...
- token令牌防止重复提交
- 比特币 POW 白皮书 区块篡改成功的概率计算详解
- 使用Mac命令别名,提升工作效率
- 渠道类:新APP上线都有哪些具体的推广方式可以学习(最新)
- 基于JAVA的抽奖系统
- 存储资源 存储设备 数据存储
- 什么是反射(Reflection)?它能做什么?
- fragment实例
- 译《Office商业应用程序入门》
- 用C语言打印一个等腰三角形
- java eclipse sbt_SBT 构建scala eclipse开发