1 概述
I2S(Inter—IC Sound)總線, 又稱 集成電路內(nèi)置音頻總線,是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn),該總線專門(mén)用于音頻設(shè)備之間的數(shù)據(jù)傳輸,廣泛應(yīng)用于各種多媒體系統(tǒng)。I2S采用了沿獨(dú)立的導(dǎo)線傳輸時(shí)鐘與數(shù)據(jù)信號(hào)的設(shè)計(jì),通過(guò)將數(shù)據(jù)和時(shí)鐘信號(hào)分離,避免了因時(shí)差誘發(fā)的失真,為用戶節(jié)省了購(gòu)買(mǎi)抵抗音頻抖動(dòng)的專業(yè)設(shè)備的費(fèi)用。
在飛利浦公司的I2S標(biāo)準(zhǔn)中,I2S主要有三個(gè)信號(hào)。
1.位時(shí)鐘 BICK(也叫串行時(shí)鐘SCLK),即對(duì)應(yīng)數(shù)字音頻的每一位數(shù)據(jù),BCLK都有1個(gè)脈沖。BCLK的頻率=2×采樣頻率×采樣位數(shù)。
2.幀時(shí)鐘LRCK,(也稱WS),用于切換左右聲道的數(shù)據(jù)。LRCK為“1”表示正在傳輸?shù)氖怯衣暤赖臄?shù)據(jù),為“0”則表示正在傳輸?shù)氖亲舐暤赖臄?shù)據(jù)。LRCK的頻率等于采樣頻率。
3.串行數(shù)據(jù)SDATA,就是用二進(jìn)制補(bǔ)碼表示的音頻數(shù)據(jù)。
有時(shí)為了使系統(tǒng)間能夠更好地同步,還需要另外傳輸一個(gè)信號(hào)MCLK,稱為主時(shí)鐘,也叫系統(tǒng)時(shí)鐘(Sys Clock),是采樣頻率的256倍或384倍。隨著技術(shù)的發(fā)展,在統(tǒng)一的 I2S接口下,出現(xiàn)了多種不同的數(shù)據(jù)格式。根據(jù)SDATA數(shù)據(jù)相對(duì)于LRCK和SCLK的位置不同,分為左對(duì)齊(較少使用)、I2S格式(即飛利浦規(guī)定的格式)和右對(duì)齊(也叫日本格式、普通格式)。
以下是I2S Sample rate 44.1Khz 和48Khz部分系列。
2 模式
左對(duì)齊模式:SDATA 的MSB在BCLK的第一個(gè)上升獲得根據(jù)LRCK的傳輸。
I2S模式:SDATA 的MSB在BCLK的第二個(gè)上升獲得根據(jù)LRCK的傳輸。
右對(duì)齊模式。
3 I2S收發(fā)模塊FPGA的仿真設(shè)計(jì)
i2s_test模塊為i2s_in和i2s_out模塊的頂層,i2s_in模塊將輸入的串行數(shù)據(jù)轉(zhuǎn)換成并行的數(shù)據(jù),然后i2s_out模塊將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)輸出。
I2s_in模塊和I2s_out模塊的接口說(shuō)明如下。
I2s test bench設(shè)計(jì)
讓i2s_out模塊將并行轉(zhuǎn)為串行,然后使用i2s_in模塊將串行轉(zhuǎn)為并行。驗(yàn)證數(shù)據(jù)是否正確。
Test bench源碼:
1. // test bench
2.
3. `timescale 1ps/1ps
4.
5. module tb32bitmaster();
6.
7. initial begin #600000000 $finish; end //600us
8.
9. reg preset_n;
10. initial begin preset_n = 1; #10000 preset_n = 0; #100000 preset_n = 1; end
11.
12. reg pclk;
13. initial begin pclk = 0; #313333 pclk = 0; forever #11072.1 pclk = ~pclk; end
14.
15. reg start;
16. initial begin start = 0; #400000 start = 1; end
17.
18. reg clkd2, clkd4, clkd8, clkd16;
19. wire reset_n = preset_n;
20.
21. always @(posedge pclk or negedge reset_n)
22. if (0 == reset_n)
23. clkd2
24. else
25. clkd2
26.
27. always @(posedge clkd2 or negedge reset_n)
28. if (0 == reset_n)
29. clkd4
30. else
31. clkd4
32.
33. always @(posedge clkd4 or negedge reset_n)
34. if (0 == reset_n)
35. clkd8
36. else
37. clkd8
38. always @(posedge clkd8 or negedge reset_n)
39. if (0 == reset_n)
40. clkd16
41. else
42. clkd16
43.
44.
45. wire bck, lrck, sdata;
46. wire [31:0] y0, y1;
47.
48. i2s_in U_i2s_in(
49. .mclk(pclk),
50. .reset_n(reset_n),
51.
52. .in_bck(bck),
53. .in_lrck(lrck),
54. .in_sdata(sdata),
55. //controls
56. //output
57. .source_left(y0),
58. .source_right(y1)
59. );
60.
61. i2s_out u_i2s_out(
62. .in_bck(clkd16),
63. .reset_n(reset_n),
64. .source_left(32'h5555_aaaa),
65. .source_right(32'haaaa_5555),
66. .obck(bck),
67. .olrck(lrck),
68. .odata(sdata)
69. );
70. endmodule
71.
72. `include "i2s_out.v"
73. `include "i2s_in.v"
從仿真結(jié)果看我們的i2s_out和i2s_in模塊仿真設(shè)計(jì)成功。
編輯:hfy
-
FPGA
+關(guān)注
關(guān)注
1630文章
21796瀏覽量
605998 -
I2S
+關(guān)注
關(guān)注
1文章
65瀏覽量
42076
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論