制作一款数字端口输入输出试验板
本帖最后由 ljpwed 于 2016-2-2 13:07 编辑平时经常测试各种DAC和数字端口,老是在各种板和机之间换来换去,感觉很麻烦,年底了就决定做一款全功能的测试平台!
整个PCB做得比较简单,当然这个只是一个炮灰板,后面会做个更完美的PCB!
1:带有USB输入。USB输入用的是意大利模块的ARM部分,而CDLP部分则用FPGA自己编写!IIS输出方面和官方模块完全一样,另外为了实验方便,还有一个SPDIF输出,SPDIF和IIS是同步输出,并支持DSD DOP同步输出,也就是说即使播放DSD,IIS和SPDIF也可以同时输出,非常方便! IIS支持的采样:PCM,44.1k-384K,DSD为DSD64-DSD512,而SPDIF PCM输出最大可达到384K(实际上可以实现768K和1536K输出,但是一方面是当前这么高的码率基本用不上,在者要输出1536K的话还要用到FPGA的PLL),DSD DOP则可以最大输出DSD128。为什么要输出384K呢,后面会说到!!用别人的东西虽然并不是我的风格,但是如果自己开发一个USB 解码并不是容易的事,硬件开发并不难,但是windows 驱动并不是我的在行的(虽然难搞一些比较简单的),在者国内驱动开发的资料少得要死,那些从入门到精通都他么的在扯蛋!
2:FPGA内部带有一个自行设计的SPDIF接收器。SPDIF最高可以接收PCM 384K,既然可以接收384K那么DSD128 DOP接收就不是问题了! SPDIP解码设计最重要的技术是CDR(时钟数据恢复),比如说在数据传输方面的光纤通信,硬盘SATA接口,USB接口等都是要用到这个技术。如果把传输速度的难道先不说,SPDIF解码以个人观点应该是比较其它的要难!原因在于SPDIF是一种变码率的信号,而且还有两种晶振模式(44.1 48),这样就把解码器变得更复杂! 板上用的是一片ALTEAR EP4的FPGA,其内部逻辑速度可以达到400M左右,达到400MHZ的速度是在简单逻辑上是可以实现的,时序也是能很好的满足的,如果放在复杂的逻辑运算中,那基本不太可能!SPDIF接收器基本上是一种复杂的逻辑,本板的SPDIF接收器主时钟运行在250MHZ左右!这个频率在FPGA复杂的运算中可以说是非常高了(以和EP4 相同种类的FPGA来说),为了满足时序要求,我也是花了不少心思做时序优化!用FPGA做SPDIF解码难度大,原因在于FPGA的速度问题,如果要像AK4118等这样的芯片那样接收,那么FPGA的逻辑速度至少也要GHZ以上的,但那种FPGA成本太高了,虽然EP4的PLL输出可以达到1.3GHZ,不过逻辑速度就差远了,所以要样解码SPDIF那么就要双晶振模式,使用双晶振模式相对AK4118这种单晶振模式(IIS输出是用内部高速PLL分频)输出的IIS精度要高一些(其实也差不了多少,如果用示波器看的话还是很明显的),当然了AK4118锁定速度要比 FPGA SPDIF解码的要快几个采样!别一方面,由于FPGA单口IO输出电压要3.3v,那么就要有电压转换器,板上有一个LMV7219作为整形! 这款板子的SPDIF接收稳定性上是完全没有问题,为了测试稳定性我也是找来了很多SPDIF输出的源:
底下是一台PS3主机,主机上最左的是一片很久以前做的一个意大利模块,CDLP部分用的是ALTEAR MAX II (还是自己搞的)同样支持SPDIF PCM384K DSD128 DOP输出,后面的板子,我想大家都知道是什么,年后,还会找一两台老的CD机做测试! 实际上只要SPDIF输出的码率误差不小于3%-5%(主要看输出采样是多少),就可以完美接收!!
3:FPGA还内置了一个IIS接收器!! 以前做IIS接收器的时候 都是使用的被动接收,这种 接收方式容易受IIS源时钟的干扰,会产生很大的失真,为了解决这个问题,我是采用一个类似SPDIF 的接收方式,IIS解码同样有一个CDR,产生同步接收的BCLK,这样MCLK,LRCK,BCLK就是主动式的,这样IIS的MCLK就完全不用,即使BCLK在短时内产生大的抖动,也不会影响FPGA的数据接收! IIS接收器制作起来要简单一样,原因是BCLK的脉冲长度是相同的!! IIS解码还带一个SPDIF输出,原理和功能上和意大利一样!!
4:FPGA还内置一个正弦波发生器!正弦波发生器可以输出PCM 44.1k-1536k的采样(1536k的我并没有测试),输出频率1HZ-35KHZ,IIS输出32bit!! 正弦波发生器采用的是CORDIC算法,Quartus是带有这个IP核,很省事,虽然省事但这个IP并不好用,这个IP都是浮点输入和输出,还是弧度角,这样计算角速度的时候就写一大堆代码,还要用到浮点加减乘,这样FPGA用掉的资源就差不多是7500个逻辑了,好在上面三个解码器只用到1500多个逻辑,还是有余量的!整个正弦IP可以运行在100MHZ左右(时序是满足的),而整个计算会有差不多50个时钟,这样就可以产生2MHZ的采样率(输出1536k的采样不是问题)!!后面我会自己做一个整数类型的CORDIC,只为了减少FPGA的资源使用量!!
年底了PCB产厂都过年了,不好打样!年后会搞一个带DAC的板子到时候实际测试给大家评评!
文采不是很好,请各位见谅!! 看起来不错,提个建议,换种RCA座在高频输出会更好 new1510 发表于 2016-2-2 15:11
看起来不错,提个建议,换种RCA座在高频输出会更好
谢谢支持!作为炮板,板上只有一个RCA头输出,别外一个RCA是输入!!:lol 俺是菜鸟! SPDIF接收器输出的i2s时钟信号来自内置的正弦波发生器? jdog 发表于 2016-2-2 22:21
SPDIF接收器输出的i2s时钟信号来自内置的正弦波发生器?
SPDIF接收器 IIS接收器正弦波发生器都是独立的,他们之间并没有什么关联,当然了,晶振只有一对,他们唯一的关联是用到同一对晶振,说实话,我不太明白你的话! op111op 发表于 2016-2-2 22:40
赞一个
另外请教一下楼主,意大利模块的那个CMD信号是做什么用的
他是一个命令时钟,采样变化或者播放器有中断(电脑上的)就是用来产生中断的,中断后就是采样的数据时钟!! 创意不错!
俺也做了一片板子放假折腾一下,为SPDIF输入转iis及右对齐输出,适合搭配各种不同的新老DA芯片。 usb的啊!有没有3.0 zhp25 发表于 2016-2-3 09:45
usb的啊!有没有3.0
当前的USB模块好像都没有USB3.0的吧,在说了USB2.0无论PCM 还是DSD都是有余的!!不过以后应该会有!! 简单来说就是一个输入输出的USB界面了?赞啊~ xyj9903 发表于 2016-2-3 12:44
简单来说就是一个输入输出的USB界面了?赞啊~
USB只是一个部分!! ljpwed 发表于 2016-2-2 22:33
SPDIF接收器 IIS接收器正弦波发生器都是独立的,他们之间并没有什么关联,当然了,晶振只有一对,他们唯 ...
谢谢!我已在你的回复中找到答案。 不错 LZ牛逼啊,不过,用双晶振做SPDIF的时钟恢复是不行的,除非你开了FPGA的PLL。
但是FPGA的PLL比一般的接收芯片要差一些,除非你能自己写牛逼的DPLL。
SPDIF解码出I2S之后,时钟必须是和外面的时钟源同步的。 chenxiuping15 发表于 2016-2-4 10:56
LZ牛逼啊,不过,用双晶振做SPDIF的时钟恢复是不行的,除非你开了FPGA的PLL。
但是FPGA的PLL比一般的接收 ...
呵呵! 有些东西可能你没真正接触到FPGA吧,很多人当然会有旧观念去评价FPGA解码SPDIF,实际上接收芯片的PLL都不如FPGA的PLL,解码SPDIF当然是用到PLL的,自己写一个DPLL又有多难?无论是altera 还是Xilinx 实现DPLL都是非常简单的事,当然了你没有真正去实现 一个东西你自然是认为他是很难的,这个我是可以理解的!! 俺感觉这东西在发烧友,尤其爱折腾的发烧友中用处大了,一块板子 把家里手机,平板,电脑,电视盒等都接在一块,同意一台dac输出,不知我理解的对吗