[基础知识] 造一台软DAC

[复制链接] 查看: 188334|回复: 525

9

主题

0

好友

1190

积分
     

侠之大者 当前离线

Rank: 6Rank: 6

UID
34960
帖子
4462
精华
0
经验
1190 点
金钱
1214 ¥
注册时间
2008-1-30
发表于 2010-4-27 18:37 | 显示全部楼层
顶  啥时出套件啊?  让我们也享受一下 LZ的智惠结晶

96

主题

12

好友

3705

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
1077
帖子
3315
精华
6
经验
3705 点
金钱
2485 ¥
注册时间
2004-7-24

社区贡献

 楼主| 发表于 2010-4-28 22:59 | 显示全部楼层
今天继续更新谈谈FPGA的设计
  FPGA无疑是sDAC的主角,数字电路的功能基本都在其中实现,所以FPGA的coding也占了工作量的一大部分。sDAC有三个时钟域,分别是DIR9001输入时钟MCK,DDS时钟,控制用时钟,因此sDAC涉及到跨时钟域的设计,FPGA与ASIC不同之处就在于FPGA必须遵循同步设计原则,因此异步的三个时钟会造成潜在的问题,解决办法之一是MCK和DDS时钟使用FIFO缓冲,另一个是控制时钟域和另外两个时钟域的数据传输进行同步化处理。sDAC的FIFO设计为2BIT位宽,深度在频偏200PPM的时候也能保证几分钟内不破。左对齐的音频数据在进入FPGA后,先入FIFO缓冲,FIFO出来的数据进行串并转换操作,无论是16BIT的CD音频还是24BIT的都按24BIT的位宽进行信号处理。信号处理之后的数字音频再做并串转换成PCM1794能接受的方式,送给D/A。其中信号处理和并串转换都在DDS时钟域进行的。
  控制时钟域主要是负责如DDS的配置,软锁的鉴相算法和滤波算法以及其他控制用的状态机跳转和按钮、和单片机之间的总线时序的操作等杂七杂八的事情。如果没有控制时钟,光靠其他两个时钟是玩不转的。
  全部的FPGA逻辑和仿真测试代码都用Verilog做的,RTL级,其中用了一部分的IP CORE,IP CORE和其他自己写的代码都是通过Verilog接口。很多人喜欢原理图和HDL语言混着来,虽然原理图在顶层做结构描述更直观,但是行业里一般还是单纯用HDL语言的还是主流,因为即使换了别的牌子的FPGA,只需要修改IP相关部分的代码,不用推倒重来了。可综合代码就在QUARTUS8.0下综合和布线。ALTERA提供的设计工具应该是FPGA厂家里最出色的,综合工具效能也是不错的。
  除了可综合代码,FPGA另一个比较麻烦的是要写所谓的测试台代码(testbench),sDAC的代码有一半是可综合代码,另一半全是测试台代码,有一些小的简单的module不用,但是主要的module都是要编写testbencn的。仿真在MODELSIM6.0下做,这是MENTOR公司另一个强悍的工具,很棒。
(未完待续)

18

主题

2

好友

250

积分

业余侠客 当前离线

Rank: 4

UID
6386
帖子
206
精华
0
经验
250 点
金钱
135 ¥
注册时间
2005-11-18
发表于 2010-4-28 23:59 | 显示全部楼层
太牛了!专业!

10

主题

1

好友

225

积分
     

业余侠客 当前离线

Rank: 4

UID
150675
帖子
939
精华
0
经验
225 点
金钱
222 ¥
注册时间
2009-11-28
发表于 2010-4-29 02:05 | 显示全部楼层
太有才了!

1

主题

1

好友

572

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
27691
帖子
437
精华
2
经验
572 点
金钱
483 ¥
注册时间
2007-9-25
发表于 2010-4-29 02:43 | 显示全部楼层
今天继续更新谈谈FPGA的设计
  FPGA无疑是sDAC的主角,数字电路的功能基本都在其中实现,所以FPGA的coding也占了工作量的一大部分。sDAC有三个时钟域,分别是DIR9001输入时钟MCK,DDS时钟,控制用时钟,因此sDAC涉及 ...
laurel 发表于 2010-4-28 22:59


