【2017年整理】FPGA 中双向端口IO的研究

上传人:德****1 文档编号:970910 上传时间:2017-05-23 格式:DOC 页数:13 大小:172KB
返回 下载 相关 举报
【2017年整理】FPGA 中双向端口IO的研究_第1页
第1页 / 共13页
【2017年整理】FPGA 中双向端口IO的研究_第2页
第2页 / 共13页
【2017年整理】FPGA 中双向端口IO的研究_第3页
第3页 / 共13页
【2017年整理】FPGA 中双向端口IO的研究_第4页
第4页 / 共13页
【2017年整理】FPGA 中双向端口IO的研究_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《【2017年整理】FPGA 中双向端口IO的研究》由会员分享,可在线阅读,更多相关《【2017年整理】FPGA 中双向端口IO的研究(13页珍藏版)》请在金锄头文库上搜索。

1、FPGA 中双向端口 I/O 的研究 字体大小: 小 中 大 作者:莫海永 张申科 来源: 日期:2007-03-07 点击:1039 摘要:针对现场可编程门阵列(FPGA)芯片的特点,研究 FPGA 中双向端口 I/O 的设计, 同时给出仿真初始化双向端口 I/O 的方法。 采用这种双向端口的设计方法,选用 Xilinx 的 Spartan2E 芯片 设计一个多通道图像信号处理系统。引言FPGA 是现场可编程门 阵 列 的 缩 写,它 是 在 PAL,GAL 及 EPLD 等可编程器件的基础上发展起 来的。FPGA 具有速度快、密 度 高、功 耗 小 的 特点。 采用 FPGA 芯片进行专用

2、集成电路设计,既可以解决定制电路缺乏灵活性的不足, 又可以通过相关的软 硬件环境掌握芯片的最终功能,提高一次设计的成功 率,所以,目前 FPGA 在电子设计中已被广 泛使用。 同时,由于 FPGA 经常要和外部存储器及 CPU 进行数据输入输出交换,而利用双向端口的设计来进行数据交换可以成倍地节省各自的引脚资源。双向端口顾名思义是一种既可以作为输入端口 接收数据, 也可以作为输出端口发出数据,它对数据 的操作是双向的。 比如某个设计需要一个 16 位的 数据输入口和一个 16 位的数据输出口 ,并且数据输 入和输出不会同时发生。 如果数据输入口和输出口 分别设计则需要 32 根数据线,而用双向

3、端口来设计,则只需要 16 根数据线,这样就节省了 16 根数据 线引脚。由于现在的大多数资料对双向端口的设计介绍很少,本文给出 FPGA 中双向端口的设计原理和方法,以及仿真和初始化双向端口的方法,同时选用 Xilinx 的 Spartan2E 芯片进行实际应用。1、 FPGA 中双向端口的设计原理和 Verilog 硬件语言程序设计首先介绍双向端口在 FPGA 内部硬件资源是怎样实现的。 在 FPGA 中 它是通过对三态门控制来实现双向端口的,比如在 Xilinx 的 Spartan2E 中 的图例(如图 1 所示):图 1 双向端口的硬件图 当 z=0 时,上面输出的管子开通,此时数据可

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

5、in;当双向端口 dinout 作为输出口时,我们从 din 端口输入数据到模块中, 让数据从 dinout 口出来。输出口 dout 定义:output 7:0 dout;当双向端口 dinout 作为输入口时,我们让数据从 dinout 口 输入,从输出口 dout 输出。双向端口 dinout 定义:inout7:0 dinout;三态门选通信号 z:input z;当 z=1 时,把三态门置为高阻态,这时 dinout 作为输入口用; 当 z=0 时,开通三态门, 这时 dinout 作为输出口用。三态门控制语句为: asigndinout=(!z)?din_reg:8bz; 总的完整

6、程序如下: module dinout(din,z,clk,dout,dinout); input 7:0 din;input z; input clk; output7:0 dout;inout 7:0 dinout; reg 7:0 dout; reg 7:0 dinreg; asign dinout= (!z)?din_reg:8bz; always (posedge clk)begin if(!z)din_reg=din; else dout=dinout;endEndmodule 2、 仿真及初始化双向端口下面我们对上述程序进行时序仿真。 这里我们选用的 FPGA 芯片为 Xilin

7、x 的 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;r

8、eg 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 begindin = 0; z = 0; clk = 0;# 200 din=10;for(i=0;i0);reg_b0); elsif clkevent and clk=1 thenif rw=1 thenif address=00 then reg_aZ); -输出end arc_dir;在程序设计中,首先

9、需要定义 data_in, data_out, reg_a, reg_b 四个 signal,我们把 data_in 叫做输入寄存器,它是从双向信号 data 接收数据的寄存器,data_out 叫做输出寄存器,它是向双向信号 data 发送信号的寄存器,reg_a 和reg_b 叫做操作寄存器,它们是在一定的时序控制下把 data_in 数据送给reg_a,reg_b,在一定的时序控制下从 reg_a 和 reg_b 读出数据的.这样的处理方式必须有两个进程,因为在 architecture arc_dir of dir_data is 和 begin 之间定义了 data_in, data

10、_out, reg_a, reg_b 四个 signal,它在同一进程内不支持既赋值,又调用,也就是说它不支持在 d1 进程中对信号 reg_a, reg_b 赋值,又在 d1 进程中又调用 reg_a, reg_b.首先有语句”data_inZ);”它表示双向信号的三态输出,而最最关键的是 when 后面的条件,如果条件限制太宽,就会错误占用双向信号总线,引起总线的误操作,如果条件限制太窄,输出寄存器的数据就不能够正确的送到数据总线上去,会引起数据的丢失.也就是说,只有正确的限制了 when 语句后面的条件,才能够把输出寄存器的数据正确地送到数据总线上去.仔细查看此条件,有如下的规律:whe

11、n语句后的条件是操作寄存器写入输出寄存器的条件的公共条件.比如:rw=0是操作寄存器的数据写入输出寄存器的读使能信号,address(1)是地址线的公共部分.在实际工程应用中,需要设计者在分配地址总线的时候掌握一定的技巧,尽量从地址的低位到到高位,保证地址总线有更多位的公共部分,比如只对四个寄存器操作时,地址线分配为”100”,”010”,”110”,”001”是不科学的,而”000”,”001”,”010”和”011”则是理想的.两者不同的是前者地址线没有公共部分,这样的设计无法用 when 语句对条件进行直接的控制,如果置之不理,由于列举不全,在逻辑综合时,电路会利用器件的乘积项和查找表的资源形成一个Latch, Latch 不仅会把电路的时序变得复杂,而且电路存在潜在的危险性.虽然when 语句后的条件不能够对条件进行直接的控制,但是可以使用枚举法一一把用到的地址线罗列出来,表示只有在这样的地址线的情况下才会用到数据总线,否则其他状态对数据总线送高阻,表示不占用数据总线.总而言之,双向信号是程序设计中尤其重要的基础,设计者在设计程序的时候,要尤其注意,何时会占用数据总线,何时不占用数据总线

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号