FPGA 是现场可编程门阵列的缩写,它是在PAL,GAL 及 EPLD 等可编程器件的基础上发展起来的。FPGA 具有速度快、密度高、功耗小的特点。采用 FPGA 芯片进行专用集成电路设计,既可以解决定制电路缺乏灵活性的不足,又可以通过相关的软硬件环境掌握芯片的最终功能,提高一次设计的成功率,所以,目前 FPGA 在电子设计中已被广泛使用。同时,由于 FPGA 经常要和外部存储器及 CPU 进行数据输入输出交换,而利用双向端口的设计来进行数据交换可以成倍地节省各自的引脚资源。

双向端口顾名思义是一种既可以作为输入端口接收数据,也可以作为输出端口发出数据,它对数据的操作是双向的。比如某个设计需要一个 16 位的数据输入口和一个16 位的数据输出口,并且数据输入和输出不会同时发生。如果数据输入口和输出口分别设计则需要32根数据线,而用双向端口来设计,则只需要16 根数据线,这样就节省了16 根数据线引脚。由于现在的大多数资料对双向端口的设计介绍很少,本文给出 FPGA 中双向端口的设计原理和方法,以及仿真和初始化双向端口的方法,同时选用Xilinx的Spartan2E 芯片进行实际应用。

1、 FPGA 中双向端口的设计原理和Verilog硬件语言程序设计

首先介绍双向端口在 FPGA 内部硬件资源是怎样实现的。在 FPGA 中它是通过对三态门控制来实现双向端口的,比如在 Xilinx 的Spartan2E 中的图例(如图1 所示):

图1 双向端口的硬件图

当z=0 时,上面输出的管子开通,此时数据可以从上面的管子中输出,这时双向端口就作为输出口;当z=1 时,上面的管子被置为高阻态,数据不能从上面的管子输出,此时数据只可以从下面的管子由外向内输入,这时的双向端口是输入口。限于篇幅,我们做一个简单的模型来说明双向端口的设计。下面我们用 Verilog 硬件语言进行双向端口的程序设计,为了看出双向端口分别作为输入端口和输出端口的功能,我们的模块分别定义一个数据输入口 din 和一个数据输出口 dout,一个三态门选通信号 z,触发时钟 clk,还有双向端口 dinout。我们设数据为8 位宽。图2为该模块图:

图2 定义的模块图

输入口din 定义:input [7:0] din;当双向端口 dinout作为输出口时,我们从 din 端口输入数据到模块中,让数据从dinout口出来。

输出口 dout定义:output [7:0] dout;当双向端口dinout作为输入口时,我们让数据从dinout口输入,从输出口dout输出。

双向端口dinout定义:inout[7:0] dinout;

三态门选通信号z:input z;

当z=1 时,把三态门置为高阻态,这时 dinout 作为输入口用;当z=0 时,开通三态门,这时 dinout 作为输出口用。

三态门控制语句为: assign dinout=(!z)?din_reg:8'bz;

总的完整程序如下: (关键是理清din,dout,dinout三者的关系)

module dinout(din,z,clk,dout,dinout);

input [7:0] din;

input z;

input clk;

output[7:0] dout;

inout [7:0] dinout;

reg [7:0] dout;

reg [7:0] din_reg;

asign dinout= (!z)?din_reg:8'bz; //由Z来决定何时为输入,何时为输出;为0为输出,为1为输入;din_reg作为输出的跳板;

always @ (posedge clk)

begin

if(!z)

din_reg=din;  //当z=0时,作为输出口,数据流向:din-->din_reg--->dinout;

else

dout=dinout; //当z=1时,作为输入口,数据流向:dinout-->dout;即:数据直接流入,间接流出;

end

Endmodule

下面我们对上述程序进行时序仿真。这里我们选用的 FPGA 芯片为 Xilinx 的 Spartan2E 系列,型号为 xc2s300e-7pq208,在ISE Foundation6.1 软件中综合及布局布线,并用 Modelsim Simulator进行时序仿真。