嗯,好像你的FPGA不需要跑得很快。实现一个500阶的FIR做16x过取样,如果一次到位的话,生成每个输出样本只需要做501/16=31.3125次乘法,如果能做单周期MAC的话,需要31.3125*16*44100=22.0941MHz的主频。22.5792MHz的主频刚好够用。

很多成品DF的内部是用多个阶数较少的FIR串联起来,除了可以方便地选择过取样倍数,好像整体逻辑也可以跑得更慢,可以谈一谈这种实现与“一步到位”在设计上有什么异同吗?

96

主题

12

好友

3705

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
1077
帖子
3315
精华
6
经验
3705 点
金钱
2485 ¥
注册时间
2004-7-24

社区贡献

 楼主| 发表于 2010-4-29 20:37 | 显示全部楼层
嗯,好像你的FPGA不需要跑得很快。实现一个500阶的FIR做16x过取样,如果一次到位的话,生成每个输出样本只需要做501/16=31.3125次乘法,如果能做单周期MAC的话,需要31.3125*16*44100=22.0941MHz的主频。22.5792 ...
simmconn 发表于 2010-4-29 02:43

FPGA和DSP或者CPU不同,后两者提MAC,或者MAC的速度。FPGA内部不管是LE做的还是硬件乘法器做的乘累加运算都可以一个时钟周期内完成。实际滤波器里使用了多个硬件乘法器,以面积换速度,这才是FPGA的优势。
成品DF芯片好像内插率是固定的,没法随意选。因此我认为与其做短的几个滤波器还不如做一个长的,越长,越接近infinite。

7

主题

0

好友

666

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
5178
帖子
619
精华
0
经验
666 点
金钱
604 ¥
注册时间
2005-8-9

社区贡献 优秀设计 论坛贵宾 乐于助人

发表于 2010-4-29 20:39 | 显示全部楼层
嗯,好像你的FPGA不需要跑得很快。实现一个500阶的FIR做16x过取样,如果一次到位的话,生成每个输出样本只需要做501/16=31.3125次乘法,如果能做单周期MAC的话,需要31.3125*16*44100=22.0941MHz的主频。22.5792 ...
simmconn 发表于 2010-4-29 02:43


大家都是用专用DA算法,因为事实上假定我们需要做32bit 400阶的FIR LPF,FPGA根本没有那么多32bit乘法器,传统的算法不行,所以大家都用特殊算法,这其中大多数是非常保密的[细节差距,理论都差不多],因为这是影响性能关键。

事实上我们之前用ADSP-21369做实验,一个280阶的24bit滤波器,运算精度32bit浮点,最后由1-2dB的THD+n 劣化,不同算法和精度对THD+n影响巨大,如果需要做到140dB THD+n而不致使信号劣化,没有双精度64bit不可能,事实上在双精度80bit时候,勉强才做到了THD+n -139dB 最差情况。而同样的FPGA版本我们需要用到Lattice ECP2M这个级别才行。 [我们直接对I2S分析仪进行测试]

这个问题事实上也困扰过我,因为客户对成本要求使得我们不可能使用V5或者TS201这种超级FPGA或者DSP。Altera 在音频领域应用就可以说渣一点不含糊··· 巨烂的数学运算 - 相对xilinx ,IO/PLL更烂 - 相对Lattice···· 还记得文烨在I2C展会时候用Tek DSO8K 展示cyclone iii的眼图,直接让人笑话死,还记得中兴测试时候的笑话,Stratix III 焊接到板子上以后,你知道把电路板180倒转,芯片直接掉下来了,因为发热融化了焊球····虽然大陆学校都是学习Altera,包括我这里的工程师,但是事实上高性能需求时候我们早放弃了Altera,现在都是Xilinx和Lattice天下,Lattice因为很多人不会用所以普及还不高,不过Lattice用好了性能非常棒,缺点就是没有Xilinx那么多的IP Core,都需要自己写。

FIFO技术难点是kHz根本不能被FPGA的IO口接受,这个第一步转换这就造成了第一次信号劣化,呵呵,当然还包括专用Word Clock的处理。这就是每家公司都有自己的杀手锏了,属于比较高级别商业机密。事实上dCS 或者Prism 或者Lavry都用了不同方案做这一步。

