fifo是一种常用于数据缓存的电路器件,可应用于包括高速数据采集、多处理器接口和通信中的高速缓冲等各种领域。然而在某些应用,例如在某数据采集和处理系统中,需要通过同步fifo来连接8位a/d和16位数据总线的mcu,但是由于目前同步fifo器件的输入与输出数据总线宽度相等,不能满足这种应用,因此通常采用输入与输出数据总线宽度均为8位的同步fifo作为它们之间的数据缓冲,并对mcu数据总线的高8位采用软件进行屏蔽,或是在同步fifo外围增加数据锁存器及逻辑控制器件的方法解决。为了提高效率和降低系统设计的难度,本文采用vhdl描述语言,充分利用xilinx公司spartan ii fpga的系统资源,设计实现了一种非对称同步fifo(输入与输出数据总线宽度不一致的同步fifo),它不仅提供数据缓冲,而且能进行数据总线宽度的转换。
非对称同步fifo的设计难点
对于非对称同步fifo的设计来说,不能简单地通过修改现成的同步fifo模块而得到,这是因为非对称同步fifo的设计有以下几个需要解决的难点问题:
(1) 写数据与读数据总线宽度不同。设写数据与读数据总线宽度分别为win和wout,必须对win>wout和win
(2) 如何协调内部处理过程中不同的时钟频率。例如输入2个8位字节需2个时钟周期,而输出1个16位字节只需1个时钟周期,所以必须为内部数据处理提供不同的时钟频率。
(3) 由于写数据与读数据总线宽度不同,所以,要操作正确,必须保证数据存储排列的顺序及空/满标志产生的正确。
另外,由于fpga中的寄存器个数有限,而fifo是一种基于ram的器件,需要占用大量的存储空间。通常在编写vhdl程序时用数组描述的方法来设计数据存储结构,在综合时会耗用大量的寄存器,所以这种方法在fifo的设计中是不可行的。
非对称同步fifo的设计
针对以上设计中的难点,本文采用vhdl描述语言,利用xilinx公司spartan ii fpga设计实现了一种非对称同步fifo,设计中充分利用了fpga中的资源如时钟延迟锁相环(dll)和blockram。
fpga中的dll
fpga 中的dll是一种很好的资源,xilinx公司spartan ii、spartan iie、virtex-e等系列器件中就采用时钟延迟锁相环技术进行fpga内部的时钟控制,它可以对时钟进行倍频、锁相等操作。
本设计中要利用spartan ii系列器件中的dll产生二倍频时钟信号。其中ibufg、ibuf、bufg、obuf是时钟缓冲器,提供时钟信号的最小时延。
fpga中的ram
xilinx公司的fpga器件提供了片内ram可供直接使用,而不必使用寄存器来构成存储空间,从而大大提高了芯片的利用率。根据型号的不同,fpga中提供了两种结构的ram:分布式ram和blockram。分布式ram可以利用可配置逻辑模块(clb) 设计实现,主要用于小容量片内存储;blockram是fpga内部的专用ram模块,通常沿芯片的垂直边排列。根据具体型号不同,fpga内部的blockram在单位容量和总体容量上都有较大的不同。本设计将采用blockram用于fifo的编写。由于在xilinx公司spartan ii fpga器件库中没有现成的宏模块,就需要自己生成blockram模块,具有较高的灵活度。利用xilinx公司的配套软件ise foundation和ise webpack中都带有的coregenerator程序包,可以很方便地建立用户所需的模块。只需要输入blockram模块的名称、blockram的类型(如单口还是双口)、地址线和数据线的宽度,就可以生成用户希望得到的结构。一般来说,生成的结构会自动加载到当前的项目中,从而可以像器件库中的元件一样调用。
非对称同步fifo的结构
下面以win
(1) 由于写数据与读数据总线宽度不同,所以在设计双口ram时把双口ram设计成写口ram和读口ram两个部分。例如fifo写口ram部分为512×8,读口ram部分为256×16,这样通过数据存储格式的改变达到写数据与读数据总线宽度的转换。
(2) 由于读数据时钟频率是写数据时钟频率的两倍,因此可利用fpga中的dll产生二倍频时钟信号来提高写数据的时钟频率,使读数据和写数据的时钟频率相等。二倍频时钟信号提供给写口ram、写地址产生模块,而源时钟信号(一倍频)提供给读口ram、读地址产生模块及空/满标志产生模块,从而解决了内部数据处理同步的问题。
(3) 由于双口ram中存在两种数据存储格式,因此地址位数不同,读地址和写地址不能一一对应,例如fifo写口ram部分为512×8,读口ram部分为256×16,因此写地址要求9位,而读地址要求8位,对于同一数据的写地址与读地址,写地址的高8位与读地址的8位相等,它们的区别仅在写地址的最低一位。因此可把写地址的高8位与读地址一同输入空/满标志产生模块,从而得到正确的full和empty信号。下面仅给出读写地址产生逻辑及空/满标志产生逻辑的vhdl设计程序:
fifo_write : process
begin
wait until rising_edge(clk);
if rst = '1' then
wr_addr <= 0; //写地址初始化
else
if (wr_en = '1' and full = '0')then
wr_data_buf (wr_addr) <= to_bitvector(wr_data (7 downto 0));
//写数据,其中wr_data_buf定义为基于blockram的存储矩阵
wr_addr <= (wr_addr + 1) mod 8;// 写地址增加1
end if;
end if;
end process;
fifo_read : process
begin
wait until rising_edge(clk);
if rst = '1' then
rd_addr <= 0;
//读地址初始化
else
if (rd_en = '1' and empty = '0') then
rd_data (15 downto 0) <= wr_data_buf (rd_addr);//读数据
rd_addr <= (rd_addr - 1) mod 16;// 读地址减1
end if;
end if;
end process;
wr_addr1 wr_addr1) ;// m定义为fifo的深度
else 0;
empty<= '1' when (offset = 0) else '0';
fullwout情形下的非对称同步fifo,而且该方案具有很强的灵活性并易于实现。如通信只需单向进行,则只用一片fpga即可;双向通信时需用两片fpga。经过实际验证,该方案可以满足一般需要.
基站节能 通信网节能的“长尾”
这些数字化“武器”如何在抗疫中发挥作用
苹果研发microLED屏幕欲取代OLED屏
国产计算机平台介绍——申威
利用Python发送邮件的 3 种方式
基于VHDL和FPGA的非对称同步FIFO设计实现
三季度报告披露结束,汽车产业链上市公司的业绩也浮出水面
轧机轴承外圈爆裂的原因及对策 压缩机轴承温度高的处理方法
华为与湖南广电举办战略合作签约仪式 建设芒果云数字底座
DSP硬件设计需要注意的几个Tips
iPhone 8重磅特性:支持无线充电成定局
华为智慧屏S系列12月26日正式开售,3299元起刷新电视传统认知
越南永新电厂一期工程1号机组并网成功,项目开始转入运营期
华为消费者业务调整:CMO朱勇刚接替张晓云
行星齿轮减速机轴承位磨损如何修复
分享15个运算放大器基础知识
小米MIUI实力更新?人工智能算法系统能否赶上华为
设计Verilog时为什么要避免Latch的产生呢?
Pro/E自动分模方法与技巧
微软Win10预览版发布:修复潜在数据丢失Bug