当双向端口dinout作为输出口时,我们不需要对它进行初始化,只要开通三态门。

我们设定在200ns后,让数据10,11,12,13,14,15,16,17,18,19,20 依次从 din 口输入,然后用20ns的采样时钟从dinout口输出。

它的测试仿真顶层模块为

`timescale 1ns/1ps

module dinoutest();

reg [7:0] din;

reg z;

reg clk;

wire [7:0] dout;

wire [7:0] dinout;

integer i;

dinout uut(

.din(din),

.z(z),

.clk(clk),

.dout(dout),

.dinout(dinout)

);

always #10clk=~clk;

initial begin

din = 0;

z = 0;   //让双向口作为输出口;

clk = 0;

# 200 din=10;

for(i=0;i

#20 din=din+1;

end

endmodule

从din 输入口输入到模块中的数据。

当双向端口dinout作为输入口时,我们需要对它进行初始化赋值,此时关闭三态门。而对双向端口的初始化赋值,如果把它跟一般的输入口一样直接赋值给它,则会出错,因为在定义它的时候是wire型了,而不是reg 型。在许多 Verilog 书籍和参考资料中,有关双向端口的初始化赋值介绍的很少。这里需要用到一个force 命令,用来给dinout 输入赋值。我们设定在200ns 后,让数据20,19,18,17,16,15,14,13,12,11,10 从dinout口输入模块,然后用 20ns的采样时钟从输出口 dout输出。以下是它的仿真顶层模块

`timescale 1ns/1ps

module dinoutest();

reg [7:0]din;

reg z;

reg clk;

wire [7:0] dout;

wire [7:0] dinout;

integer i;

dinoutuut(

.din(din),

.z(z),

.clk(clk),

.dout(dout),

.dinout(dinout)  //将双向口作为输入口时,要用wire型输入;

);

always #10clk= ~clk;

initial begin

z = 1;

clk = 0;

force dinout=20;  //对reg型可以直接赋值,但是对wire型需要force强制赋值;

# 200 for (i=0;i

#20 force dinout=dinout-1;

end

endmodule

可以看出这时双向端口 dinout作为输入口,数据从dinout口输入模块,然后从输出口dout完整地输出来。

这种双向端口设计方法已被我们用到目前开发的一个多通道图象捕获和显示控制系统中。在该系统中,FPGA 接收从两个图像传感器传来的数字视频信号,然后根据CPU的命令对这两路视频信号进行四种显示模式的组合操作。FPGA 将处理好的信号存到外部存储器中。如果LCD显示信号来了, FPGA 从外部存储器中取数据给LCD显示。如果CPU 想要对某一帧图像数据进行图象识别操作,可以经过 FPGA 从外部存储器中把该帧图象数据取下来。其中 LCD 的时钟频率为 6M,FPGA 对外部存储器及 CPU 数据操作的时钟频率为 24M,并且LCD显示操作优先级最高。在这个系统中用到了两个双向端口,一个是FPGA 与CPU的数据交换, 另一个是FPGA与外部存储器之间的数据交换,他们都是16 位的数据交换,由于用了双向端口,节省了32个引脚资源,同时优化了器件的选择和整体设计,降低了成本。