···说了对废话···事实上除非使用超级FPGA[DSP没有IO性能,所以其实还是需要一个IO性能好的FPGA配合,其实还不如用一个高性能音频DIR/DIT,因为自己做并不一定100%比专用芯片好,FPGA不是万能的],否则没法一步到位,因为低成本的一步到位往往换来了性能劣化。这是发烧友往往忽略的,因为仪器不足或者想当然。

最后··对Laurel表示敬佩,的确是几个人干的事情让你一个都干了,恭喜,祝你越做越好 嘎嘎

96

主题

12

好友

3705

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
1077
帖子
3315
精华
6
经验
3705 点
金钱
2485 ¥
注册时间
2004-7-24

社区贡献

 楼主| 发表于 2010-4-29 21:00 | 显示全部楼层
大家都是用专用DA算法,因为事实上假定我们需要做32bit 400阶的FIR LPF,FPGA根本没有那么多32bit乘法器,传统的算法不行,所以大家都用特殊算法,这其中大多数是非常保密的[细节差距,理论都差不多],因为这是影 ...
HerculesVR 发表于 2010-4-29 20:39

吧HerculesVR老大给引出来了,谢谢你的支持!
32BIT的运算精度是远远不够的,从仿真的结果就看的出,不过80BIT用低成本FPGA做也不太现实,除非用一些有大量硬件乘法器的高端FPGA。
恰好你提到的大多数芯片我都接触过,如TS201,TS101之类,这些片子基本是给雷达之类的东西用的,用在音频上就不够现实了。LATTICE的ECP3,ECP2M;XILINX的V5也有用,做高速SERDES的数据传输用,ECP2M和ECP3眼图说实话比XILINX的V5还是要差不少。LATTICE的最大优势是便宜,最大问题在于其开发环境巨烂无比,相对于ALTERA的难以忍受。不过马上要出新的IDE了希望UI有所改进。STRATIX3在07年底就用过,800多个硬件乘法器的那款,ES的片子还有BUG,不过东西还是很强悍。ZTE当时好像也拿到了。不过就ALTERA来说S3这个系列相对V5并不成功。
“FIFO技术难点是kHz根本不能被FPGA的IO口接受”这个我没明白是什么意思?

0

主题

0

好友

299

积分

业余侠客 当前离线

Rank: 4

UID
51213
帖子
290
精华
0
经验
299 点
金钱
299 ¥
注册时间
2008-8-18
发表于 2010-4-30 17:11 | 显示全部楼层
在数字解码和数字哉数字处理时,对时钟的精度不是要求很高,对DAC转换(FPGA后段如果采用I2S格式话,BCLK,LRCLK,SDA相位上要精确的对位,及PCM1794的MCLK)要低JITTER的时钟,不知理解对否?

5

主题

2

好友

946

积分
     

职业侠客 当前离线

Rank: 5Rank: 5

UID
156799
帖子
945
精华
0
经验
946 点
金钱
935 ¥
注册时间
2009-12-19

社区贡献 乐于助人

发表于 2010-4-30 20:25 | 显示全部楼层
DDS好贵啊。
LZ,对比过FPGA的PLL和数字锁相环的时钟质量吗?

1

主题

1

好友

572

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
27691
帖子
437
精华
2
经验
572 点
金钱
483 ¥
注册时间
2007-9-25
发表于 2010-5-1 02:52 | 显示全部楼层
FPGA和DSP或者CPU不同,后两者提MAC,或者MAC的速度。FPGA内部不管是LE做的还是硬件乘法器做的乘累加运算都可以一个时钟周期内完成。实际滤波器里使用了多个硬件乘法器,以面积换速度,这才是FPGA的优势。
成品DF ...
laurel 发表于 2010-4-29 20:37

在这样的频率下好像还不需要以面积换速度吧。用两个18x18的乘法器并行做成36x36的乘法器是不得不做的(精度的需要),左右声道分别用乘法器并行运算也无可厚非,除此之外还需要再提高并行度吗?

1

主题

1

好友

