tag 标签: dsp_builder

相关博文
  • 热度 16
    2013-8-6 10:11
    923 次阅读|
    0 个评论
    没个人带,自己单独做一个题目,是挻恼火的。而且自己基础又不好,有时候都有点后悔没有跟着做无线传感网。做什么气体传感器阵列嘛。看来是有点高看自己了,要自己单独去做一个方向。不过,都走到这一步了,也只能走下去了。感叹完了,下面还是总结一下这两天的工作吧。  这几天,一直都在看论文,关于怎么用FPGA实现神经网络算法。当然我的重点是,怎样用DSP Builder去实现。这其中,又分两种,在线学习和离线学习。在线学习的,能够实时进行学习,即FPGA实现的神经系统里,就能完成学习,训练,也充分利用了FPGA的并行运算能力。特别适合于需要实时学习且实时性要求高的系统。还有一种就是离线学习。即先在MATLAB里把神经网络训练好。然后把权值、阈值存储在系统里。第二种系统较为简单,适用于比较固定的不需要经更改权值、阈值的应用。 我做的气体检测系统,第二种方式就能满足要求,且为了节省时间和芯片资源,计划用第二种方式去实现。看过的论文里,基本上都是将权值、阈值存储在ROM或RAM里。但对ROM和RAM的提及很少。自己也没做相关方面的练习,所以我自己打算搭建一个不用ROM和RAM的方法。但感觉时序操作方面有点问题。所以下一步是找一些气体检测的原始数据,然后在MATLAB里有神经网络工具箱进行训练,得到网络参数。再根据这些参数来设计网络的结点数及其它参数。  
  • 热度 16
    2013-8-1 20:08
    1071 次阅读|
    2 个评论
    为了更熟练地掌握DSP Builder的设计技能。决定找几个相关的例子来做一下。今天,其实是昨天就把模型搭建好了,只是一直不出波形。先来看一下,我参照书上搭建的模型。 DDS的原理,我就不在这儿费话了。根据书上的提示,这个模型几分钟就搭建好了。当然这个只是DDS的一部分,由于开发板上没有D/A转换芯片,此实验只能实现NCO部分,在simulink里仿真。可是就这么一个简单的实验,我照着书做都做了两天才做出来。对软件不熟悉是很大的一原因吧。 首先是仿真后,没有在虚拟示波器上见波形。偶然间把仿真时间调整为100后(原来是5),见到波形了。原来是仿真时间不匹配。害得我调了这么久。 波形成功弄出来了。可是这个波形离我想要的正弦波相差甚远。 我又看了下,原理图,可能影响波形的参数主要有三个。(相位字设为0)一是频率字,频率字值越大,频率越高。相同的时间刻度上,可以显示的波形个数越多。为了清楚的看到波形,需要协同调整频率字和仿真时间。如果频率字一定,只能调整仿真时间。第二个参数是调幅字。调幅字按说只会影响波形的幅值,不会影响到波形的形状。但LUT输出与调幅字做了乘法运算。如果乘积超过乘法器的位数,则会溢出。输出波形就会变形。结果如下图。当产生溢出时,乘法器输出傎产生跳变,波形也就会产生跳变。 另外一个参数就是LUT的MATLAB ARRAY。1023*sin( )+1024,其中,10是LUT的深度。1023是其幅值,加上1024是为了保证输出为非负。其幅值过大,与前面的幅度字相乘后,就会产生溢出。LUT深度为6时,其波形如下: 由此看来,LUT的深度会影响输出波形的精度。 另一个影响输出波形精度的因素是D/A的精度,下面两图分别是D/A精度为16位和10位时的输出波形。它们的差别很明显。   参考书籍:《EDA技术与VHDL》潘松,清华大学出版社
  • 热度 19
    2012-12-21 16:20
    3020 次阅读|
    0 个评论
    刚开始接触 DSP_Builder 工具时可能会对 clock 模块有些疑惑。 Clock 模块如下图所示。 ,我来说一下我的疑惑,看大家是否有同感,把 clock 放在你要设计算法的 model 中,此外还有一个和 clock 差不多的东西,那就是 ,字面意思倒是好理解,“引出时钟”,这个翻译有些不专业,但意思差不多,那就是由原时钟引出的时钟,那这两个东西连管教都没有,到底怎么用呢? 首先要说明一点,这两个时钟对于我们综合后的代码来说只是提供了两个接口,而真正引出时钟的含义只是在我们仿真时才是有意义的。怎么理解呢? simulink 在仿真我们代码时需要一个统一的时间标准,这个时间标准就是我们的 Clock 模块,一个程序中标准只有一个,如果我们想设计多时钟程序怎么办,那就只能在原时钟基础上生成;而当我们生成可综合的代码时,这个引出时钟和原时钟就没有任何关系了,我们必须在外部通过逻辑代码或者 PLL 提供时钟信号,要保证和仿真时的频率关系和相位关系一致。 那这两个时钟连输出端口都没有,我们怎样使用呢?下面笔者给大家讲述一下 Altera 为什么要这么设计。 FPGA 设计时主张同步时序设计方法,先看一下同步时序的定义。 看到这个定义大家应该明白了吧,用一个 clock 模块是对应同一时钟,而是用 clock_derived 模块是对应多个时钟的情况。那还没有说端口的问题呢?其实这种设计是在帮我们省事,为什么那么说呢?当我们仔细观察各模块的参数就知道了,只有数据源模块才让我们填写参考时钟(如输入口( input )、计数器( counter )等),中间模块根本没有给我们设计参考时钟的机会,这种设计就使我们必须使用同步时序设计方法,且一条数据通道上仅使用一个时钟。 为了印证上述结论,笔者做了一个实验。 如上图所示, sysclk 周期为 20ns , clk 是 sysclk 的二分频, counter 的参考时钟是 sysclk , counter1 的参考时钟 clk 。下面是仿真结果。     由这两个图可知,笔者的结论是正确的, delay 模块的延时是延时的各部分时钟周期。 下面说说笔者为什么要进行这个实验,笔者之前设计了一个小波分解算法。当数据流按照奇偶性分离后,奇数据流和偶数据流的频率都为原频率的 1/2 ,并且需要执行一步计算,那就是当前奇数流数据和前一个奇数流数据求和。在没得到上述结论之前,笔者采用的办法是,把前一个奇数流数据延时 2 个时钟在和当前数据求和,这中方法可以得到正确的结果,但多用了一组逻辑单元,造成逻辑单元的浪费相当严重。
  • 热度 17
    2012-12-21 15:01
    2562 次阅读|
    0 个评论
    一个好的算法并不只是讲求功能的实现,功能的实现只是前提,而消耗更少的资源(更省钱)提供相同的功能才是王道。本文就给大家说一下笔者整理的一些省钱的方法。 1、     器件的选型。对于 Altera 公司的 FPGA , Cyclone II 系列 FPGA 内部 RAM 资源只有 M4K , Cyclone III 是 M9K ,更高端的芯片可能有 M512K ,或者几种规格的 RAM 块都有。那是不是越大越好呢?答案是否定的,相反, RAM 类型越高端,其资源使用率就会越低,试想,你使用 M512K 的 RAM 块,而你的程序根本用不大那么大资源,剩余的空间将全部浪费。所以在器件选型时,要综合考虑多方面因素。 2、     下面我们来看一个具体的例子,通过这个例子我们就能看出来我前两篇博文讲诉的内容有什么作用。先来看两个算法: ( 1 ) ( 2 ) 这两个算法在功能上实现的功能相同,都是把一个 8 位数据延时 516 个时钟单位,那我们就来对比一下资源消耗情况。对于算法( 1 ), 516*8=4128 bits 4096 bits ( 4K bits ),因此需要消耗两个 M4Ks ;再来看算法( 2 ),前面两个时钟延时由 delay 模块完成,消耗 16 个 LE ,再延时 514 个时钟,正好消耗 1 个 M4K 。下面两幅图是上述算法综合后资源消耗情况。     那有人会问,我能不能设计成下图的算法,然后通过优化选项让综合器自己决定,通过笔者试验,这种功能 Altera 还没做到。 对比算法( 1 )和算法( 2 ),我想我们之前的努力已经有所回报,我们少用了一个 M4K ,多用了几个 LE 就实现了所需的功能,何乐而不为呢!  
  • 热度 26
    2012-12-21 10:05
    4599 次阅读|
    0 个评论
        用过 DSP_Builder 工具的朋友一定用过 Delay 模块,这个可是算法设计中必须用到的东西,它能让你的数据延时几个时钟再出现,那么在这个模块同一个 Library 中你是否注意到还有一个 Memory Delay 模块。咋一看,这两个模块貌似是一样的,因为都有 Delay ,不过再一想,既然分开存放,那肯定又有所不同。下面,跟随着笔者带你看看究竟这里面藏着什么秘密。 首先,我们来看一个实验,这个实验如下图所示。     我们对这个算法进行编译,目的是查看这两个不同的 Delay 模块综合成了什么样的电路以及消耗的资源情况怎样。 对上图资源使用情况,我们只关心两个地方就足够了,一个是 Logic Cells ,一个是 M4Ks 。 Logic Cells 是 FPGA 内部的逻辑单元,我们生成电路主要靠的就是它了; M4Ks 是 Altera 低端 FPGA 配备的内部 RAM 资源, 4K 的意思就是它的容量是 4K bits (注意这儿单位是位)。由这里可以看出 Delay1 模块消耗了 8 个 Logic Cells , Memory Delay 也消耗了 8 个 Logic Cells 。忙活了半天,原来这两个模块消耗的资源是一样的,我们再来看一下综合的电路吧。 看了上图发现,这两个模块综合成的电路都是一样的。笔者坚信,这两个模块肯定有所不同,那能不能通过综合优化选项改变综合后的电路呢,笔者更改了 Analysis Synthesis Settings 下的 Optimization Technique 。 不论采用 Speed 、 Balanced 还是 Area ,效果都是一样的。笔者又试验了两个时钟单位的延时,两个模块综合出来还是完全一样。 功夫不负有心人,当我把延时值增加到 3 时,就出现了不同效果了。 下图是延时 3 个时钟时的资源消耗情况。 看到这个图,我们终于可以高兴一下了,因为我们找出了它们的不同, Delay1 消耗了 24 个 Logic Cells ,没有用到 M4Ks ;而 Memory Delay 消耗了 5 个 Logic Cells ,同时消耗了 1 个 M4Ks 。这里就好理解为什么叫 Memory Delay 了吧,因为它需要占用 FPGA 的 RAM 资源;而 Delay 模块不占用 RAM 资源,而是消耗 Logic Cells 资源,那究竟是不是这样呢,让我接下来一探究竟吧。既然资源消耗不同,那综合出的电路也不同了,这里感兴趣的朋友可以自己试验一下。 笔者还没有放弃,继续试验,试图彻底了解它们俩兄弟。笔者又进行了 4 时钟延时的试验,结果这次更复杂了,先看看 4 时钟延时的资源消耗情况吧。 对比上面两幅图,笔者惊讶的发现,我进行 4 个 Memory Delay 的延时,结果比进行 3 个 Memory Delay 的延时,消耗的资源还要少,这里确实有些复杂。当我们看 RAM Summary 时发现, 3 个延时时生成的 RAM 是双时钟的简单双口 RAM ,而 4 个延时时声称的 RAM 是单时钟的简单双口 RAM ,这就是答案所在,究竟 Altera 为什么要那么做,笔者也不清楚。 当我把延时值进一步加到 5 时,更为奇特的事情发生了,且听笔者慢慢道来。下图是我在用 Speed 模式优化综合器时生成电路的资源消耗情况。 Delay1 模块消耗了 40 个 Logic Cells ,这里好理解, 8 位输入输出,每个延时消耗 8 个 Logic Cells ,一共 40 个。但是, Memory Bits 为什么只有 24 bits ,按道理应该是 40 bits 才对啊。当我们观察生成的电路结构时会发现, M4K 每个块输入输出口都配备有一个 D 触发器,这个触发器可以选择使用不使用,而每个 D 触发器都相当于一个延时,这样就好理解为什么是 24 bits 了吧。 而当我们用 Balance 或者 Area 选项去优化综合器时,又出现了不同的效果,且看下图。 看到了吧, Delay1 消耗了 8 个 Logic Cells 和 16 bits M4K ,而 Memory Delay 消耗了 24 bits M4K ,貌似越来越复杂了。其实当我们看了综合成的电路后就感觉不到复杂了, Delay 在利用 Memory 延时之前先进行了 1 个延时,即 8 个 Logic Cells 用作了 1 个时钟的延时,究竟为什么这样,也只有 Altera 的工程师能说清楚了。 接下来,相信大家都会像笔者一样,有接着往下做实验的冲动。有兴趣大家可以多试验几种情况,在这里给出大家一个结论,当所设定的延时值 * 数据位宽小于逻辑单元数量时,综合出来的结论都和 5 个延时值时相同;而当延时值 * 数据位宽大于逻辑单元数量时,用 Speed 优化选项编译会报错,而用 Balance 或 Area 优化选项编译时正常。 通过上面的实验,我对我们已经对 Delay 和 Memory Delay 有个清楚的认识了,但我们找出这些区别并是不完全出于兴趣,下一篇博文将会进一步说明我们怎么利用这些不同设计自己的算法,以节省 FPGA 资源。