FPGA中双向IO端口的应用相关推荐

  1. FPGA双向IO使用之三态门说明

    在FPGA设计中,双向IO(输入输出引脚)是一个比较麻烦的东西,但是信号线用作总线等双向数据传输时就要用到inout类型. 以下用液晶的的数据线用作双向IO示例: 说是双向IO端口,其实输入和输出不是 ...

  2. Verilog——双向IO口的FPGA实现

    双向IO口的FPGA实现 双向IO口的Verilog试验 主要功能 模块代码 仿真代码 仿真结果 双向IO口的Verilog试验 主要功能 为深入理解双向端口的使用,进行本仿真试验,完成一个类似可修改 ...

  3. io端口与ion内存

    木子你妹 博客园 首页 新随笔 联系 管理 订阅 随笔- 109  文章- 12  评论- 8  <摘录>io端口和io内存 linux中的 IO端口映射和IO内存映射 (一)地址的概念 ...

  4. FPGA中LVDS差分高速传输的实现

    低压差分传送技术是基于低压差分信号(Low Volt-agc Differential signaling)的传送技术,从一个电路板系统内的高速信号传送到不同电路系统之间的快速数据传送都可以应用低压差 ...

  5. 单片机小白学步系列(二十三) IO口原理知识补充:双向IO口、互补推挽、高阻态

    由于之前考虑不周,本篇在IO口原理知识的基础上,进一步补充一些知识. ================================================= 双向IO口的输出:互补推挽 在 ...

  6. 使用comm在java程序中管理本地端口[回钦波:高级软件工程师]

    使用comm在java程序中管理本地端口 最近在做电信项目,遇到一些专业性的问题,在这里和大家一起分享下comm包下的类及如何使用等问题: 在java程序中,为了实现同本地系统的硬件端口(RS-232 ...

  7. FPGA 中时钟信号的总结

    数字电路中,时钟是整个电路最重要.最特殊的信号. 第一, 系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错. 第二, 时钟信号通常是系 ...

  8. FPGA上电后IO默认状态

    问题来源:fpga配置时的管脚状态 关于这个问题,好像网络上面有很多人问,但是eetop这个话题不多. 大多数的回答是:配置的时候所有的管脚默认是Z态.这个说法到底对不对呢? 下面我谈谈自己使用的几款 ...

  9. 三态(tri-state)门、双向(bi-directional)端口的建模、仿真和综合

    目录 1. 概要 2. 三态门 2.1 概念 2.2 三态门建模 3. 双向端口 3.1 HDL语言描述 3.2 直接调用元件库中的模块 3. 仿真 4. 综合 1. 概要 双向端口顾名思义是一种既可 ...

最新文章

  1. JAVA中循环删除list中元素的方法总结
  2. 【cs229-Lecture19】微分动态规划
  3. 输入参数_MyBatis中的输入/输出参数
  4. Centos 安装 jdk 和配置环境变量
  5. java compareTo() 用法注意点
  6. 富文本框让最大四百像素_富文本框的使用
  7. MYSQL问题解决方案:Access denied for user ‘root‘@‘localhost‘ (using password:YES)
  8. 吴恩达神经网络和深度学习-学习笔记-22-误差分析
  9. 在回传时保持滚动位置
  10. linux查看ps进程命令,linux ps查看进程命令
  11. php无框架开发web项目,web.framework
  12. GridinSoft CHM编辑器3.2.0多语言,轻松快速地翻译CHM电子书
  13. 查重有风险,小心论文被买卖!——iThenticate官方论文查重系统登录中国!
  14. iphone老是显示e服务器,苹果手机变成e网怎么办(苹果手机上显示e,怎么回事?)
  15. this beta version of Typora is expired, please download and install a newer version.Typora
  16. grub4dos 启动ubuntu 12.04
  17. 了解互联网一些基本知识
  18. 全球首届VueConf演讲PPT和视频免费公开
  19. 嵌入式学习班到底怎么样?
  20. 荒诞 (absurdity)

热门文章

  1. 系统可能不会保存你所做的修改 onbeforeunload
  2. 基于Nokia手机的移动游戏开发
  3. 【双目视觉】摄像头测试
  4. PDK开发初步(C#)(一)
  5. native字体尺寸自适应 react_react native 字体不随系统字体变化而变
  6. 【GIoU loss】GIoU loss损失函数理解
  7. OpenGL实验1:基本图元的绘制
  8. 将彩色图片转为黑白粉笔画
  9. maven报错: previously initiated loading for a different type with name servlet/http/HttpServletReq
  10. DeepinOS访问win7共享文件夹