572

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
27691
帖子
437
精华
2
经验
572 点
金钱
483 ¥
注册时间
2007-9-25
发表于 2010-5-1 14:35 | 显示全部楼层
吧HerculesVR老大给引出来了,谢谢你的支持!
32BIT的运算精度是远远不够的,从仿真的结果就看的出,不过80BIT用低成本FPGA做也不太现实,除非用一些有大量硬件乘法器的高端FPGA。
恰好你提到的大多数芯片我都接 ...
laurel 发表于 2010-4-29 21:00


老大可能以为你连S/PDIF解码都是在FPGA里做的,所以才出此言。
其实用FPGA做S/PDIF解码没什么不可以,而且可以很简单。如果我没记错的话,OpenCore上面的S/PDIF解码IP才用了一个72 cell CPLD里面的40个cell,不包括时钟恢复功能。不过这样简单的IP用在LZ的系统上正合适,本来时钟伺服的更新速度就很慢,索性只用FIFO水位做控制输入算了。

泼一点冷水,我觉得你的500阶滤波器的衰减特性好像还没有一些成品DF优化得好。

56

主题

12

好友

6091

积分
     

青铜剑侠 当前离线

小熊猫

Rank: 8Rank: 8

UID
59487
帖子
7499
精华
0
经验
6091 点
金钱
5748 ¥
注册时间
2008-10-20
发表于 2010-5-1 21:06 | 显示全部楼层
这几天看了下MATLAB的书,好象没有讲到深度(bit)转换的......难道我需要用浮点乘除么?

7

主题

0

好友

666

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
5178
帖子
619
精华
0
经验
666 点
金钱
604 ¥
注册时间
2005-8-9

社区贡献 优秀设计 论坛贵宾 乐于助人

发表于 2010-5-2 00:35 | 显示全部楼层
首先请别叫老大,我是正宗小弟,不含糊。

“FIFO技术难点是kHz根本不能被FPGA的IO口接受”这个我没明白是什么意思?

simmconn 说的是··我想你直接把S/PDIF DIR用FPGA搞定的,因为FPGA无法直接接受这么低频率的信号同时还做处理,当然简单DIR可以时间,PLL+FIFO 的DIR需要一些特殊方式。

乘法器并行后又带来了GD问题,而且除非用超级FPGA否则的确难以把几个参数处理好,事实上我个人认为还是DSP做这个会精度更好,考量价格等综合因素。正如上文所以,用传统方法得用什么FPGA能做完美达成32bit 的500阶滤波器呀,呵呵

我这边500阶可以做到  -160dB带外衰减,至少。GD不确定,应该在60/fs内。

7

主题

0

好友

666

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
5178
帖子
619
精华
0
经验
666 点
金钱
604 ¥
注册时间
2005-8-9

社区贡献 优秀设计 论坛贵宾 乐于助人

发表于 2010-5-2 00:48 | 显示全部楼层
这几天看了下MATLAB的书,好象没有讲到深度(bit)转换的......难道我需要用浮点乘除么?
卡西利亚斯 发表于 2010-5-1 21:06


