<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 數據接收 ` `I2S(Inter—IC Sound)總線,是飛利浦公司為數字音頻設備之間的音頻數據傳輸而制定的一種總線標準,該總線專門用于音頻設備之間的音頻數據傳輸。I2S總線有三條數據信號線: ` `(1)BCLK:串行時鐘,也叫位時鐘,對應數字音頻的每一位數據。 ` `(2)WS:字段(聲道)選擇,用于選擇左右聲道。為“0”表示正在傳輸的是左聲道的數據, 為“1”表示正在傳輸的是右聲道的數據。 ` `(3)SD:串行數據,用二進制補碼來表示音頻數據(數據傳輸從高位到低位)。 ` `BLK=2*采樣頻率*采樣位數 ` `采樣頻率即WS的頻率,采樣位數即在WS的左右聲道內采樣的數據位數。 ` `常見的I2S音頻傳輸有48K,44.1Khz和32Khz三種采樣率。傳輸的音頻數據位寬常見的有16,20和24三種。I2S傳輸的數據是聲音的模擬信號經過AD采樣數字化后的數據,所以數據位寬越寬,數據的采樣精度就越高。下圖是I2S傳輸的波形圖,I2S在BCLK的下降沿發送數據(發送),在上升沿進行數據采樣(接收)。每次是先發送最高位,最后發送最低位。MSB在WS變化的下一個時鐘周期有效。因此,最高位擁有固定的位置,而最低位的位置則是依賴于數據的有效位數。也就使得接收端與發送端的有效位數可以不同。如果接收端能處理的有效位數少于發送端,可以放棄數據幀中多余的低位數據;如果接收端能處理的有效位數多于發送端,可以自行補足剩余的位(常補足為零)。 ` `I2S發送數據:發送是在每個時鐘周期的下降沿發送數據,這樣在WS沿變化開始后的第二個下降沿發送數據的最高位。接著在每個下降沿依次發送數據,直到發送完最低位。 I2S接收數據:在每個時鐘周期的上升沿接收數據,在WS沿變化開始后的第二個上升沿接收數據的最高位。接著在每個位時鐘上升沿依次接收數據,直到接收完最低位。 ![](https://img.kancloud.cn/7b/7d/7b7dc3a800e56eea69def2c481cc51e4_1091x193.png) verilog實現I2S數據接收,下面是一個24位寬的I2S音頻數據接收模塊。 ``` reg finish_flag;//完成一次數據轉換標志 reg [5:0]R_cnt; reg [5:0]L_cnt; reg [31:0]ak5394_data_int; always@(negedge finish_flag) begin if(!rst_n)begin AD_DATA1_reg <= 24'd0; AD_DATA2_reg <= 24'd0; ak5394_data_int <= 32'd0; end else begin AD_DATA1_reg <= data1; AD_DATA2_reg <= data2; ak5394_data_int <= ddr_data1_int; end end always@(posedge SCLK) begin if(!rst_n)begin data1 <= 24'd0; data2 <= 24'd0; R_cnt <= 6'd0; L_cnt <= 6'd0; finish_flag <= 1'b0; end else begin //finish_flag <= 1'b0; if(LRCK == 1'b0)begin R_cnt <= 6'd0; if(L_cnt < 6'd25)begin L_cnt <= L_cnt + 1'b1; data1 <= {data1[22:0],SDATA}; end end else begin L_cnt <= 6'd0; if(R_cnt< 6'd25)begin R_cnt <= R_cnt + 1'b1; data2 <= {data2[22:0],SDATA}; end end if(R_cnt == 6'd24)begin finish_flag <= 1'b1; end else finish_flag <= 1'b0; end end ``` ## 數據擴展 ` `對于數據為24位的數據,為了方便處理,通常會將數據擴展為32位的int型數據。I2S的數據是補碼格式,因此這就是補碼擴展。 ` `如果8位二進制補碼的最高位(符號位)為0,那么擴展后的16位補碼直接在最高位前面添加8個0即可; ` `如果8位二進制補碼的最高位(符號位)為1,那么擴展后的16位補碼直接在最高位前面添加8個1即可; 舉例如下: ` `-13 ` `8位原碼:1000 1101 ` `8位補碼:1111 0011 ` `16位原碼:1000 0000 0000 1101 ` `16位補碼:1111 1111 1111 0011 ` `根據前面的知識,由于-13的最高位為1,所以直接在最高位前面添加8個1即可變為16位補碼,即1111 1111 1111 0011(與前面由原碼求補碼的結果一致)。 ` `13 ` `8位原碼:0000 1101 ` `8位補碼:0000 1101 ` `16位原碼:0000 0000 0000 1101 ` `16位補碼:0000 0000 0000 1101 ` `根據前面的知識,由于13的最高位為0,所以直接在最高位前面添加8個0即可變為16位補碼,即0000 0000 0000 1101(與前面由原碼求補碼的結果一致)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看