IN_FIFO 原语

judy 在 周三, 06/26/2019 - 09:38 提交

前3篇咱们介绍了 SelectIO 逻辑资源,本篇咱们就聊一聊与SelectIO 逻辑资源水乳交融、相得益彰的另一个概念——IO_FIFO。

1个IO_FIFO包括1个IN_FIFO 和1个OUT_FIFO,它是7系列FPGA新设计的IO专用FIFO,主要用于IOLOGIC(例如ISERDES、IDDR、OSERDES或ODDR)逻辑功能的扩展。

FPGA的每个BANK有4个IN_FIFO和4个OUT_FIFO,相当于每12个IO对应1个IN_FIFO和1个OUT_FIFO。

IN_FIFO从ILOGIC接收4bit位宽的输入数据,但却可以输出4bit或者8bit位宽的数据到FPGA内部SLICE。OUT_FIFO正好相反,从OLOGIC接收4bit或者8bit位宽的输入数据,但却输出4bit位宽数据。

每一个IO_FIFO的存储大小为768bit,可以配置成12组4X4位宽数据的FIFO,也可以配置成10组4X8bit位宽数据的FIFO。每个IO_FIFO的深度为9。如图1所示为IO_FIFO的结构示意图:

图1:IO_FIFO的结构示意图

如图2所示为IN_FIFO的原语框图:

图2:IN_FIFO的原语框图

正如前面所说,当配置成12组的4bit位宽输入,4bit位宽输出时,输入D0[3:0]~ D9[3:0]对应输出Q0[3:0]~ Q9[3:0];输入D10[3:0]即为输入D5[7:4],对应输出Q5[7:4];输入D11[3:0]即为输入D6[7:4],对应输出Q6[7:4]。

当配置成10组4bit位宽输入,8bit位宽输出时,D0[3:0]~D9[3:0]对应输出Q0[7:0]~ Q9[7:0],此时写时钟频率是读时钟频率的2倍。OUT_FIFO和IN_FIFO操作过程正好相反,咱们这里就不罗嗦了。

总的来说,IO_FIFO其实就是存储深度比较小、位宽固定为4/8bit的普通FIFO ,7系列FPGA单独设计了这样的FIFO,更适用于IO接口处的字节\半字节数据缓存。

下面是使用Xilinx FIFO原语的详细介绍和使用方法,以及Verilog代码示例。 1. FIFO原语的介绍 Xilinx FIFO原语是一种内置的FIFO模块,可以用于存储和读取数据。FIFO原语有两种类型:同步FIFO和异步FIFO。同步FIFO是在时钟边沿进行读写操作的,而异步FIFO是不需要时钟边沿就可以进行读写操作的。 FIFO原语的常用参数包括:宽度(width)、深度(depth)、写时钟(write_clk)、读时钟(read_clk)、写使能(we)、读使能(re)等。 2. FIFO原语的使用方法 下面是使用Xilinx FIFO原语的基本步骤: (1) 实例化FIFO原语模块,并连接其输入输出端口。 (2) 设置FIFO原语模块的参数,包括宽度、深度、时钟等。 (3) 在写入数据时,将数据和写使能信号写入FIFO的输入端口。 (4) 在读取数据时,将读使能信号写入FIFO的输入端口,并从FIFO的输出端口读取数据。 下面是使用Xilinx FIFO原语的Verilog代码示例: ``` module fifo_example ( input clk, // 时钟信号 input rst, // 复位信号 input we, // 写使能信号 input re, // 读使能信号 input [31:0] data_in, // 写入数据端口 output [31:0] data_out // 读出数据端口 ); (* ram_style = "block" *) // 设置使用block RAM (* data_fifo = "true" *) // 设置使用FIFO模式 (* data_width = 32 *) // 设置数据宽度为32位 (* depth = 16 *) // 设置深度为16 // 实例化FIFO原语模块 // 时钟使用输入时钟,时钟使能信号为1 // 写使能信号使用we信号,写入数据使用data_in信号 // 读使能信号使用re信号,读出数据使用data_out信号 // 空信号和满信号暂时不使用,因此用"_"代替 // 读出数据延迟为1个时钟周期 // 重置信号使用rst信号 // FIFO原语的名称为fifo_inst fifo_inst #( .data_width(32), .depth(16), .ram_style("block") ) fifo ( .wr_clk(clk), .wr_en(we), .din(data_in), .rd_clk(clk), .rd_en(re), .dout(data_out), .full(_), .empty(_), .almost_full(_), .almost_empty(_), .prog_full_threshold(_), .prog_empty_threshold(_), .rd_count_threshold(_), .wr_count_threshold(_), .read_delay(1), .wr_clr_on_rst(1), .rst(rst) ); endmodule ``` 在上述代码中,我们实例化了一个FIFO原语模块fifo_inst,并连接了其输入输出端口。我们设置了FIFO的参数,包括数据宽度、深度、时钟等。在写入数据时,我们将写入的数据和写使能信号输入到FIFO的输入端口。在读取数据时,我们将读使能信号输入到FIFO的输入端口,并从FIFO的输出端口读取数据。此外,我们还使用了ram_style和data_fifo参数来指定FIFO的实现方式。 3. 总结 本文介绍了Xilinx FIFO原语的使用方法,并给出了Verilog代码示例。使用FIFO原语可以方便地实现数据流的缓存和流控制,以便在不同的速率之间传输数据。在实际设计中,我们应该根据具体需求选择合适的FIFO原语类型和参数,并进行优化设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值