低bit变成高bit[比如16bit -> 24bit ] Noise Shaping

  • 高bit变成低bit[比如24bit -> 16bit ] Dithering

    其实两者都属于噪音整形。一个重要问题是 16bit就算变成24bit 也达不到24bit的性能了,有兴趣你可以看看关于TPDF Dither 的资料。
  • 事实上为了性能需要应用NS来弥补不足的动态,比如一个24bit的ADC,实际精度只有120dB动态,但是我们需要144dB动态,那就牺牲高频特性来做噪音整形,来达到需要的低频频段144dB动态,通常这些技术都是用在仪器级设备,即使是专业产品少见。

    通常数字之极限性能[以下数据是Prism Sound 的设备在1992年达到的高度··· ···]
    16bit THD+n 0.0021% [-93.4dB]
    20bit THD+n 0.00013% [-117.5dB]
    24bit THD+n 0.0000083% [-141.6dB]

    你提到了一个重要问题,音频的核心算法没有哪家公司愿意公开,所以这是一个难以越过的瓶颈,大多理论我们都懂,但是就是做不出来那么高性能东西。不是随便翻翻书就能找到,如果那样,dCS Weiss MSB Prism 也就值不了那么贵了,呵呵。
  • 1

    主题

    1

    好友

    572

    积分

    职业侠客 当前离线

    Rank: 5Rank: 5

    UID
    27691
    帖子
    437
    精华
    2
    经验
    572 点
    金钱
    483 ¥
    注册时间
    2007-9-25
    发表于 2010-5-2 02:50 | 显示全部楼层
    首先请别叫老大,我是正宗小弟,不含糊。

    “FIFO技术难点是kHz根本不能被FPGA的IO口接受”这个我没明白是什么意思?

    simmconn 说的是··我想你直接把S/PDIF DIR用FPGA搞定的,因为FPGA无法直接接受这么低频率 ...
    HerculesVR 发表于 2010-5-2 00:35


    我们在这里讨论的是FIR用作过取样DF的情况,做n倍的过取样就意味着每个有效的原始数据后面跟着n-1个零,是不需要计算的。
    500阶的FIR有501个tap,如果做16x过取样的话,计算每个结果只需要501/16=31.3125次乘法,并不需要做501次乘法。
    另外GD也不会不确定呀,每个结果需要前15.65525个和后15.65525个原始数据。除去overhead,总的GD就不大于32/fs。

    我的想法如果有错还请两位高手指正。

    1

    主题

    1

    好友

    572

    积分

    职业侠客 当前离线

    Rank: 5Rank: 5

    UID
    27691
    帖子
    437
    精华
    2
    经验
    572 点
    金钱
    483 ¥
    注册时间
    2007-9-25
    发表于 2010-5-2 03:02 | 显示全部楼层
    你提到了一个重要问题,音频的核心算法没有哪家公司愿意公开,所以这是一个难以越过的瓶颈,大多理论我们都懂,但是就是做不出来那么高性能东西。不是随便翻翻书就能找到,如果那样,dCS Weiss MSB Prism 也就值不了那么贵了,呵呵。
    HerculesVR 发表于 2010-5-2 00:48


    我觉得不是核心算法的问题,而是具体实现的问题。有很多paper里面介绍的算法性能已经足够优秀了,关键是在产品化的过程中如何用有限的成本来实现这些高性能的算法。我相信你能做出高性能的东西,但你的实现成本可能比对手产品的售价都贵,那就没有什么市场价值了。

    至于定价,我们在中学里都学过最终决定价格的是市场规律。你提到的这些公司把产品定那么高的价是因为有人愿意出那么高的价来买,而且愿意买的人数足够支撑他们的商业运作。如果这个平衡被打破,价格必然会发生波动。至于值不值,买得起的人就觉得值,呵呵。

    11

    主题

    0

    好友

    216

    积分

    业余侠客 当前离线

    菜鸟一个

    Rank: 4

    UID
    188037
    帖子
    493
    精华
    0
    经验
    216 点
    金钱
    214 ¥
    注册时间
    2010-4-3
    发表于 2010-5-2 09:57 | 显示全部楼层
    漂亮啊~~

    0

    主题

    0

    好友

    299

    积分

    业余侠客 当前离线

    Rank: 4

    UID
    51213
    帖子
    290
    精华
    0
    经验
    299 点
    金钱
    299 ¥
    注册时间
    2008-8-18
    发表于 2010-5-3 09:10 | 显示全部楼层
    218# simmconn


    如果在二个取样内,进行线性插值呢,要进行MAC吧,最简的方法把前一个取样作为内插的值构建出来,如16*,就按前取样构建15个前取值,频谱搬移的过程,如线性插值会改变原来的频谱。还有好多插值的方法都要用到MAC,就是从原来的信号序列中构建新的信号序列,只不过原来的取样点值保持不变而已。

    103

    主题

    5

    好友

    3009

    积分
         

    罗宾汉 当前离线

    Rank: 7Rank: 7Rank: 7

    UID
    4153
    帖子
    3096
    精华
    0
    经验
    3009 点
    金钱
    2527 ¥
    注册时间
    2005-5-8
    发表于 2010-5-3 12:45 | 显示全部楼层
    这个插个嘴,呵呵
    HerculesVR 和Simmconn用过业余的FFT分析软件吗?
    最近在用SpectraPLUS 5.0的30天试用版
    发现这东东还是蛮好用的


    123.JPG
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    Powered by Discuz! X3.4

    © 2001-2012 Comsenz Inc.

    返回顶部