FPGA之IO信号类型深入理解
在FPGA设计开发中,很多场合会遇到同一根信号既可以是输入信号,又可以是输出信号,即IO类型(Verilog定义成inout)。
对于inout型的信号,我们既可以使用FPGA原语来实现,也可以使用Verilog代码来实现。下面将介绍在Xilinx 7系列FPGA上两种实现方式的差别和注意点。
不管哪种方式实现IO功能,从编译结果看都会调用IOBUF原语,为此,我们先来看一下IOBUF的结构,如下图所示。

1.FPGA原语实现
首先,我们编写的代码如下:
`define PRIMITIVE module io_buf(
input T ,
input I ,
output O ,
inout IO
); `ifdef PRIMITIVE
IOBUF #(
.DRIVE ( ), // Specify the output drive strength
.IBUF_LOW_PWR ("TRUE" ), // Low Power - "TRUE", High Performance = "FALSE"
.IOSTANDARD ("DEFAULT" ), // Specify the I/O standard
.SLEW ("SLOW" ) // Specify the output slew rate
) IOBUF_INST (
.O (O ), // Buffer output
.IO (IO ), // Buffer inout port (connect directly to top-level port)
.I (I ), // Buffer input
.T (T ) // 3-state enable input, high=input, low=output
);
`else
assign IO = T? I:'bz;
assign O = IO;
`endif endmodule
该代码通过原语IOBUF实现IO功能,使用Vivado编译后的原理图如下图所示。可以看到IOBUF内部由OBUFT和IBUF原语构成。

2.使用Verilog实现
把`define PRIMITIVE注释掉,则为通过Verilog的实现方式,如下图:
//`define PRIMITIVE module io_iobuf(
input T ,
input I ,
output O ,
inout IO
); `ifdef PRIMITIVE
IOBUF #(
.DRIVE ( ), // Specify the output drive strength
.IBUF_LOW_PWR ("TRUE" ), // Low Power - "TRUE", High Performance = "FALSE"
.IOSTANDARD ("DEFAULT" ), // Specify the I/O standard
.SLEW ("SLOW" ) // Specify the output slew rate
) IOBUF_INST (
.O (O ), // Buffer output
.IO (IO ), // Buffer inout port (connect directly to top-level port)
.I (I ), // Buffer input
.T (T ) // 3-state enable input, high=input, low=output
);
`else
assign IO = T? I:'bz;
assign O = IO;
`endif endmodule
该代码使用Vivado编译后的原理图如下图所示。该实现方式也会调用IOBUF原语,但多消耗了一个LUT资源。

通过Verilog实现时,我们在把IO信号当成输入时给赋值高阻态(1‘bz)。假如我们把此时的IO信号赋值1‘b0或者1‘b1,会出现什么情况呢?我们把1‘bz写成1‘b1,如下所示:
//`define PRIMITIVE module io_iobuf(
input T ,
input I ,
output O ,
inout IO
); `ifdef PRIMITIVE
IOBUF #(
.DRIVE ( ), // Specify the output drive strength
.IBUF_LOW_PWR ("TRUE" ), // Low Power - "TRUE", High Performance = "FALSE"
.IOSTANDARD ("DEFAULT" ), // Specify the I/O standard
.SLEW ("SLOW" ) // Specify the output slew rate
) IOBUF_INST (
.O (O ), // Buffer output
.IO (IO ), // Buffer inout port (connect directly to top-level port)
.I (I ), // Buffer input
.T (T ) // 3-state enable input, high=input, low=output
);
`else
assign IO = T? I:'b1;
assign O = IO;
`endif endmodule
编译后的原理图如下,可以看到并不会调用IOBUF原语,IO的不能实现输入功能,这就是解释了为什么在使用Verilog实现一根信号的IO功能时需要赋值1‘bz。

FPGA之IO信号类型深入理解的更多相关文章
- java基础之IO流及递归理解
一.IO流(简单理解是input/output流,数据流内存到磁盘或者从磁盘到内存等) 二.File类(就是操作文件和文件夹的) 1.FIleFile类构造方法 注意:通过构造方法创建的file对象是 ...
- linux io的cfq代码理解
内核版本: 3.10内核. CFQ,即Completely Fair Queueing绝对公平调度器,原理是基于时间片的角度去保证公平,其实如果一台设备既有单队列,又有多队列,既有快速的NVME,又有 ...
- MVC开发中的常见错误-07-“System.IO.DirectoryNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生
“System.IO.DirectoryNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 未能找到路径“F:\Users\home\Docume ...
- Unix系统编程()信号类型和默认行为
信号类型和默认行为 就是讲了有多少个信号类型 好多啊,后面用到了再看...
- C# 使用.net core 驱动树莓派的IO信号
如何使用.net core来驱动树莓派的IO信号?是我们的实际项目需求中,可能就会有这种小项目,我们要输出一个IO信号,此处我们拿了树莓派4做测试 一共有两排引脚,引脚的顺序定义及功能如下: 我们就参 ...
- 又趟一个坑,IO卡信号DI和DO的信号类型
工控IO卡可以感应到各种电信号,传感器的状态变化. DI信号包括数字开关信号(ture,false\0,1),光信号的变化(上升沿,下降沿). DO信号包括脉宽和数字开关信号(ture,false\0 ...
- Qt信号槽机制理解
1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...
- xilinx FPGA普通IO作PLL时钟输入
本帖转自于 :http://www.cnblogs.com/jamesnt/p/3535073.html 在xilinx ZC7020的片子上做的实验; [结论] 普通IO不能直接作PLL的时钟输入, ...
- io调度策略noop的理解
io电梯算法,网上一堆,在此不再赘述. 手上有几块厂商提供的sas的ssd,做如下实验. 考虑到没有磁头移动,ssd一般采用noop的io调度策略,结果看到如下的iostat测试数据: Device: ...
随机推荐
- 2019-6-23-WPF-获得当前输入法语言区域
title author date CreateTime categories WPF 获得当前输入法语言区域 lindexi 2019-06-23 11:51:21 +0800 2018-10-12 ...
- python == 符号
- 64位Linux编译C代码,crt1.o文件格式不对的问题
今天在某台64位LInux下编译一个简单的hello world的C程序,报错: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../crt1.o: cou ...
- jQuery 练习 dom
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 洛谷P1060 开心的金明
//01背包 价值等于重要度乘体积 #include<bits/stdc++.h> using namespace std; ; ; int n,m,v[maxn],w[maxn],f[m ...
- laravel5.6 发送邮件附带邮件时,Unable to open file for reading,报错文件路径问题
https://stackoverflow.com/questions/48568739/unable-to-open-file-for-reading-swift-ioexception-in-la ...
- PageProxy分页的实现
PageProxy是Ext.Net实现的一种分页方式,PageProxy通过实现OnReadData事件来完成分页. <ext:Store runat=" OnReadData=&qu ...
- 认识一下ES6的Reflect和Proxy
Reflect Reflect要替代Object的很多方法, 将Object对象一些明显属于言内部的方法放到了Reflect对象上,有13个方法 Reflect.apply(target, thisA ...
- Python--day70--ORM多对多的三种方式
- 基于ThinkPHP与阿里大于的PHP短信验证功能
https://blog.csdn.net/s371795639/article/details/53381274 PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定A ...