www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > FPGA開源工作室

音頻總線I2S協(xié)議

1 概述

I2S(InterIC Sound)總線, 又稱 集成電路內(nèi)置音頻總線,是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn),該總線專門用于音頻設(shè)備之間的數(shù)據(jù)傳輸,廣泛應(yīng)用于各種多媒體系統(tǒng)。I2S采用了沿獨(dú)立的導(dǎo)線傳輸時(shí)鐘與數(shù)據(jù)信號的設(shè)計(jì),通過將數(shù)據(jù)和時(shí)鐘信號分離,避免了因時(shí)差誘發(fā)的失真,為用戶節(jié)省了購買抵抗音頻抖動的專業(yè)設(shè)備的費(fèi)用。

在飛利浦公司的I2S標(biāo)準(zhǔn)中,I2S主要有三個(gè)信號。

1.位時(shí)鐘 BICK(也叫串行時(shí)鐘SCLK),即對應(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è)信號MCLK,稱為主時(shí)鐘,也叫系統(tǒng)時(shí)鐘(Sys Clock),是采樣頻率的256倍或384倍。隨著技術(shù)的發(fā)展,在統(tǒng)一的 I2S接口下,出現(xiàn)了多種不同的數(shù)據(jù)格式。根據(jù)SDATA數(shù)據(jù)相對于LRCKSCLK的位置不同,分為左對齊(較少使用)、I2S格式(即飛利浦規(guī)定的格式)和右對齊(也叫日本格式、普通格式)。

以下是I2S Sample rate 44.1Khz 48Khz部分系列。

2 模式

左對齊模式:SDATA MSBBCLK的第一個(gè)上升獲得根據(jù)LRCK的傳輸。

I2S模式:SDATA MSBBCLK的第二個(gè)上升獲得根據(jù)LRCK的傳輸。

右對齊模式。

3 I2S收發(fā)模塊FPGA的仿真設(shè)計(jì)

i2s_test模塊為i2s_ini2s_out模塊的頂層,i2s_in模塊將輸入的串行數(shù)據(jù)轉(zhuǎn)換成并行的數(shù)據(jù),然后i2s_out模塊將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)輸出。

I2s_in模塊和I2s_out模塊的接口說明如下。

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 <= 0;

24. else

25. clkd2 <= ~clkd2;

26.

27. always @(posedge clkd2 or negedge reset_n)

28. if (0 == reset_n)

29. clkd4 <= 0;

30. else

31. clkd4 <= ~clkd4;

32.

33. always @(posedge clkd4 or negedge reset_n)

34. if (0 == reset_n)

35. clkd8 <= 0;

36. else

37. clkd8 <= ~clkd8;

38. always @(posedge clkd8 or negedge reset_n)

39. if (0 == reset_n)

40. clkd16 <= 0;

41. else

42. clkd16 <= ~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_outi2s_in模塊仿真設(shè)計(jì)成功。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