如何利用fifo读不出来数据提取信号后沿数据

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
DDR2 SDRAM 控制器模块:
控制器支持4或者8字节长度的突发传输,三个CAS延时。控制器在加载命令时初始化EMR2、EMR3寄存器并产生差分数据选通信号。控制器接受用户命令,对用户命令译码并产生读、写和刷新命令。控制器同时产生其他模块的接口信号。
数据路径:数据路径模块负责与存储器进行数据的发送和接收。主要功能包括:
&&&&&&&&&&&&&&&&& # 写数据到存储器
&&&&&&&&&&&&&&&&& #从存储器读数据
&&&&&&&&&&&&&&&&& #将存储器时钟域数据转到FPGA时钟域
写数据和选通信号由FPGA扇出,选通信号与数据信号中心对齐。对于DDR2 SDRAM存储器来说,选通信号是非自由运行。为了满足这些要求,使用FPGA主时钟移相90和270度将写数据扇出。存储器读数据和源同步时钟边缘对齐。
读数据捕获:
在读数据阶段,DDR2设备发送DQS选通信号和数据信号到FPGA。DQS与数据DQ边缘对齐。数据在每个时钟边缘更新,在FPGA逻辑中,使用DQS延时信号去捕获数据DQ信号。在FPGA中不使用IOB寄存数据而是用基于LUT的双端口专用RAM用于数据捕获。这是最简单的数据捕获模式,不需要在系统时钟域进行二次采集。LUT RAM配置为成FIFO对,每个数据都被写入到两个FIFO。如图3。这些16比特深度的FIFO是异步操作且与读写端口独立。
&读数据时钟:
在延时的DQS上升沿从DDR的读取数据写到FIFO_0,在下降沿将数据写到FIFO_1。而数据却能同时从FIFO中读出。
FIFO写指针由延时的DQS驱动。FIFO的读指针是由FPGA内部时钟驱动。当FIFO写使能为高时,FIFO可以被写入数据。FIFO写使能信号由RST_DQS_DIV在每个DQS前导信号产生。
&RST_DQS_DIV信号驱动到IOB并且输出,经过一个回环延时后输入到输入缓冲器。环路延时的长度等于前向的时钟信号长度加上DQS的长度。LUT延时电路用于延时DQS。这就保证了RST_DQS_DIV和DQS延时电路在进入FIFO之前具有相同的路径和相似的延时。
写使能产生:
FIFO_0写使能信号是RST_DQS_DIV和锁存的RST_DQS_DIV信号的逻辑“或”输出。FIFO_1在DQS信号第一个正沿后使能。这个逻辑消除了虚假的数据信号被锁存到FIFO当中,同时也消除了写指针的错误增加。
RST_DQS_DIV无效时的前导周期,锁存的输出使能FIFO和FIFO指针。在DQS最后一个边沿信号,锁存的RST_DQS_DIV标记被清除,此时FIFO和FIFO写指针被禁止。
图6显示了DQS_DIV_RST, RST_DQS_DIV和FIFO写使能信号的时序图。RST_DQS_DIV和FIFO写使能信号的总延时不能超过一个存储器时钟周期。MIG工具生成必须的DQS_DIV_RST,RST_DQS_DIV以及FIFO写使能信号约束(UCF)。
当延时的DQS有效时,数据被锁存到FIFO。FIFO_0、FIFO_1写指针使能当RST_DQS_DIV 有效的时候。数据在延时的DQS上升沿时写入FIFO_0,同时写指针增加。在下降沿数据锁存到FIFO_1,同时FIFO_1写指针增加。
顶层结构模块产生FPGA时钟信号和复位信号。DCM用于产生CLK0和CLK90.一个延时校准电路实现这个功能。
延时校准电路:
有几个因素可以影响在DQ数据有效窗口中的DQS中心。由于进程、电压、温度变化、LUT延时可能在250~625pS中变化。在抽头延时电路中,LUT延时可以测量。&
&&每个抽头延时都有输入反向。一般XC3S700-5FG484的LUT延时为620ps。对于一个166MHZ的设计,大约有5个或者6个LUT在时钟相位里边。边缘行为(10或者0)从抽头电路中产生。
延时电路:
选通信号使用内部延时元件产生,延时元件由LUT和其他资源组成。
阅读(997)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_083075',
blogTitle:'DDR2 SDRAM interface for Spartan-3 Generation FPGAs(邓治彬 翻译)',
blogAbstract:'概述: 本应用文档描述了赛灵思斯巴达3系列FPGA与DDR2 SDRAM的接口实现。本文档提供了DDR2 SDRAM的简述,然后一个存储器接口实现的详细描述。\r\nDDR2 设备概述:DDR2 SDRAM接口是源同步、支持双速率传输。比如DDR SDRAM ,使用SSTL 1.8V/IO电气标准,该电气标准具有较低的功耗。与TSOP比起来,DDR2 SDRAM的FBGA封装尺寸小得多。通过时钟上升下降沿的数据集采集,DDR2 SDRAM可以获得高速传输。存储器使用控制器的差分时钟。在每个时钟的上升沿寄存命令信号,双向数据选通信号DQS与数据信号一同传输。在读阶段,DQS由DDR2 SDRAM 设备产生,并且与数据信号边缘对齐;在写阶段,DQS由控制器产生,并且与数据信号中心对齐。对DDR2',
blogTag:'fpga,sdram,fifo,ddr2,时钟',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'不用了吧',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}基于stm32f4的高速信号频谱分析仪-ST技术方案-意法半导体STM32/STM8技术社区
基于stm32f4的高速信号频谱分析仪
发布时间:
来源:意法半导体STM32/STM8技术社区 (http://www.stmcu.org)
本系统是以STM32F407为核心,主要采用FIFO来做高速缓存。高速信号先通过AD采样,然后先将采样后的数据给FIFO先缓存处理,然后再通过STM32F407进行加Blackman预处理,再做1024个点FFT进行频谱分析,最后将数据显示在LCD12864上,以便进行人机交互!该系统可实现任意波形信号的频谱显示,以及可以自动寻找各谐波分量的幅值,频率以及相位并进行8位有效数据显示。
系统设计任务
设计并制作一个高速频谱分析仪。
本系统由前置匹配放大电路,AD采样电路,高速FIFO缓存电路,以及液晶显示电路组成。其中高速数据缓存电路,以及高精度的显示数据是本次设计的难点!下面分别论证这几个模块的选择。
系统框图&&&&&&&&&&&&&&&&&&&&&&&&&&&
1.1测量方法的论证与选择
1.1.1& MCU处理器的比较与选择
做DSP处理主要是要考虑到运算速度。
在处理器的选择上通常可以采用8位,16位或者32位的MCU,但由于在处理信号的过程中,通常会遇到快速傅里叶FFT算法,所以会遇到大量的浮点运算,而且一个浮点数要占用四个字节,故在处理过程中要占用大量的内存,同时浮点运算速度比较慢,所以采用普通的MCU在一定时间内难以完成,所以综合考虑运算速度和内存大小等因素。
本系统采用32位的STM32F407做为核心DSP处理器件,该芯片具有1MB的Flash闪存空间,196KB的SRAM空间,并且时钟频率达到了168MHz。程序运行于168MHz主频时,通过Flash取指令(不是内部SRAM),通过Dhrysone测试得到210DMIPS,主要采用ART加速器,可以最大限度的消除Flash存储器较慢从而限制MCU性能的发挥,这可以使CPU可以在所有工作频率下近乎零等待的方式,从Flash中运行程序。还有就是STM32F407带有硬件FPU处理单元,这样可以不用软件算法实现浮点运算,而直接采用硬件来实现浮点运算,这样就减小了编译器生成的代码量,并且使用更方便,浮点数只占用四个字节就可以表示的数据范围很大,因此不用担心计算后的数据溢出问题!进一步提高运算速度。
1.1.2 采样方法比较与选择
方案一 通过DDS集成芯片产生一个频率稳定度和精度相当高的方波信号作为时钟信号。
可选用直接数字频率合成(DDS)芯片AD9851,AD9851为ADI公司生产的高性能器件,可与单片机通过简单的接口完成串行或者并行通信。可完成外部输入频率控制字与芯片内部频率相位控制字之间的转换,可以非常容易的通过频率控制字调整输出频率,以及精确的调整输出信号的相位,输出信号幅值稳定,但是由于DDS控制也需要占用一部分MCU的IO口资源,并且DDS在价格上成本有点高。
方案二 直接由MCU产生PWM波做为采样时钟信号。
可直接由STM32F407产生的PWM波,可实现频率,占空比可调的方波。最快IO口翻转速度可以达到84MHz,可以轻松实现想要的采样频率。由于输出的是3.3V的幅值的电压,与外围芯片相连,需要经过电平转换芯片转成5V,才能作为外围芯片的时钟信号。
方案三 采样时钟信号选用Linear公司生产的LTC1799提供。
LTC1799是一款精准型振荡器,使用方便。它采用2.7V到5.5V单电源工作,并提供了轨至轨、占空比为50%的方波输出。CMOS输出驱动器确保了快速上升/下降时间和轨至轨开关操作。频率设定通过电阻器调节,电阻阻值在 的范围内变化,以选择处于100KHz到33MHz之间的任何一个频率。三态DIV输入负责决定驱动输出之前对主时钟进行1、10或100分频。
综合上述方案,选择方案三,采用一片LTC1799来产生15MHz的采样时钟信号。
1.1.3&& AD采样芯片的论证与选择
方案一 采用MCU内部ADC对采样信号进行采样。
STM32F407内部最大转换速率为7.2MSPS,而且被采样信号的幅值只能在0V到3.3V之间,能测得动态范围小,难以满足要求。
方案二 采用TI公司的8位TLC5510A作为AD采样芯片。
TLC5510A是采用高速CMOS技术,8位的,最大转换速率为20MSPS的AD转换芯片。支持+5V电源供电,内部包含采样保持电路,输出带有高阻态模式,以及带有内部参考电阻。输出数据在时钟的下降沿有效,数据流水线结构导致了2.5个时钟的延时。而且高速AD普遍价格比较昂贵,在满足输入信号在2V以上动态范围,TI公司可供申请的高速AD芯片只有TLC5510A这一种。
综合上述方案,选择方案二,在精度要求不高场合,采用TLC5510A作为高速采样芯片。&&
1.1.4 高速数据缓存芯片的论证与选择
由于15MHz的高速数据流,如果中断来标记数据流的地址,由于MCU的中断响应时间有限,有12个时钟周期的中断延时,因此就需要外部存储器做高速数据缓存。
方案一 采用SRAM芯片作为外部高速数据缓存芯片。
采用IDT71024来做高速缓存,由于SRAM提供了地址线端口和数据输入和输出端口,如果用MCU来控制的SRAM的地址线,中断响应不过来是反应不过来,如果用计数器作为地址计数器,原理是可以,但是实际操作效果不佳。
方案二 采用FIFO芯片作为外部高速数据缓存芯片。
IDT7205是单向异步FIFO的典型芯片,由IDT公司生产的,是一种高速、低功耗的先进先出双端口存储缓冲器。这种FIFO芯片内部的双端口RAM具有2套数据线,分别执行输入和输出功能,各自独立的写读指针分别在写、读时钟的控制下顺序地从RAM中写、读数据。
综合上述方案,选择方案二,它无地址线,布线简单,只能是顺序存取。
系统理论分析与计算
2.1快速傅里叶变换(FFT)
DFT(离散傅里叶变换)是数字信号分析与处理中的一种重要变换,它可以使数字信号处理可以在频域内采用数值运算的方法进行,大大增加了数字信号处理的灵活性,但直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大,所以在快速傅里叶变换(FFT)出现以前,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。
DFT的定义:设 是一个长度为N的有限长序列,定义 的N点离散傅里叶变换为
能提高DFT速度的唯一可利用的是因子 。 称为旋转因子,可表示为
利用 的周期性和对称性可把DFT的计算次数大大减小。
DFT分解法基本上分为两类:一类是将时间序列X(n) (n 为时间标号)进行逐次分解,由此得到的FFT算法称为按时间抽取算法,另一类是将傅里叶交换序列X(k) ( k为频率标号)进行分解,叫做按频率抽取算法。对每一算法,按基本的蝶形运算的构成又可分为基2、基4、基8以及任意因子等的FFT算法。不同基的FFT算法所需的计算量略有差异。之所以说略有差异是指并无数量级上的差异,甚至无成倍的差别。只是某种基的算法比另一种省几分之几而已。
而本方案采用的就是ST公司官方固件库里DSP库中已经写好的关于FFT的库函数,调用的是基4复数序列1024个点的FFT函数库。
之后某点n用复数,
的最大转换速率只有20MHz,根据采样定理,采样率,(其中 Fs为采样速率,Fh为被采样信号的最大上限频率),才能有效地避免频谱混叠现象。因此输入的被采样信号的上限频率不得高于10MHz。因此本次方案选定的采样频率为15MHz,即被采样信号的上限频率不得高于7.5MHz。
为FFT的长度。我们这里N只做了1024个点的,因此对输入的被采样信号最小频率分辨度为,由于FFT之后就可以计算出信号的幅度谱,将幅度谱平方得到功率谱。
转换芯片的输入信号范围为15KHz~7.5MHz之间了.
IDT7205简介:
&IDT7205是8位的FIFO芯片,容量为8192*9bit,存储时间为12ns,有空、半满、满三个标志位。最大功耗为660mW,工作电压为+5V。D0~8是数据输入总线,Q0~8是数据输出总线,R 、W 是读、写控制端,XI 、 XO是级联控制端,HF 是FIFO状态满标志,FF 是FIFO状态空标志。根据HF 、FF 状态,写处理器就可以知道FIFO是否已满,根据状态读处理器就可以知道是否有数据
&IDT7205提供一个比特位由用户选择用于控制或者奇偶效验的,同时提供重传(RT )功能。它使用内部指针载入和取出数据,数据的输入和读出是由写(W )和读(R )控制。该器件使用满标志(FF )和空标志(EF )以防止数据的上溢和下溢,半满标志(HF )用于通信控制。(RS )是用于复位。通过它的扩展逻辑可以进行无限制的深度和宽度扩展,这样就可以方便地扩展适于总线读写操作的各种容量的16或32位的数据存储缓存区。
&&& IDT7205是单向异步FIFO的典型芯片。是一种高速、低功耗的先进先出的双端口存储缓冲器。基本时序及功能逻辑为:RS 引脚置低时,IDT7205复位。内部读写指针都被复位到起始位置了,每一次上电后必须要将RS 置为低电平后方可执行写入操作。当RS 复位后R 和 W必须为高,直到 RS变为高电平后才能有所变化,进行读写操作。若数据满标志FF 没有变低,那么每次W 引脚置低,就执行一次外部数据写入操作,内部写指针自动加1,数据顺次进入FIFO中。当缓存区写满一半(4KB)的时候,下一次 W低电平将使半满XO/HF中间指示 置低,表示缓冲区间已存满一半的可用空间,该信号可以提前提醒系统机进行读数据操作。为了避免数据写入溢出,当最后一个W 的下降沿时,内部满标志FF 置低,它将禁止写入操作,FF 有效期间,内部写指针不再移动,直到进行一次有效的读操作后满标志FF 才会被消除。若内部空标志 EF没有被置低,那么每当读允许R 置低时,就执行一次内部数据的读出,内部读指针自动加1,数据就顺次从FIFO中读出来。为了避免数据空读,当所有数据被读出的,内部空标志EF 被置低,将禁止读出操作,EF 有效期间,内部读指针不再移动,读出数据总线为高阻抗状态,直到进行一次有效的写操作后,空标志EF 才会被消除,IDT7205的RT/FL 是一个复用输入脚,在深度扩展时有用,在单片使用时,它作为一个重传数据引脚,负脉冲有效。一个重传操作将读指针回到首地址,不影响写指针地址。
&&& 从图2.4.2可以看出,IDT7205的有效数据都在读写时钟的上升沿到来时有效,然而从图2.3.2& TLC5510A的时序图看出,有效数据在时钟的下降沿到来时有效,因此在进行时钟同步的时候,要对IDT7205的写时钟要进行一次反相才可以。本系统采用与非门74LS00做为反相器。如图2.4.3所示,我们可以算出此与非门的保守最高工作频率为:
因此,74LS00可以应用到本系统中。
3.1.2 A/D转换模块原理图
&&& A/D转换使用的是TI公司生产的8位精度的并行AD转换器TLC5510A。其电路原理图如图3.1.2所示
3.1.4 时钟振荡模块原理图
&&& 时钟振荡芯片所提供的采样时钟信号选用Linear公司生产的LTC1799提供。其电路原理图如图3.1.3所示
LTC1799的典型应用如图3.1.4所示。&
1脚接电源,2脚接地,3脚与电源直接电阻 ,可通过调节 来调节输出的频率,4脚为DIV脚,选择分频系数,5脚为输出。
3.1.5高速缓存模块原理图
&&&& 本系统高速缓存芯片选用IDT司生产的IDT7205,其存储深度可以达到8KB。其电路原理图如图3.1.5所示
3.1.6液晶显示模块原理图
本系统液晶模块采用无字库LCD12864来显示,其电路原理图如图3.1.6所示。&
&在数字信号处理最重要的就是要验证数据的准确性和有效性,因此就要用MATLAB软件仿真来做数据对比,以判断STM32F4的计算结果是否准确。
在测试过程中,我们使用被白噪声污染过的信号经过离散化后的数组,在MATLAB上做1024个点FFT处理之后所得的数据图形,如下图所示。经和STM32F4处理后的数据比对发现完全一致。
下图为同一信号256与1024点FFT之后数据的对比:
由于处理的数据都是浮点型,而且所得到的数据的动态范围比较大,因此就会涉及小数点的移动显示的问题,传统对小数点的显示采用的是定点显示,即固定小数点在液晶显示屏的位置来显示数值,一旦遇到数量级跨度很的数值时,很浪费液晶显示占用的空间,因此本系统通过算法实现浮点显示,即占用固定的显示空间,小数点随数值大小浮动显示。
在IAR编译器里编程的时候有几点问题要值得注意:
&&&&&&& 1.编译优化等级的问题
&&& 在内存空间充足的情况,最好不要对程序进行优化,很可能让程序运行出现问题。优化等级选为None即可。
&&&&&&& 2.程序路径添加以及预编宏定义的问题
在引用ST官方提供的库函数的.c文件时,只要是不在 文件所处位置下的.c文件都应该要在编译器选项里添加路径,
其中$PROJ_DIR$指的是带 文件所处位置。
$PROJ_DIR$\..\ 是指工程文件即 文件所处文件的上一个文件夹。
而$PROJ_DIR$\..\..\是指工程文件即 文件所处文件的上一个文件夹再上一层文件夹依此类推。
在使用FPU处理时首先要对FPU进行预编宏定义,这个在arm_math.h文件里提到了。
__FPU_PRESENT=1
__FPU_USED=1
注意不要预编宏定义里不要有空格出现,否则会出现编译错误。
&& 浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标准的算法来完成运算,对于8位单片机来说已经完全是噩梦,对32为单片机来说也不会有多大改善。虽然将浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。对于有FPU(浮点运算单元)的单片机或者CPU来说,浮点加法只是几条指令的事情。
&&& 现在又FPU或者硬件浮点运算能力的主要有高端DSP(比如TI F2/DM6XX/OMAP等),通用CPU(X87数学协处理器)和高级的ARM+DSP处理器等。
&&&&STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置:
&&&&&1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的STM32F4-Discovery例程中却没有,因此编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码:
)中的C/C++选项卡的Define中加入如下的语句:__FPU_PRESENT=1,__FPU_USED =1。这样编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。
头文件,那是没法提升效率的:因为math.h头文件是针对所有ARM处理器的,其运算函数都是基于定点CPU和标准算法(IEEE-754),并没有预见使用FPU的情况,需要很多指令和复杂的过程才能完成运算,也就增加了运算时间。因此要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h,这个文件根据编译控制项(__FPU_USED == 1)来决定是使用那一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
的开头部分是有这些编译控制信息:
的,就会调用keil自带的标准库函数。否则就用CMSIS的定义。这里因为是用的STM32F4,所以应该要ARM_MATH_CM4控制,即加入core_cm4.h,否则就用使用ARMCM4.h&&但在编译时keil会提示找不到这文件。因此需要在工程选项之C/C++选项卡的define中继续加入语句ARM_MATH_CM4。
、cos()、sqrt()这样的函数,那结果还算调用keil的math.h,你可以在debug时看对应的代码,其汇编指令为BL.W __hardfp_xxx。因此这时要完成三角函数的计算就要使用arm_sin_f32()或者arm_cos_f32(),用法不变,这两个函数的原型分别在arm_sin_f32.c和arm_cos_f32.c中。通过对256点三角函数表的查询和插值算法得到任意角度的精确函数值,这就比&原装&的sin()、cos()快多了。
,在arm_math.h中是这么定义的:
,其中首先判断被开发的书是否大于0,只有大于0的才能进行运算,否则输出结果为0并返回&错误&标志。如果大于0,并且实用了FPU和__CC_ARM控制项,那调用__sqrtf()来完成编译,否则调用sqrtf()&&这个sqrtf()是能在keil的math.h中找到的,即调用子函数来完成运算,而__sqrtf()呢?新出现的,相信大家都能猜到是什么玩意儿:对,就是VSQRT指令!因此要把这点性能也要发挥出来,就需要工程选项之C/C++选项卡的define中继续加入语句__CC_ARM才行。大家可以比较一下是否加入__CC_ARM编译后会汇编代码的差别巨大差别。
函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。
17227 观看
16149 观看
Tel: 3-8064
备案号: 苏ICP备号-2图4 同步Slave FIFO写序列
图5 同步ZLP写循环时序 同步Slave FIFO读序列描述 执行来自同步Slave FIFO接口的写序列如下: 1. FIFO地址稳定且SLCS#信号有效。 2. 外部主/外围输出数据到数据总线上。 3. SLWR#有效。 4. 当SLWR#有效,数据在PCLK的上升沿写到FIFO中,FIFO指针增长。 5. 在来自时钟上升沿的tCFLG延时后FIFO标志更新。 突发模式同样如此。 注:对于突发模式,在整个突发写模式期间,SLWR#和SLCS#保持有效。在突发写模式内,当SLWR#有效后,在每个PCLK的上升沿,数据总线上的值被写如FIFO。在PCLK的上升沿,FIFO指针增加。 短包:通过使用PKTEND#信号,短包能被传递到USB主机中。外部设备和处理器应该被设计来宣布PKTEND#信号随着最后一个字节的数据和SLWR#信号脉冲对应的最后一个字节。在PKTEND#有效期间,FIFOADDR线必须保持恒定。在PKTEND#和SLWR#有效期间,GPIF II状态机解释包为短包并将其传送到USB接口。如果协议不需要任何短包传送,PKTEND#信号可能被拉高。 注:在读方向中,没有特别的信号表明一个短包来自USB。为了决定何时所以的数据被读取,空的FLAG标志必须被外部主机监控。 零长度包:通过宣布PKTEND#有效,外部设备或处理器能发出一个ZLP信号,无需SLWR#信号。SLCS#和地址必须按照图5中被驱动。 标志使用:对于流控制,标志信号被外部处理器监控。标志信号是来自EZ-USB FX3的输出,对于一个专门线程或正在被寻址的当前线程,EZ-USB FX3可以被配置成空/满/局部状态。
表3 同步Slave FIFO时间参数 截止目前,该应用笔记已经描述了Slave FIFO接口的固件细节,包括引脚映射和接口时序。下面的部分描述能用GPIF II设计器和EZ-USB FX3 SDK完成的FLAG信号的配置。 进程和套接字 该部分简明扼要的解释了进程和套接字的概念,这对理解如何配置FLAGs很重要。 EZ-USB FX3 FIFOs和套接字相关联。GPIF II部分的套接字和USB接口的端点相似。 对于GPIF II上的数据传输,EZ-USB FX3提供四个物理固件进程。每一次,任何一个套接字被映射到一个物理进程中。缺省情况下,PIB套接字0被映射到进程0,PIB套接字1被映射到进程1,PIB套接字2被映射到进程2,PIB套接字3被映射到进程3。 注意,接口中的地址信号A1:A0表明被访问的进程。FX3的DMA组织将数据路由到映射至进程的套接字。因此,当A1:A0=0时,进程0被访问,任何通过进程0传输的数据被路由至套接字0,同理,当A1:A0=1时,数据由套接字1输入输出。 注意:该应用笔记中描述的Slave FIFO接口只有两位地址线,因此最多只有四个套接字被访问。 当访问超过四个套接字时,应该使用拥有五位地址线的Slave FIFO接口。可以参考应用笔记“AN68829-Slave FIFO Interface EZ-USB FX3:5-Bit Address Mode”。 指定的套接字访问必须配置一个DMA通道。 DMA通道配置
固件必须配置必要的生产者消费者DMA通道。 注意,如果数据从Slave FIFO接口传递到USB接口时,P-port是生产者,USB是消费者,反之亦然。 如果数据在Slave FIFO接口的两个方向传输,应该配置两个DMA通道,一个P-port作为生产者,另一个作为消费者。 P-port生产者套接字时外部设备写数据到Slave FIFO接口,同理消费者套接字时外部设备从Slave FIFO读数据。 注意,DMA通道中的P-port套接字号应该是A1:A0上被编址的套接字号。 当配置通道时,多个输入缓冲区可以被分配到一个特别的DMA通道。注意,FLAGs将表明每个缓冲区上的空/满。(每个缓冲区的最大缓存空间是64KB) 例如,两个1024字节的缓冲区被分配到一个DMA通道中,当1024字节已经被写入第一个缓冲区时,满FLAG将表明满。在DMA通道装换到第二个缓存区前,满标志不变。DMA通道转换到下一个缓冲区所话费的时间不确定,虽然只是几毫秒。外部的主控必须监控FLAG来决定何时装换完成,下一个缓存可以进行数据访问。 下面的部分描述如何配置FLAG来表明不同的进程状态。 标志配置 标志位可以被配置成空,满,局部空,局部满信号。这些不是由GPIF II状态机控制的,而是由EZ-USB FX3的内部DMA硬件控制。标志位和特定的进程或当前被编址的进程有关,因而,表明了映射到进程的套接字的状态。 标志的空与满取决于套接字的方向(套接字初始化时配置)。因此,如果数据正在被从套接字中读出时,标志位表明空或不空;数据写入套接字时,指明满或不满。 能被使用的不同类型的套接字: 1. 专用线程标志(空/满或局部空/满) 2. 当前线程标志(空/满或局部空/满) 这些不同类型的标志在下面有所介绍。不同的FLAG配置导致不同的延时,表4中有所总结。 专用线程标志 一个标志能够被配置用以表明特定的线程状态。在这种情况下,只有对于那些进程以及表明映射至特定进程的套接字,标志是专用的。不考虑进程被在地址总线上编址。 在这种情况下,外部处理器或设备必须保持专用线程的标志位状态并在每一次进程被编址时,监控正确的标志位。 例如,如果FLAGA是进程0的专用标志,FLAGB是进程1的专用标志,当外部处理器执行访问进程0的操作时,必须监控FLAGA;执行进程1操作时,监控FLAGB。 对于每一个即将被访问的进程而言,标志位可能是专用的。如果应用软件需要四个访问进程,则有相应的四个标志。 注意,当执行写转换时,在转换的末尾,标志位经常出现3个周期的延时。3个周期的延时来自写周期,起因于缓存变满,标志位边低的时刻。在第四个时钟边缘,外部主机采样低标志。这在表4中有所说明。 当执行读操作时,在每次转换的末端,两个周期的延时发生。两个时钟周期的延时来自引起缓存空标志位变低时刻的读循环。在第三个时钟边缘,外部主机采样标志低信号,表3中有所说明。 当前进程标志 配置标志来表明当前被寻址的进程状态。在这种情况下,GPIF II状态机采样地址总线上的地址,更新标志来表明进程状态。这种配置需要更少的引脚,因为一个单个的“当前进程”标志能被用来表明四个进程的状态。然而,当当前进程标志被拥有同步Slave FIFO接口时,两个时钟周期的延时发生,因为GPIF II首先必须采样地址,然后更新标志。当一个有效的地址出现在接口上时,两个时钟周期开始发生。在这之后的第三个时钟边缘,新编址的进程的有效的FLAG状态被采样。(注:Slave FIFO描述符包括在使用“当前进程”标志配置SDK中)
图6 当使用当前进程标志时,传输开始,额外的延时发生 局部标志 配置标志位以表明套接字的局部空满状态。必须选择一个水印值,当读或写的字小于或等于32位时,标志有效。 注意,局部标志的延时取决于局部标志规定的水印值。 下面的表总结了当使用不同标志配置时发生的延迟。表4也展示了对于一个特定的FLAG设置,GPIF II设计器必须选择。对于FLAGs,在标志配置部分能发现GPIF II设计器设置的例子和截图。

我要回帖

更多关于 fifo 读取数据 的文章

 

随机推荐