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: ...
随机推荐
- Java练习 SDUT-1140_面向对象程序设计上机练习一(函数重载)
面向对象程序设计上机练习一(函数重载) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 利用数组和函数重载求5个数最大值 ...
- asp.net抓取网页html源代码失败 只因UserAgent作怪
asp.net抓取网页html源代码,我想对于任何一个asp.net程序员来说都不再陌生,这是一个非常简单容易就能实现的功能.下面便是一个通用的asp.net获得网页源代码的程序. 首先引用 usin ...
- Python中进制转换函数的使用
Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...
- 洛谷P2330 [SCOI2005]繁忙的都市
#include<bits/stdc++.h> using namespace std; ; ; int n,k,Max,tot; struct node{ int cnt,fa; }f[ ...
- MapReduce数据流-Reduce
- 实验4 JavaBean创建和使用(计算器)
实验4 JavaBean创建和使用 一.实验目的 1.掌握JavaBean创建和使用方法: 2.领会JavaBean简化页面设计的优势等. 二.实验内容 1.设计诸如以下页面的简单计算器 要求:完成 ...
- hdu 2986 Ballot evaluation (Simulation)
Problem - 2986 之前在华工赛见过的一道简单的模拟,用map轻松干掉.为了精确,要全程用整型比较.轻松1y~ 代码如下: #include <cstdio> #include ...
- SpringBoot 集成 Activiti 一路踩得坑
由于项目需要,本人开始在项目Spring boot 中集成工作流引擎Activiti.由于第一次集成,一路上步步都是坑,怪我没有先去看官方文档.现将一路上遇到的问题一一记录. 一. 环境配置 1.项目 ...
- C# 强转会不会抛出异常
最近遇到一个小伙伴问我,从一个很大的数强转,会不会抛出异常.实际上不会出现异常 最简单的代码是使用一个比 maxvalue 大的数,然后用它强转 long tathkDucmmsc = int.Max ...
- SpringSecurity登录原理(源码级讲解)
一.简单叙述 首先会进入UsernamePasswordAuthenticationFilter并且设置权限为null和是否授权为false,然后进入ProviderManager查找支持Userna ...