走對這幾步 讓 I2S 收發(fā)器跑起來!
文章 概述
本文引用地址:http://2s4d.com/article/202408/462424.htm本文介紹了I2S收發(fā)器的配置與實(shí)現(xiàn),用于FPGA的VHDL編程。I2S是數(shù)字音頻的標(biāo)準(zhǔn)化串行通信總線,由SCK、WS和SD三條線路組成。文章闡述了I2S收發(fā)器的工作原理,包括數(shù)據(jù)傳輸方式、操作理論、配置方法、端口描述以及音頻數(shù)據(jù)事務(wù)傳輸。
本文詳細(xì)介紹了一個(gè)主 I2S 收發(fā)器組件用于 FPGA,以 VHDL 編寫。 組件通過 I2S 接口接收音頻數(shù)據(jù),并將接收到的數(shù)據(jù)在某一采樣率上傳送給并行接口上的用戶邏輯芯片。 它還在某一采樣率上從用戶邏輯芯片上接收并行數(shù)據(jù),并通過 I2S 接口將這些數(shù)據(jù)傳輸出去。 圖1說明了將 I2S 收發(fā)器集成到系統(tǒng)中的一個(gè)典型示例。
圖 1 示例實(shí)現(xiàn)
背景
I2S (也稱為 IIS) 是用于數(shù)字音頻的標(biāo)準(zhǔn)化串行通信總線。該總線由串行時(shí)鐘 (SCK)、字段選擇信號 (WS)和串行數(shù)據(jù) (SD) 3條線路組成。圖2顯示了 I2S 通信鏈路的數(shù)據(jù)幀。
圖 2. I2S 數(shù)據(jù)幀串行數(shù)據(jù)線傳輸兩個(gè)時(shí)間復(fù)用的數(shù)據(jù)通道——左信道和右信道。數(shù)據(jù)首先以2’s 二進(jìn)制補(bǔ)碼形式傳輸最高有效位(MSB)。字段選擇信號 (WS)表示當(dāng)前正在傳輸?shù)穆暤?低=左聲道,高=右聲道)。該通道數(shù)據(jù)字段的MSB在字段選擇信號 (WS)切換后傳輸一個(gè)時(shí)鐘周期,然后是數(shù)字節(jié)的其余部分。數(shù)據(jù)位在下降時(shí)鐘沿上傳輸,在上升時(shí)鐘沿上讀取。I2S發(fā)送器或I2S接收器都可以充當(dāng)主機(jī)(master)。主機(jī)提供串行時(shí)鐘和字段選擇信號。音頻編解碼器通常也需要一個(gè)“主時(shí)鐘”(MCLK) 來運(yùn)行其內(nèi)部電路。MCLK 頻率通常是采樣率的倍數(shù),例如 256*Fs (其中 Fs 是采樣率)。要求取決于具體的音頻編解碼器。
操作理論這個(gè)I2S 收發(fā)器輸入一個(gè)主時(shí)鐘,并通過計(jì)數(shù)器從它得到串行時(shí)鐘和字段選擇信號。串行時(shí)鐘頻率是主時(shí)鐘的整數(shù)倍,字段選擇頻率(即采樣率)是串行時(shí)鐘的整數(shù)倍。接收數(shù)據(jù)從串行時(shí)鐘上升沿上的 sd_rx 端口時(shí)鐘進(jìn)入內(nèi)部接收移位寄存器。在字段選擇切換后,為適當(dāng)?shù)耐ǖ绬⒂靡粋€(gè)串行時(shí)鐘周期的移位,并繼續(xù)保持?jǐn)?shù)據(jù)字段的寬度,然后再次禁用。在每個(gè)字段選擇開關(guān)上,收發(fā)器分別在 r_data_rx 和 l_data_rx 端口上呈現(xiàn)右聲道和左聲道的接收數(shù)據(jù)。相反,在 r_data_tx 和 l_data_tx 輸入端口上呈現(xiàn)的左右數(shù)據(jù)在每個(gè)字段選擇開關(guān)上并行加載到內(nèi)部傳輸移位寄存器中。這些數(shù)據(jù)在串行時(shí)鐘下降沿上的 sd_tx 端口被時(shí)鐘輸出。在字段選擇切換后,為適當(dāng)?shù)耐ǖ绬⒂靡粋€(gè)串行時(shí)鐘周期的移位,并在數(shù)據(jù)字段的寬度之外繼續(xù)一個(gè)串行時(shí)鐘,然后再次禁用。根據(jù) I2S 總線規(guī)范,額外的傳輸位將 sd_tx 數(shù)據(jù)線設(shè)置為’ 0 ',以防數(shù)據(jù)寬度與接收 I2S 設(shè)備不匹配。
配置I2S 收發(fā)器
I2S 收發(fā)器通過在 ENTITY 中設(shè)置通用參數(shù)進(jìn)行配置。
sclk_ws_ratio
字段選擇 (ws) 信號的頻率是采樣率。 sclk_ws_ratio 參數(shù)定義了每個(gè)字段選擇周期的串行時(shí)鐘*(sclk)* 周期數(shù)。
mclk_sclk_ratio
mclk_sclk_ratio 參數(shù)定義了每個(gè)串行時(shí)鐘*(sclk)* 周期的主時(shí)鐘 (mclk) 周期數(shù)。
d_width
參數(shù) d_width 以位為單位定義每個(gè)數(shù)據(jù)字段的大小。這并不需要等于一個(gè)字段選擇半周期內(nèi)串行時(shí)鐘周期的數(shù)量(即在信道數(shù)據(jù)傳輸期間串行時(shí)鐘的數(shù)量)。如果在字段選擇半周期內(nèi)有多余的時(shí)鐘周期,那么在額外的串行時(shí)鐘周期內(nèi)串行數(shù)據(jù)接收端口 (sd_rx) 上的任何數(shù)據(jù)都將被忽略,并且串行數(shù)據(jù)傳輸端口 (sd_tx) 為這些額外的位輸出 ’ 0 '。
提供主時(shí)鐘 (Master Clock)
I2S 收發(fā)器需要一個(gè)主時(shí)鐘 時(shí)鐘輸入 來操作。該時(shí)鐘是發(fā)送到 I2S 收發(fā)器正在通信的 I2S 從設(shè)備的同一主時(shí)鐘信號。
通常,期望的采樣率 (Fs) 是已知的,I2S 設(shè)備需要一個(gè)該采樣率的若干倍的主時(shí)鐘。例如,假設(shè)期望的采樣率是常用的 44.1 kHz,并且 I2S 設(shè)備接受 256*Fs 的主時(shí)鐘。這意味著用戶需要為 I2S 設(shè)備和 I2S 收發(fā)器提供11.29 MHz的 mclk 。mclk 信號可以在 FPGA 內(nèi)部使用鎖相環(huán)導(dǎo)出。
端口的描述
I2S收發(fā)器接口說明如表1所示。
表 1 . 端口的描述
音頻數(shù)據(jù)事務(wù)傳輸
I2S 收發(fā)器使 l_data_rx 和 r_data_rx 端口上的用戶邏輯可以使用接收到的數(shù)據(jù)。這兩個(gè)接收數(shù)據(jù)端口在每次 ws 轉(zhuǎn)換時(shí)都會更新。由于新的左聲道數(shù)據(jù)僅在 ws = ’ 0 '時(shí)接收,因此 l_data_rx 端口與 ws 的上升沿同時(shí)獲得新值,即當(dāng)左聲道數(shù)據(jù)字段完成時(shí)。同樣,新的右聲道數(shù)據(jù)僅在 ws = " 1 " 時(shí)接收,因此 r_data_rx 端口與 ws 的下降沿并發(fā)獲得新值,即當(dāng)右聲道數(shù)據(jù)字段完成時(shí)。用戶邏輯可以使用 ws 信號來指示新數(shù)據(jù)可用,從而以采樣率檢索該數(shù)據(jù)。圖3 說明了這種行為。
類似地,I2S 收發(fā)器在每個(gè) ws 轉(zhuǎn)換的 l_data_tx 和 r_data_tx 端口上鎖存新的傳輸數(shù)據(jù)。用戶邏輯可以使用 ws 信號來指示何時(shí)將其輸出數(shù)據(jù)鎖存,因此可以自由地在這些端口上呈現(xiàn)下一組傳輸數(shù)據(jù)。鎖存在 ws 下降沿上的 l_data_tx 值在左聲道數(shù)據(jù)字段傳輸期間在 sd_tx 上傳輸。同樣,鎖存在 ws 上升沿上的 r_data_tx 值在右聲道數(shù)據(jù)字段傳輸期間在 sd_tx 上傳輸。圖3 顯示了這種行為。圖 3. 時(shí)間圖
評論