FPGA零基礎學習精選 | IIC協議驅動設計

原創 FPGA技術江湖 2025-09-13 08:51

大俠好,歡迎來到FPGA技術江湖,江湖偌大,相見即是緣分。大俠可以關注FPGA技術江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。


本系列將帶來FPGA的系統性學習,從最基本的數字電路基礎開始,最詳細操作步驟,最直白的言語描述,手把手的“傻瓜式”講解,讓電子、信息、通信類專業學生、初入職場小白及打算進階提升的職業開發者都可以有系統性學習的機會。

系統性的掌握技術開發以及相關要求,對個人就業以及職業發展都有著潛在的幫助,希望對大家有所幫助。后續會陸續更新 Xilinx 的 Vivado、ISE 及相關操作軟件的開發的相關內容,學習FPGA設計方法及設計思想的同時,實操結合各類操作軟件,會讓你在技術學習道路上無比的順暢,告別技術學習小BUG卡破腦殼,告別目前忽悠性的培訓誘導,真正的去學習去實戰應用,這種快樂試試你就會懂的。話不多說,上貨。


IIC協議驅動設計


作者:郝旭帥  校對:陸輝


本篇實現基于叁芯智能科技的SANXIN -B01 FPGA開發板,以下為配套的教程,如有入手開發板,可以登錄官方淘寶店購買,還有配套的學習視頻。

SANXIN-B01開發板verilog教程V3電子版


FPGA工程師線上研修班,常年開班,隨時報名,新增高速接口、光纖通信等內容!


I2C 即 Inter-Integrated Circuit(集成電路總線),這種總線類型是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步串行總線,主要是用來連接整體電路(ICS) ,I2C是一種多向控制總線,也就是說多個芯片可以連接到同一總線結構下,同時每個芯片都可以作為實時數據傳輸的控制源。這種方式簡化了信號傳輸總線接口。


I2線是一種串行數據總線,只有二根信號線,一根是雙向的數據線 SDA,另一根是時鐘線 SCL,兩條線可以掛多個設備。 I2C 設備(絕大多數)里有個固化的地址,只有在兩條線上傳輸的值等于 I2C 設備的固化地址時,其才會作出響應。通常我們為了方便把 I2C 設備分為主設備和從設備,基本上誰控制時鐘線(即控制SCL的電平高低變換)誰就是主設備。


A段為空閑段,在不進行數據傳輸時,SCL 和 SDA 保持為高電平。


B段為起始段(START CONDITION),在進行任何數據傳輸前,都應該先有一個起始段。當 SCL 為高電平期間,SDA有一個從高到低的變化視為起始段。


C段為結束段(STOP CONDITION),在數據傳輸結束后,都應該有一個結束段。當SCL為高電平期間,SDA有一個從低到高的變化視為結束段。


D段分為兩段數據有效段(ADDRESS OR ACKNOWLEDGE)和數據修改段(DATA ALLOWED TO CHANGE)。在傳輸數據時,在 SCL 為高電平期間,SDA 不能夠發生改變,視為數據有效段;在傳輸數據時,在 SCL 為低電平期間,SDA 可以發生改變(修改為下一個要發送的bit),視為數據修改段。


IIC的傳輸總結為:空閑時,SCL 和 SDA 都是高電平;發送信息前,首先發送起始段(SCL為高時,SDA有一個從高到低的變化);在發送信息時,每一個 SCL 脈沖,發送或者接收1bit,該bit在SCL為低電平時發生改變,在SCL為高電平時,保持穩定;發送信息完成后,發送結束段(SCL 為高時,SDA 有一個從低到高的變化)。


SDA的數據線是雙向傳輸的。在讀取時,SDA 從從設備到主設備;在寫入時,SDA從主設備到從設備。


在 IIC 傳輸時,為了保證通信的成功。發送方每發送8 bit 數據后,要求接收方回復一個應答位。 


應答位為低電平有效。




  • EEPROM(24LC64)簡介

24LC64是容量為8K*8bit(64Kbit)通信接口為IIC的EEPROM。EEPROM擁有掉電不丟失的功能,經常用來保存一些配置信息等等。這個器件可以一次進行最多32字節的頁寫入和一次進行整片讀出的功能。



A0、A1、A2為用戶可配置的芯片選擇端。該管腳一般都連接電源或者地,在通信時,24LC64作為從機,主機在發送的命令中存在地址號,當地址號與A0、A1、A2管腳的電平相同時,該芯片視為被選中。


SDA和SCL為IIC協議中的時鐘線和數據線。


WP為寫保護端,當連接高電平時,該芯片只能夠被讀,不能夠寫入;當連接低電平或者空置時,該芯片可以被讀寫。


24LC64的寫入方式有兩種:單字節寫入和多字節寫入。


單字節寫入時序圖:


在控制字節中,1010為EEPROM的標號;A2、A1、A0為主機發送的地址號,接收設備接收到此信息后,會與本身的A2、A1、A0相對比,相同時,視為被選中;最后1bit,0表示寫入、1表示讀出。


在高字節地址中,高三位地址無效。24LC64的地址范圍為8K,地址位13位即可。13位地址分為高五低八,在IIC中規定每次發送8bit,所以高五的前面必須發送任意3bit。


多字節寫入時序圖: 


DATA BYTE 0被寫入到指定的地址中,后續的數據寫入到指定地址的后續地址中。EEPROM中每32個字節分為一塊,寫入時不能跨塊寫入。


24LC64的讀出方式有三種:當前地址單字節讀、任意地址單字節讀和任意地址多字節讀。


當前地址單字節讀的時序圖如下:


當主機接收24LC64的數據后,不發送ACK,而是發送高電平。


任意地址單字節讀取時序圖,如下:


首先寫入指定地址,然后按照當前地址讀即可。


任意地址多字節讀,時序如下:


任意地址多字節讀就是在任意地址單字節讀的時序中,接收到從機發送的數據后,不要發送NO ACK而是發送ACK,此時從機就會繼續發送后續地址的數據,直到讀取的長度符合設計要求,然后發送NO ACK以及STOP結束傳輸。


下圖為24LC64的時序參數圖。



根據時序參數,決定將IIC的速率定為50KHz。發送時,數據改變在SCL的低電平的正中間;讀取時,在SCL高電平的正中間進行讀取。


IIC一般用在配置或者讀取少量的信息,對于速率來說要求相對較低。





  • 硬件介紹

在開發板上,搭載了一個24LC64。


電路原理圖如下:


A0、A1、A2都被接地,主機再發送控制字節時,需要將此三位發送低電平。


WP管腳被接地,24LC64的整個片子都可以被讀寫。




  • 雙向IO介紹

在IIC協議中,SDA作為數據線使用,每一個SCL的脈沖,傳遞一bit的數據。在讀取時,SDA由24LC64發送,FPGA接收;在寫入時,SDA由FPGA發送,24LC64接收。所以IIC協議只能實現半雙工通信。


在硬件電路中,一般是通過三態門來進行控制雙向IO。

此電路在FPGA的IO中也是存在的。下面來分析具體的工作原理。


三態門有三個端子,分別是輸入端(obuf),輸出端(SDA)和控制端(out_en)。工作方式為:當out_en有效時,obuf的值就可以輸出到SDA;當out_en無效時,obuf的值不能輸出到SDA,那么三態門就會輸出高阻態。


高阻態,字節理解為阻值特別大,也可以理解為斷開。高阻態與任何電平值相連接,所連接的線上的電平值都是和對方保持一致。在此可以延伸一下:所有的端口都是輸出,包括輸入端口在內,也會對外呈現出一種狀態,所以輸入端口對外呈現的狀態就是高阻態。對于雙向IO來說,輸出時,正常輸出即可;輸入時,就要呈現為高阻態。


  • 設計要求

設計任意地址的單字節讀寫控制器。大多數是配置或者讀取少量的信息,對于多字節的讀寫,可以采用多次單字節的讀寫完成。


  • 設計分析

24LC64的尋址范圍為8K,地址bit共計13bit,所以需要高5bit和低8bit。在有些兼容IIC協議接口的器件中,尋址范圍較少,8bit足夠表示,所以在設計時,設計出適合兩種尋址方式的驅動。


SCL的實現采用計數器控制,根據規定好的頻率,在合適的地方進行拉高或者拉低。由于SDA的變化都發生在SCL為高或者為低的中間,所以還需要產生對應的脈沖。


SDA根據協議和對應的脈沖進行發送對應的協議段。


  • 架構設計和信號說明

本模塊命名為iic_drive。


暫不連接的端口,在后續測試時,會有其他模塊來控制或者讀取。


  • iic_drive設計實現

iic_scl采用計數器的方式實現。外部的時鐘為50MHz,iic_scl為100KHz,所以計數器需要記錄500個時鐘周期。


計數器由cnt_en控制。cnt_en有效時,cnt從0到500不斷循環;當cnt_en無效時,cnt保持等于0。


iic_scl在cnt等于0至249時,保持高電平;在250至499時,保持低電平。cnt等于125時,正好是iic_scl高電平的中間,用脈沖flag_high表示;cnt等于375時,正好是iic_scl低電平的中間,用脈沖flag_low表示。


其他信號采用狀態機作為輸出。out_en為三態門控制信號,sda_obuf為三態門輸出端,drive_cnt為發送或者接收的計數器,temp為發送或者接收的中間寄存器。


狀態轉移圖如下:


設計代碼為:

module iic_drive (
  input   wire                clk,  input   wire                rst_n,  input   wire                start_flag,  input   wire    [6:0]       slave_addr,  input   wire                wren,  input   wire                addr_sel,  input   wire    [15:0]      addr,  input   wire    [7:0]       wdata,  output  reg                 iic_scl,  inout   wire                iic_sda,  output  reg                 iic_done,  output  reg     [7:0]       rdata);  parameter       FREQ_clk    =   50_000_000;  parameter       FREQ_iic    =   100_000;  localparam      T_SCL       =   FREQ_clk/FREQ_iic;  localparam      IDLE        =   16'b0000_0000_0000_0001;  localparam      START       =   16'b0000_0000_0000_0010;  localparam      CTRL        =   16'b0000_0000_0000_0100;  localparam      CTRL_ACK    =   16'b0000_0000_0000_1000;  localparam      HADDR       =   16'b0000_0000_0001_0000;  localparam      HADDR_ACK   =   16'b0000_0000_0010_0000;  localparam      LADDR       =   16'b0000_0000_0100_0000;  localparam      LADDR_ACK   =   16'b0000_0000_1000_0000;  localparam      WR          =   16'b0000_0001_0000_0000;  localparam      WR_ACK      =   16'b0000_0010_0000_0000;  localparam      RD_START    =   16'b0000_0100_0000_0000;  localparam      RD_CTRL     =   16'b0000_1000_0000_0000;  localparam      RD_CTRL_ACK =   16'b0001_0000_0000_0000;  localparam      RD          =   16'b0010_0000_0000_0000;  localparam      NO_ACK      =   16'b0100_0000_0000_0000;  localparam      STOP        =   16'b1000_0000_0000_0000;  reg             [15:0]      c_state;  reg             [15:0]      n_state;  reg             [31:0]      cnt;  reg                         cnt_en;  reg                         flag_high;  reg                         flag_low;  reg                         out_en;  reg                         sda_obuf;  reg             [3:0]       drive_cnt;  reg             [7:0]       temp;  assign iic_sda = (out_en == 1'b1) ? sda_obuf : 1'bz;  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      cnt <= 32'd0;    else      if (cnt < T_SCL - 1'b1 && cnt_en == 1'b1)        cnt <= cnt + 1'b1;      else        cnt <= 32'd0;  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      iic_scl <= 1'b1;    else      if (cnt < T_SCL/2)        iic_scl <= 1'b1;      else        iic_scl <= 1'b0;  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      flag_high <= 1'b0;    else        if (cnt == T_SCL/4 - 1'b1)        flag_high <= 1'b1;      else          flag_high <= 1'b0;  end
  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      flag_low <= 1'b0;    else      if (cnt == (T_SCL * 3)/4 - 1'b1)        flag_low <= 1'b1;      else        flag_low <= 1'b0;  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      c_state <= IDLE;    else      c_state <= n_state;  end  always @ * begin    case (c_state)      IDLE        :     begin        if (start_flag == 1'b1)          n_state = START;        else          n_state = IDLE;      end          START       :     begin        if (flag_high == 1'b1)          n_state = CTRL;        else          n_state = START;      end            CTRL        :     begin        if (flag_low == 1'b1 && drive_cnt == 4'd8)          n_state = CTRL_ACK;        else          n_state = CTRL;      end            CTRL_ACK    :     begin        if (flag_high == 1'b1)          if (iic_sda == 1'b0)            if (addr_sel == 1'b1)              n_state = HADDR;            else              n_state = LADDR;          else            n_state = START;        else          n_state = CTRL_ACK;      end            HADDR       :     begin        if (flag_low == 1'b1 && drive_cnt == 4'd8)          n_state = HADDR_ACK;        else          n_state = HADDR;      end            HADDR_ACK   :     begin        if (flag_high == 1'b1)          if (iic_sda == 1'b0)            n_state = LADDR;          else            n_state = START;        else          n_state = HADDR_ACK;      end            LADDR       :     begin        if (flag_low == 1'b1 && drive_cnt == 4'd8)          n_state = LADDR_ACK;        else          n_state = LADDR;      end            LADDR_ACK   :     begin        if (flag_high == 1'b1)          if (iic_sda == 1'b0)            if (wren == 1'b1)              n_state = WR;            else              n_state = RD_START;          else            n_state = START;        else          n_state = LADDR_ACK;      end            WR          :     begin        if (flag_low == 1'b1 && drive_cnt == 4'd8)          n_state = WR_ACK;        else          n_state = WR;      end            WR_ACK      :     begin        if (flag_high == 1'b1)          if (iic_sda == 1'b0)            n_state = STOP;          else            n_state = START;        else          n_state = WR_ACK;      end            STOP        :     begin        if (flag_high == 1'b1)          n_state = IDLE;        else          n_state = STOP;      end            RD_START    :     begin        if (flag_high == 1'b1)          n_state = RD_CTRL;        else          n_state = RD_START;      end            RD_CTRL     :     begin        if (flag_low == 1'b1 && drive_cnt == 4'd8)          n_state = RD_CTRL_ACK;        else          n_state = RD_CTRL;      end            RD_CTRL_ACK :     begin        if (flag_high == 1'b1)          if (iic_sda == 1'b0)            n_state = RD;          else            n_state = START;        else          n_state = RD_CTRL_ACK;      end            RD          :     begin        if (flag_low == 1'b1 && drive_cnt == 4'd8)          n_state = NO_ACK;        else          n_state = RD;      end            NO_ACK      :     begin        if (flag_high == 1'b1)          n_state = STOP;        else          n_state = NO_ACK;      end            default     :     n_state = IDLE;    endcase  end
  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      cnt_en <= 1'b0;    else      case (c_state)        IDLE          : cnt_en <= 1'b0;        CTRL_ACK,        HADDR_ACK,        LADDR_ACK,        WR_ACK,        RD_CTRL_ACK   : begin          if (flag_high == 1'b1)            if (iic_sda == 1'b0)              cnt_en <= 1'b1;            else              cnt_en <= 1'b0;          else            cnt_en <= cnt_en;        end        default       :   cnt_en <= 1'b1;      endcase  end
  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      out_en <= 1'b0;    else      case (c_state)        IDLE          :   out_en <= 1'b0;        START         :   out_en <= 1'b1;        CTRL          :   begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            out_en <= 1'b0;          else            out_en <= 1'b1;        end        CTRL_ACK      :   out_en <= 1'b0;        HADDR         :   begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            out_en <= 1'b0;          else            if (flag_low == 1'b1)              out_en <= 1'b1;            else              out_en <= out_en;        end        HADDR_ACK     :   out_en <= 1'b0;        LADDR         :   begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            out_en <= 1'b0;          else            if (flag_low == 1'b1)              out_en <= 1'b1;            else              out_en <= out_en;        end        LADDR_ACK     :   out_en <= 1'b0;        WR            :   begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            out_en <= 1'b0;          else            if (flag_low == 1'b1)              out_en <= 1'b1;            else              out_en <= out_en;        end        WR_ACK        :   out_en <= 1'b0;        STOP          :   begin          if (flag_low == 1'b1)            out_en <= 1'b1;          else            out_en <= out_en;        end        RD_START      :   begin          if (flag_low == 1'b1)            out_en <= 1'b1;          else              out_en <= out_en;        end                RD_CTRL       :   begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            out_en <= 1'b0;          else            out_en <= 1'b1;        end        RD_CTRL_ACK   :   out_en <= 1'b0;        RD            :   begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            out_en <= 1'b1;          else            out_en <= 1'b0;        end                NO_ACK        :   out_en <= 1'b1;                default       :   out_en <= 1'b0;      endcase  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      sda_obuf <= 1'b1;    else      case (c_state)        IDLE          :     sda_obuf <= 1'b1;        START         :     begin          if (flag_high == 1'b1)            sda_obuf <= 1'b0;          else            sda_obuf <= 1'b1;        end                CTRL          :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            sda_obuf <= temp[7];          else            sda_obuf <= sda_obuf;        end                CTRL_ACK      :     sda_obuf <= 1'b0;        HADDR         :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            sda_obuf <= temp[7];          else            sda_obuf <= sda_obuf;        end                HADDR_ACK     :     sda_obuf <= 1'b0;        LADDR         :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            sda_obuf <= temp[7];          else            sda_obuf <= sda_obuf;        end        LADDR_ACK     :     sda_obuf <= 1'b0;        WR            :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            sda_obuf <= temp[7];          else            sda_obuf <= sda_obuf;        end        WR_ACK        :     sda_obuf <= 1'b0;        STOP          :     begin          if (flag_low == 1'b1)            sda_obuf <= 1'b0;          else            if (flag_high == 1'b1)              sda_obuf <= 1'b1;            else              sda_obuf <= sda_obuf;        end        RD_START      :     begin          if (flag_low == 1'b1)            sda_obuf <= 1'b1;          else            if (flag_high == 1'b1)              sda_obuf <= 1'b0;            else              sda_obuf <= sda_obuf;        end        RD_CTRL       :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            sda_obuf <= temp[7];          else            sda_obuf <= sda_obuf;        end        RD_CTRL_ACK   :     sda_obuf <= 1'b0;        RD            :     begin          if (flag_low == 1'b1 && drive_cnt == 4'd8)            sda_obuf <= 1'b1;          else            sda_obuf <= sda_obuf;        end        NO_ACK        :     sda_obuf <= sda_obuf;        default       :     sda_obuf <= 1'b1;      endcase  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      drive_cnt <= 4'd0;    else      case (c_state)        IDLE        :     drive_cnt <= 4'd0;        START       :     drive_cnt <= 4'd0;        CTRL        :     begin          if (flag_low == 1'b1)            if (drive_cnt < 4'd8)              drive_cnt <= drive_cnt + 1'b1;            else              drive_cnt <= 4'd0;          else            drive_cnt <= drive_cnt;        end        CTRL_ACK    :     drive_cnt <= 4'd0;        HADDR       :     begin          if (flag_low == 1'b1)            if (drive_cnt < 4'd8)              drive_cnt <= drive_cnt + 1'b1;            else              drive_cnt <= 4'd0;          else            drive_cnt <= drive_cnt;        end        HADDR_ACK   :     drive_cnt <= 4'd0;        LADDR       :     begin          if (flag_low == 1'b1)            if (drive_cnt < 4'd8)              drive_cnt <= drive_cnt + 1'b1;            else              drive_cnt <= 4'd0;          else            drive_cnt <= drive_cnt;        end        LADDR_ACK   :     drive_cnt <= 4'd0;        WR          :     begin          if (flag_low == 1'b1)            if (drive_cnt < 4'd8)              drive_cnt <= drive_cnt + 1'b1;            else              drive_cnt <= 4'd0;          else            drive_cnt <= drive_cnt;        end        WR_ACK      :     drive_cnt <= 4'd0;        STOP        :     drive_cnt <= 4'd0;        RD_START    :     drive_cnt <= 4'd0;        RD_CTRL     :     begin          if (flag_low == 1'b1)            if (drive_cnt < 4'd8)              drive_cnt <= drive_cnt + 1'b1;            else              drive_cnt <= 4'd0;          else            drive_cnt <= drive_cnt;        end        RD_CTRL_ACK :     drive_cnt <= 4'd0;        RD          :     begin          if (flag_high == 1'b1 && drive_cnt < 4'd8)            drive_cnt <= drive_cnt + 1'b1;          else            if (flag_low == 1'b1 && drive_cnt == 4'd8)              drive_cnt <= 4'd0;            else              drive_cnt <= drive_cnt;        end        NO_ACK      :     drive_cnt <= 4'd0;        default     :     drive_cnt <= 4'd0;      endcase  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      temp <= 8'd0;    else      case (c_state)        IDLE          :     temp <= 8'd0;        START         :     begin          if (flag_high == 1'b1)            temp <= {slave_addr, 1'b0};          else              temp <= temp;        end        CTRL          :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            temp <= temp << 1'b1;          else            temp <= temp;        end        CTRL_ACK      :     begin          if (flag_high == 1'b1 && iic_sda == 1'b0)            if (addr_sel == 1'b1)              temp <= addr[15:8];            else              temp <= addr[7:0];          else            temp <= temp;        end        HADDR         :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            temp <= temp << 1'b1;          else            temp <= temp;        end        HADDR_ACK     :     begin          if (flag_high == 1'b1 && iic_sda == 1'b0)            temp <= addr[7:0];          else            temp <= temp;        end        LADDR         :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            temp <= temp << 1'b1;          else            temp <= temp;        end        LADDR_ACK     :     begin          if (flag_high == 1'b1 && iic_sda == 1'b0)            if (wren == 1'b1)              temp <= wdata;            else              temp <= {slave_addr, 1'b1};          else            temp <= temp;        end        WR            :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            temp <= temp << 1'b1;          else            temp <= temp;        end        WR_ACK        :     temp <= 8'd0;        STOP          :     temp <= 8'd0;        RD_START      :     temp <= temp;        RD_CTRL       :     begin          if (flag_low == 1'b1 && drive_cnt < 4'd8)            temp <= temp << 1'b1;          else            temp <= temp;        end        RD_CTRL_ACK   :     temp <= 8'd0;        RD            :     begin          if (flag_high == 1'b1 && drive_cnt < 4'd8)            temp <= {temp[6:0], iic_sda};          else            temp <= temp;        end        NO_ACK        :     temp <= 8'd0;                default       :     temp <= 8'd0;      endcase  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      iic_done <= 1'b0;    else      if (c_state == STOP && flag_high == 1'b1)        iic_done <= 1'b1;      else        iic_done <= 1'b0;  end  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      rdata <= 8'd0;    else      if (c_state == RD && flag_low == 1'b1 && drive_cnt == 4'd8)        rdata <= temp;      else        rdata <= rdata;  end  endmodule




  • RTL仿真設計

在仿真時,需要外部提供ACK。如果直接仿真的話,由于外部沒有提供ACK,導致一直都會重復發送一小段。在仿真中,我們自己給出ACK的難度也比較大。


24LC64的廠商幫我們解決了這個問題,他們在造出這個芯片的同時,還設計出了可以幫助我們仿真調試的verliog模型。此模型放在msim->24LC64_sim_module中,文件名字為24LC64.v。此模型的sda也是雙向IO,所以在硬件設計時,會在此IO上加上拉電阻,在仿真時,我們也要模擬上拉電阻。


仿真設計如下:

`timescale 1ns/1ps
module iic_drive_tb;
  reg               clk;  reg               rst_n;    reg               start_flag;  reg     [6:0]     slave_addr;  reg               wren;  reg               addr_sel;  reg     [15:0]    addr;  reg     [7:0]     wdata;    wire              iic_scl;  wire              iic_sda;    wire              iic_done;  wire    [7:0]     rdata;    pullup(iic_sda);    iic_drive iic_drive_inst(
      .clk            (clk),      .rst_n          (rst_n),            .start_flag     (start_flag),      .slave_addr     (slave_addr),      .wren           (wren),      .addr_sel       (addr_sel),      .addr           (addr),      .wdata          (wdata),            .iic_scl        (iic_scl),      .iic_sda        (iic_sda),            .iic_done       (iic_done),      .rdata          (rdata)    );      M24LC64 M24LC64_inst(      .A0             (1'b0),       .A1             (1'b0),       .A2             (1'b0),       .WP             (1'b0),      .SDA            (iic_sda),       .SCL            (iic_scl)    );
  initial clk = 1'b0;  always # 10 clk = ~clk;    initial begin    rst_n = 1'b0;    start_flag = 1'b0;    slave_addr = 7'b1010_000;    wren = 1'b0;    addr_sel = 1'b1;    addr = 16'h5555;    wdata = 8'haa;    # 201    rst_n = 1'b1;    # 200;    @ (posedge clk);    # 2;    start_flag = 1'b1;    wren = 1'b1;    @ (posedge clk);    # 2;    start_flag = 1'b0;        @ (posedge iic_done);    # 200;    @ (posedge clk);    # 2;    start_flag = 1'b1;    wren = 1'b0;    @ (posedge clk);    # 2;    start_flag = 1'b0;        @ (posedge iic_done);    # 200    $stop;  end
endmodule


pullup(iic_sda):將iic_sda上加上拉電阻。

仿真時,在地址16’h5555(雖然高三位沒有用),寫入了8’ha;寫入完成后,又將此數據讀出。

當對24LC64進行寫入之后,它會進入到一個內部寫循環(和flash類似),在此期間,不接受任何指令。所以在仿真時,需要等待寫循環完成,時間為5ms(此參數在仿真模型中,可以進行修改)。

寫入的仿真圖如下:


讀出的仿真圖如下:


  • 板級測試

上述的設計在使用時會有上游控制器進行控制,所以板級測試還需要設計控制器。在控制器中只需要某一個地址寫入數據,然后讀出即可。測試時,可以多次更換地址和數據,保證設計的正確性。


在測試時,將slave_addr、addr_sel、addr、wdata設置為定值。slave_addr為7’b1010_000,addr_sel為1’b1,addr為16’h5555,wdata為8’haa。


將上有控制器命名為test_ctrl,頂層命名為test。


test_ctrl模塊采用狀態機設計實現。


test_ctrl的設計代碼如下:
module test_ctrl (
  input   wire                clk,  input   wire                rst_n,    output  reg                 start_flag,  output  reg                 wren,    input   wire                iic_done,  input   wire    [7:0]       rdata);
  localparam      WR           =   4'b0001;  localparam      WR_WAIT      =   4'b0010;  localparam      RD_WAIT      =   4'b0100;  localparam      TESTDONE     =   4'b1000;    reg             [3:0]       c_state;  reg             [3:0]       n_state;    always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      c_state <= WR;    else      c_state <= n_state;  end    always @ * begin    case (c_state)      WR        :   n_state = WR_WAIT;      WR_WAIT   :   begin        if (iic_done == 1'b1)          n_state = RD_WAIT;        else          n_state = WR_WAIT;      end            RD_WAIT   :   begin        if (iic_done == 1'b1 && rdata == 8'haa)          n_state = TESTDONE;        else          n_state = RD_WAIT;      end            TESTDONE  :   n_state = TESTDONE;          default   :   n_state = WR;    endcase  end
  always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      start_flag <= 1'b0;    else      if ((c_state == WR) || (c_state == WR_WAIT && iic_done == 1'b1))        start_flag <= 1'b1;      else        start_flag <= 1'b0;  end    always @ (posedge clk, negedge rst_n) begin    if (rst_n == 1'b0)      wren <= 1'b0;    else      if (c_state == WR || c_state == WR_WAIT)        wren <= 1'b1;      else        wren <= 1'b0;  end   endmodule

test模塊負責將test_ctrl和iic_drive模塊進行例化連接。將test模塊設置為頂層。


test模塊設計代碼如下:

module test (
  input     wire              clk,  input     wire              rst_n,    output    wire              iic_scl,  inout     wire              iic_sda);
  wire                        start_flag;  wire                        wren;  wire                        iic_done;  wire        [7:0]           rdata;    test_ctrl test_ctrl_inst(
      .clk          (clk),      .rst_n        (rst_n),            .start_flag   (start_flag),      .wren         (wren),            .iic_done     (iic_done),      .rdata        (rdata)    );      iic_drive iic_drive_inst(
      .clk          (clk),      .rst_n        (rst_n),            .start_flag   (start_flag),      .slave_addr   (7'b1010_000),      .wren         (wren),      .addr_sel     (1'b1),      .addr         (16'h5555),      .wdata        (8'haa),            .iic_scl      (iic_scl),      .iic_sda      (iic_sda),            .iic_done     (iic_done),      .rdata        (rdata)    );    endmodule


板級測試采用邏輯分析儀測試。


采樣時鐘選擇外部的50MHz,采樣深度選擇32K。


觸發位置選擇post。


將iic_sda、iic_scl、test_ctrl模塊中的RD_WAIT和TESTDONE兩個狀態,共計四個信號進行觀測。

將RD_WAIT設置為上升沿觸發。進入此狀態時,剛剛寫入完成。


點擊觸發后,按一下復位鍵。


從波形圖中,可以分析出,在地址16’h5555中寫入了8’haa。

將RD_WAIT設置為donot care,將TESTDONE設置為上升沿,此時讀出剛剛完成。


觸發后,按一下復位按鍵。


可以看出在地址16’h5555的位置,讀出aa。


注意發送時,是在SCL的低電平的正中間;接收是在SCL的高電平的正中間;觀看波形時,要和標準的時序圖進行對比。


證明設計正確。



- End -

福利】:QQ交流群173560979,進群備注名字+學校/企業。
淘寶店鋪:https://shop588964188.taobao.com
論壇網址:www.sxznfpga.com
叁芯智能FPGA課程


往期精選 

【免費】FPGA工程師人才招聘平臺

FPGA人才招聘,企業HR,看過來!

系統設計精選 | 基于FPGA的實時圖像邊緣檢測系統設計(附代碼)

基于原語的千兆以太網RGMII接口設計

時序分析理論和timequest使用_中文電子版

求職面試 | FPGA或IC面試題最新匯總篇

資料匯總|FPGA軟件安裝包、書籍、源碼、技術文檔…(2025.02.19更新)

FPGA技術江湖廣發江湖帖

無廣告純凈模式,給技術交流一片凈土,從初學小白到行業精英業界大佬等,從軍工領域到民用企業等,從通信、圖像處理到人工智能等各個方向應有盡有,QQ微信雙選,FPGA技術江湖打造最純凈最專業的技術交流學習平臺。


FPGA技術江湖微信交流群

加群主微信,備注姓名+學校/公司+專業/崗位進群


FPGA技術江湖QQ交流群

備注姓名+學校/公司+專業/崗位進群

FPGA技術江湖 任何技術的學習就好比一個江湖,對于每一位俠客都需要不斷的歷練,從初入江湖的小白到歸隱山林的隱世高人,需要不斷的自我感悟自己修煉,讓我們一起仗劍闖FPGA乃至更大的江湖。
評論
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 121678瀏覽
  • 在芯片總成本中占比不到 1%,卻可能因一處品質偏差導致整片晶圓報廢——半導體切割/研磨膠帶,正隨著先進封裝的爆發,成為封測產線選型中最謹慎對待的耗材之一。但鮮有人注意到,決定這層膠帶性能上限的,是上游一層更薄的基膜。這個長期由日本企業主導的隱形環節,正在出現國產突圍的信號。一、需求之變:先進封裝與“韜定律”重塑膠帶市場AI 算力芯片、HBM 高帶寬存儲、Chiplet 芯粒等先進封裝產品持續放量,國內封測產線擴產節奏不減。作為晶圓減薄與切割工序的必需耗材,晶圓膠帶的需求同步擴容。據 QYRese
    芯膜前沿 2026-07-31 16:35 287瀏覽
  • 光芯片,正在從光模塊的“配角”逆襲為AI產業鏈的“命門”2026年3月,英偉達一紙公告震動整個光通信行業——分別向Lumentum和Coherent各投資20億美元,合計40億美元。這哪是什么財務投資,這是一次對AI基礎設施關鍵環節的“掐尖式”卡位。光芯片,這個曾經被市場當作光模塊BOM表里一個標準配套元器件的東西,正在成為AI產業鏈上“卡位”最強、話語權最硬的環節。一、為什么是光芯片?老黃早就把話挑明了英偉達CEO黃仁勛的原話是:數據傳輸速度已成為人工智能發展的新瓶頸。AI集群從萬卡級往十萬卡
    用戶1774416745629 2026-07-31 11:22 291瀏覽
  • 今年好幾個客戶都問過我同一件事。藍牙音頻產品到底用 WT2605 這種單芯片,還是老老實實 MCU 外掛藍牙模組。兩種方案我都落地過,說點實在的,WT2605 剛出來那陣我也犯嘀咕,怕是營銷噱頭,真拿來做完一版樣機才服氣。一、選型先看三個維度外圍數量。這是最直觀的。傳統做法是 MCU 加藍牙模組,再加音頻編解碼、功放、晶振和一堆阻容,板子上密密麻麻十幾二十顆料。WT2605 把藍牙、解碼、功放全收進一顆,外圍就剩少量被動件。開發周期。傳統方案得自己接藍牙協議棧,配網、A2DP 解碼、音頻通路一一
    唯創知音語音芯片 2026-07-31 16:35 344瀏覽
  • 摘要防爆自控系統同時布設本安信號、工業總線、動力供電三類線路,僅依靠標識標牌管控插接極易出現人為錯插問題,高壓動力回路竄入本安弱電回路會突破安全柵限能標準,產生點火風險。依托 A、D、K 標準化機械防呆編碼體系,搭配護套顏色區分管理,適配 3 針 3 孔免焊接冷壓增安型防爆航插、5PIN 總線防爆航空插頭、8 芯焊接防爆法蘭插座的選型使用,從物理結構層面杜絕防爆接近開關連接器、防爆傳感器航插接頭混用插接問題,補齊防爆系統被動安全防護體系。關鍵詞圓形防爆連接器,防呆編碼防爆航插,防爆航空插頭,防爆
    kyfbest科迎法電氣 2026-07-31 18:29 291瀏覽
  • Synopsys 這次沒有再給行業看一條只能站在展臺邊圍觀的 demo。7 月 27 日,Synopsys 在 DAC 2026 期間公布兩條 autonomous EDA workflow:一條處理 debug closure,另一條處理 implementation and closure。客戶可以通過 Synopsys 申請在 Microsoft Discovery 上評估,AMD 正在評估這些工作流能否用于下一代產品開發。公告里最扎眼的是 25%–40%。Synopsys 稱
    麒芯說AI 2026-07-31 14:21 181瀏覽
  • 智能寵物用品這幾年快速普及,自動清理幾乎成了智能貓砂盆的標配。貓咪用完離場,設備自動翻轉清理,養寵家庭省去了每天彎腰清理的麻煩。但自動清理的第一步,是先準確判斷貓到底在不在盆里。這個看似簡單的問題,在小空間里并不容易做好。近場檢測的痛點:距離太遠反而誤事貓砂盆內部空間有限。如果傳感器的檢測距離設得偏大,盆外路過的貓、人甚至物品都會被誤判為貓在盆內,結果該清理時不清理、不該清理時亂清理,體驗直接崩壞。這類產品的核心訴求其實就一句話:近距離、小范圍、精準識別,不能有半點誤判。常規感應方案常因檢測距離
    唯創知音語音芯片 2026-07-31 16:51 236瀏覽
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 121405瀏覽
  •     長期專注WiFi領域,也算是行業老兵了!同行閑聊中,時不時能提起我和我們!從疫情起,國產替代風生水起,起起落落,大浪淘沙,生存下來的都是強者!    WiFi模塊應用廣泛,對于高端市場和特定市場,要求WIFI模塊需要過CE/FCC之類的認證,也就是說沒有認證的模塊,不具備導入產品設計.接下來就和大家聊聊認證模塊選型參考!    WIFi模塊硬件方面主要考慮以下九點特性:    1
    納拓科技 2026-07-31 17:56 151瀏覽
  • 在EMC測試過程中,傳導發射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 337瀏覽
  • 行業痛點凸顯,飛凌嵌入式FET3572-C重磅登場工業4.0與AIoT發展下,嵌入式核心板作為設備“工業大腦”,面臨性能與功耗的雙重考驗——既要支撐復雜算法和多路數據處理,又要兼顧便攜設備、工業終端的低功耗需求,傳統核心板“高性能必高功耗”的困境制約設備升級。為此,飛凌嵌入式推出基于RK3572處理器的FET3572-C核心板,以2×Cortex-A73+6×Cortex-A53八核架構為核心,實現“性能翻倍、功耗減半”的突破,為中高端嵌入式場景提供優質算力底座。八核異構架構,解鎖性能功耗最優解
    飛凌嵌入式 2026-07-31 09:47 183瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 游戏| 欧洲N00N兽交剧| 《我们的秘密》插曲| 法政先锋第三部粤语| 法国航空6| 我的好妈妈简谱| 山海情剧情介绍| 年轻的空姐4| 《三点》电影在线观看| 请问还有哪里需要加强| 麦乐迪马克斯女超人满天星电影在线观看 | 里面也好痛第二季| 四大名捕演员| 香椿芽的储存方法| 中国航母全cg动画宣传片| 麦乐迪超人| 欧美战狼8影免费完整版下载| 高清恶魔搬进来了| 连续7天失去理智的日剧是第几集| 沉默羔羊| 弥勒县| 不在犯罪现场电视剧| 陷阱韩国版在线看| 兔子先生免费全集在线观看| 在心里从此永远有个你 高安 | 牙医赤子板栗完整版在线观看| 环翠峪门票| 满仓进城免费观看全集完整版| 在出差期间被讨厌上司欺负| 张警官| 《交换:完美的邻居》高清| 马某某事件是谁| overflower动漫第1集到第8集| 专家谈济南不明飞行物坠落| 妈妈的职业电影免费版观看| 美丽蜜桃5| 少年阿宾20| 《县委大院》免费观看| 不当军事行为2017法版迅雷磁力| 斩神之凡尘神域| 《女生宿舍》2免费观看| 部长来家| 等一个晴天说再见| 《烧酒战争》| 美国爸爸的种子免费观看电视剧| 风中奇缘全集| 公交车扒开稚嫩挺进去J赵知梨| 萌宝找妈咪:仙帝奶爸全集免费 | 味想天开粤语| 肉蒲团极乐宝鉴| 青梅竹马是消防员无删1| 《爱我几何》法国完整版| 《以你的心诠释我的爱》| 万能阿曼动画片全集| 满天星版《荒岛女儿国》在线观看| 入青云免费观看全集完整版| 后院露营| 美式保罗2在线观看免费| 女心理师电视剧免费观看完整版| 《熊出没之年货》电影免费观看| 香醇绣感2普通话版剧情介绍| 天下足球 歌曲| 真假千金:真神大佬短剧全集| 人猿泰山(大人版)意大利在线观看| 《特殊的精油按摩》6| 最美孝心少年2020颁奖典礼| 做aj的电视剧大全免费观看中国人 | 四个贵妇精油按摩电影免费播放 | 武藤兰 下载| 至尊红颜贾静雯版高清| 藏精阁在线观看| 掌中之物西班牙版本无删减 | 《兄妹》电影完整版| 巴萨0-4皇马| 新红楼梦徐锦江| 因为爱情有幸福电视剧| 传奇大掌柜剧情| 禁忌03| 新包青天在线观看免费完整版| 女版斯巴达真人版在线观看| 解读西游记| 知否知否应是绿肥红瘦观看| 《饥饿难耐2》| 斗罗大陆唐门英雄传| 了不起的盖茨比 快播| 陪部长出差韩国电影| 高清命悬一枪未删减| 富爸爸大预言| 性的暴刑| 别和陌生人跳舞全集| 了不起的菲丽西高清电影免费完整版| 加勒比女海盗1在线观看| 绿箭侠3| 漂亮的保姆免费看中文| 极速影视三个女人精油按摩| 猫和老鼠全集| 上错花轿嫁对郎电视剧全集观看| jizzm日本| 荒岛惊魂未删除版| 熊出没之过年全集播放| 韩国电影温泉酒店的特殊待遇 | 父母爱情在线观看全集完整版电视剧| overflower第一季在线观看完整版| 天敌 电视剧| 因为想你泰剧在线观看完整版免费| 007女版满天星| 《黑玫瑰公寓》动漫| 年少有为不自卑| 丈夫上司装饰品的妻子演员表| 神医嫡女:王爷请自重短剧全集| 地狱之歌ova高清| 金瓶梅电视剧免费观看全集完整版 | 四月一日灵异事件簿·继动漫| 《丰满的继牳2》| 电影三毛从军记| 生死卧底全集| 公的浮之手中字舅舅| 亲爱的x| 爱情悠悠药草| 高清强制窃贼未删减| 线切割教程| 闪婚媳妇得宠坏全集免费播放| 墨雨人间电视剧在线观看| 拳击手在线观看| 纯真的年代全集| 电视剧捍卫者在线观看| 垌头剧集网三姐妹| 安娜贝尔3| 魔法科高校的劣等生2| 法国空姐3免费高清原声满天星观看 | 突然之间 莫文蔚| 真爱至上电影| 50岁大胸继拇5中文| 扫黑风暴全集观看| 韩剧我的妈妈| 图书馆里的女友动漫1-6集全集免费观 | 私人女性监狱完整版观看免费| 勇敢的心电影在线观看免费完整版| 法证先锋3在线观看| 铿锵锵锵锵免费看| 全身按摩调情视频| 泰版流星花园16集免费观看| 人妻初次按摩2在线观看| 朴妮唛迅雷种子| 创造营亚洲版2024在哪里看| 法老荒史在线观看免费版高清| 微电影上位| 高清《私生活》电影| 经典娃娃脸电影| 沙雅县| 你好李焕英在线观看免费版| 黑镜第五季| 特殊治疗6| 都市风水师全集| 《欢乐家长群》全集播放| 悬崖电视剧在线观看免费完整版| 俘虏之锁未删减版在线观看| 菲律宾电影《女仆》播放| 十大满清酷刑2| 美妙旋律第二季44| 日本韩国免费看的电影电视剧| 功夫熊猫电视剧| 电视剧妈妈无罪| 秋瓷炫《生死决断》播放片段 | 圆桌派最新一季2024| 莉娅戈蒂黑白配在线观看| 幸福照相馆的演员| 美国大选首场辩论| 《我的娜塔莎》电视剧| 黑道风云二十年第二部| 一代枭雄全集bt下载| 唯我独神动漫在线观看国漫| 济公传奇2| 返老还童的电影| 麻豆《维修艳遇》在线| 你微笑时很美23集免费观看| 聪明的一休国语版免费观看| 商务旅行戴帽子在线观看完整| 小凉宫春日的忧郁| 监狱风云3国语完整版播放| 加勒比女海盗1美版免费法国空姐 朴英善《爱的释放》歌曲 | 上党梆子打金枝| 美国1—5普通话免费| 爱情与灵药| 醉后决定爱上你| 木下檀檩子电影在线| 欢迎来到东莫村| 深情眼在线观看电视剧| 希望爸爸播种普通话版 | 电视剧枪神| 私人航空在线观看| 庆余年第2部| 幸福归来电视剧免费观看完整版| 五福星全集| 酒店1-100集完整版| 人蛇欲血战之错体美女蛇| 爱的妇产科| 爱在几何完整版| 二婶电视剧在线观看| 阿姨大小姐| 一起愁愁在线观看完整版电视剧| 再来一次在线观看电影| 死神来了4高清版在线观看| 暗黑森林满天星版美国| 魔女宅急便国语| 艾玛 德考尼斯| 电影瑜伽教练在线观看整板| 《二对一的商务模式2》中文| 上瘾泰国版电视剧| 怎样打中国结| 黑白配高清在线免费观看| 东北往事第二部| 派出所的故事| 女子护卫队满天星1973电影| 沈逸三妹泳装照片高清| 中华大丈夫电视剧| 新还珠穿帮镜头| 日本三级维修工的艳遇| 高清《堕落》| 王宝强春晚三个节目| 花房姑娘第五季免费大全好看| 特警队电视剧免费观看完整版 | 女法医短剧全集| my盛lady电视剧| 遂宁市| 诱惑韩语学校 电影| 731实验女子配狗生出什么| 水上人家| 啄木鸟壮志凌云法版免费观看完整版 | 荣昌县| 去有风的地方1–40集免费观看| 祷告良辰歌| 北方影院之错缘| 高清《飞驰人生2》在线观看地址| 战狼6国语高清无广告| 今夜无人入睡免费观看动漫第9集| 悄悄地喜欢你免费观看| 爸爸要你的种子| 高清搜神记| 人妻互换日韩| 启航当风起时| 义姐是不是良喂授动漫| 半夜凌晨三点看的电影| 粤语dj串烧| 伊万娜·巴克罗满天星| 苹果电影片| 《凤凰台上》免费观看| 《房屋销售员》| 速度与激情3高清版| 能登的新娘| 长大后电影| 高清原始战争| 嫣语赋电视剧在线高清免费观看| 真爷们儿电视剧全集| 台湾女星高蕾雅宣布怀孕| 相游戏在线观看| 都市欺诈| 密室大逃脱第二季| 邓家佳《除却巫山》在线| 卿本佳人在线观看免费国语电影 | 《丰胸沙龙治疗3》HD无字高清完整版| 无心法师11一20集免费| 儿子妈妈免费观看大全电视剧| 《外卖员的艳遇》| 情事在线观看无删减完整版韩国| 野店百度影音| 所罗门王凯恩| 电影伦理片高压监狱免费| 母亲5免费完整高清电视剧在线看| 战狼6免费观看完整版高清| 家庭计划免费观看完整版电影| 最后一张签证| 了凡四训电视剧| 韩国电影售楼处的秘密 | 岁末一过举世欢打一四字祝福语| 插曲的痛第9集免费资源| 与凤行电视剧大全免费版| 周末情人别爱我| 凯登克劳斯电影大全在线观看完整版| 毒刺电视连续剧全集免费观看| 电影营销技巧未删减巴西| 宰相刘罗锅40集在线观看| 免费观看三年大片完整版电影| 破晓之爱| 女性治疗营| 南海归墟16集在线播放免费| 不当军事行为2017| 秋瓷炫生死决断电影在线| 我想打死你| 电影《误杀3》免费| 电影芳香| 丈夫属下占用妻子电影| 火影忍者忍者之路完整免费观看| 恋恋茶园电视剧免费| 战狼9欧式少女战狼十二| 法医王妃:验尸断案无人及短剧全集| 安丘市| 一仆二主百度影音| 灭火宝贝电影在线看完整版高清| 祖孙3人遭杀害凶手曾买寿衣| 法国电影亲密| 哪吒闹海2之魔童闹海免费观看| 智者无敌1-40集全免费| 高清《寂寞的寡妇》电影| 少年派2电视剧完整版| 公主恋人ova| 少女的5| 在线播放国风按摩院 春宵一克值千金 第1集 - 高清资源 - 大鸟视频 | 说谎的爱人在线观看| 美国式保罗1原版| 金瓶梅完整版百度影音| 偶像运动会120725| 斗罗大陆漫画77| 地下美人电影完整版| 新撰组异闻录 铁| 英雄联盟连续剧| 金银梅普通话版在线播放| 匆匆的青春在线观看完整版免费 | 沧元图动漫第60集| 斗破苍窘| 俄罗斯需要爸爸的播种| 儿童歌曲快乐的节日| 理伦片驯服小峓子3| 灿烂的电视剧在线观看| 《满天星母与子》| 满清十大酷刑电影| 警察故事2013粤语| 《特战荣耀》在线播放| 高清正在缩小的男人未删减| 此时此刻在线观看| 罗丽星克莱尔总统夫人免费观看 | 愉悦与苦痛下载| 一人之下电视剧免费观看全集高清| 空中堡垒| 人民的名义 dvd| 第一拽妃txt下载| 小姑娘1中汉字| 新来的社长是风间由美| 遥远时空中2| 超级教师电视剧| 滑精怎么办| 暮光之城4 破晓 上| 情刺是哪一年上映的影视作品| 女律师的堕落日本| 侵犯女律师在线| 美景之屋6版本全集在线观看| 电影长津湖在线观看| 父子全集| 鬼吹灯之精绝古城全集| 369免费电影。你懂得| 舞出我人生电影| 销售的销售秘密6| 下家三千金| ovoerflower动漫第一季免费观看中文版 | 《语义错误》第二季| 小超的农村事| 贝茨旅馆第三季| 日本电影《叔嫂恋曲》中字| 终末的女武神第二季观看| 《秘密搜查官》免费观看| 青春在线观看| 杨丽萍 春| 尼古拉斯尼克贝| 电视剧双响炮| 电影朋友的妈妈| 美景之屋2在线观看高清未删减| 她被搬运工侵犯在线观看| 燃冬电影高清在线观看免费| 金银梅5普通话国语版免费播放| 教室那一间| 宁陕县| 三生三世枕上书全集免费观看| 带货女王:直播卖出一个亿全集免费 | 荣誉守则2012h版链接| 子弹慢镜头| 需要爸爸的种子电影| 整容天后完整版视频| 蛇舌完整版| 跨界冰雪王| 徐娇成绩全a| 《超女麦乐迪》| 永不灭的番号| 需要爸爸播种子-在线追剧| 如果一生有你陪| 白峰美羽| 法医秦明第一季无删减版资源 | 破冰行动在线| 向往的生活第5季| 私人航空电影免费观看| 男生和女生愁愁愁电视剧在线观看网页版 | 《环太平洋2》完整版在线观看| 韩国电影朋友家的麦子| 向往的生活第7季| 日本空姐2019满天星法版:星辉照耀下的 | 《法国空乘4》免费播放| 恋爱恐惧症| 飞狐外传电视剧| 玛戈没钱了| 绝地求生刺激战场国际服| 韩国女销售的销售秘密| 绝地枪王2免费观看高清| 法国版《高压监狱2》| 黑妞基地| 六安市| 短剧短剧| 天天向上20120330| 免费观看在线高清电视剧快剧屋| 年轻的小瘦子5| 金瓶梅高清完整版百度影音| 第三按摩室| xl号司令动漫全集免费在线观看| 爱情大片免费观看全集| xxxx美国在线观看| 妈祖电视剧全集百度影音| 西游记2010版| 无法忍受电影| 奇异博士3电影免费观看| 木下檩檩子电影免费观| 陆战之王电视剧免费观看| 雅典娜 歪歪| 堕落的女律师韩版电视剧免费播放| 变异巨蟒在线播放| 空蝉之森手机免费观看| 五年级数学试卷分析| 长相思2在线观看全集免费播放| 北上广依然相信爱情免费观看电视剧| 电影《小王子》中文版| 暴躁老姐免费观看40集电视剧| 龙与虎下载| 被躁BD水电工在浴室| 美国大选11月5日宣布结果| 孩奴全集在线观看40| 寻清欢短剧免费观看| 返老还童电影| 精英部队| 鞠婧祎免费造梦在线观看| 《狂飙》在线| 斯巴达第4季免费观看完整版| 《伤爱罪》电影在线观看| 做aj的免费大全电视剧| 百万新娘之爱无悔61| 电视剧民工全集| 麦乐迪女超人无删减在线观看免费观看| 很想和你在一起国语| 女狙击手满天星在线播放| 身材最好的女明星| 向日葵高清免费观看完整| 叙利亚地图中文版| 再见再也不见| 需要爸爸的种子bd| 怒江之战全集免费播放| 得闲炒饭 下载| 麦乐迪家庭矛盾完整版在线观看 | 双世宠妃3免费观看完整版电视剧| 宇宙面包店未删减| 总统夫人的夜晚在线播放| 粉色大白菜(法国)完整板| 死亡诗社| 星座不求人| 璀璨人生有多少集| 屠场娃娃完整版高清播放| 霹雳惊涛| 春雨免费版在线观看全集电影 | 那年冬天风在吹电视剧| 新金瓶梅龚玥菲版| 灰姑娘满天星版在线观看| 恶魔高校2| 女教师日记3| 突如其来的假期电视剧免费观看| 点燃我温暖你电视剧在线| 女超人满天星版| 手机qq4.1| 魔法科高校的劣等生2| 山楂树之恋免费| 家族的荣光| 麦乐迪完整版在线| 长月烬明电视剧星辰影院| 不扣扣的女孩| 新三国糜芳| 卧鱼在线观看免费全集高清完整版| 凯帕克全集在线观看| 风起陇西免费观看完整版| 亲爱的麻洋街电视剧免费观看| 大红灯笼高高挂在线观看| 密爱 优酷| 韩国隐身帽子电影完整版| 武大的小姐姐们| 修仙小师妹:师兄都宠我短剧全集| 欧美满天星电影《maruzzella》是什么电 | 高福:长新冠是基本事实| 村妓经典k8| 四季歌简谱| 狐妖小红娘真人版电视剧免费观看| 原振侠与卫斯理| 我的父亲风华绝代短剧免费观看| 从江县| 林凡短剧免费观看全集| 京城绯闻电视剧| 女版《壮志凌云》杰西| 比天堂还美丽 电视剧| 霜花店无删减版| 三星滑盖手机| 你好 李焕英 在线播放| aj视频电视剧大全日本| 无我原非你| 央视元宵| 电影炸天小姐完整版免费观看| 军火女王 第二季| 旋风小子国语| 高清《神奇女侠》免费观看| 我 伊蒂丝女皇免费观看完整版 | 麦乐迪·马克斯家庭矛盾在线观看| 潘石屹是谁| 神马兄弟全集| 乡村爱情交响曲4| 斗罗大陆免费观看在线| 日本电影漂亮的售楼小姐| 超体西瓜影音| 焦急的罗曼史电视剧在线看 | 音乐老师水饺| 《热心的女邻居》电视剧| 《误杀3》电影超清免费观看| 极品教师第六季免费观看完整版| 我的青梅竹马是消防员未删减| 成武县| 绝世双骄主题曲| 《超体2:物质觉醒》在线观看 | 张震巩俐| 高清《阿诺拉》电影完整版| 《法国空姐2024法版》法国空姐| 蜜桃成熟时33d ed2k| 《炸天小姐》在线观看美国| 步步惊心电影| 黄昏恋电影| xl司令第一季动漫在线观看免 | 天津卫视非你莫属直播| 司藤电视剧在线观看免费完整版| 年轻的销售员8| 流星花园日版| 猎豹突击电视剧| 用手指扰乱我| 变形金刚故事| 《麦乐迪和父亲》完整版百度云| 豫剧名家名段唱段| 陈冠希道歉| 一个好妈妈8字头强华驿是第几集出现| 《陈宝莲版武则天秘史》 | 女超人麦乐迪法国电影无删减版| 铃芽之旅免费观看完整| 憎侣之夜| 乔丹扣篮| 玄女心经1免费观看全集| 花月佳期| 春咲梓美| 赤裸特工| 论坛| 一闪一闪亮星星电影| 游击兵工厂全集| 强伦轩办公室女教师| 同床异梦2 秋瓷炫| 开心超人| 军营女长官满天星演员表| 天赐之女| 芭比彩虹仙子之美人鱼公主| 麦乐迪女超人在线观看完整免费高清原声满天星百度网盘 | 准备击球电视剧| 日本混血大学生精油按摩| 郭有才诺言完整版| 那夜上错床| 《上门服务》菲律宾主演是谁 | 高清《善良的她》大结局| 啦啦队长| 《啄木鸟:军事不当行为》英文翻译| 老板办公室乳摸秘书gif动态图| 《逃犯》高清完整版| 高压监狱2高压法版| 号手就位剧情介绍| 分手达人| 特殊游泳教练免费| 水果宅急便| 别扭合租房电视剧免费观看策腾| 战争暴行女囚HD版| 吸血鬼偶像 电视剧| 山河令电视剧全集在线观看完整版| 北京寿桃| 霜花店未删减版在线观看高清| 战狼6免费高清版999加拿大版动漫 | 第五空间电视剧下载| 插曲的痛第60集免费看| 盗墓笔记有声小说艾宝良| 我的土地我的家| 茌平县| 美容院的待遇在线观看| 斗破乱世情| 食人鱼3d电影| 21世纪爱情指南免费版 | 特战荣耀 电视剧| 二十一世纪性格爱情指南英国| 和朋友换娶妻中字3| 甄嬛传48| 双人调教电影观看| 重生九零全集免费| 办公室里呻吟的丰满老师电影| 《落魄贵族琉璃川》动漫免费| 飘雪网在线观看免费完整版| 孤岛飞鹰 电视剧| 《法国航空3》电影| 电视剧成长全集| 宝贝女孩电影免费观看完整版高清 | 新逃学威龙张浩在线观看| 特殊诊所完整版中文版| 心跳漏一拍电视剧| 金瓶梅原著电视剧1| 《睫毛膏4》美国电影| 电影 金瓶梅| 灵璧一中| 《部长出差的日子》韩影| 意大利新增确诊2313例| 美洲杯2015| 麦乐迪马克斯满天星在线观看| 我爱张宝利国语版全集| 韩剧制造情缘| 《急诊护士在线观看| 爱恋2015无减删高清| 仙逆128集完全版播放| 罗莉星克菜尔电影在线观看| 包青天开封奇案| 雷军余承东李斌同框| 在姨母家的遗憾完整版播放| 阴阳眼见子未删减| 骆驼祥子高清电影免费观看完整版 | 爱情综合症前传电影| 希特勒回来了电影| 法国空姐中文免费高清原声高烧可以吃雪糕吗| 和女邻居做爰伦理| 痞子殿下| 航空服务韩剧电影| 《漂亮的保姆》韩国电影下载| 太阳之歌女主角| 爱丫爱丫兄妹在线影院电视剧,声声入| 高清《淡岛百景》电视剧| 李安 逝去的爱| 桃色凶器| 上瘾电视剧24集全| 夏目彩春57部在线电影| 时光倒流七十年电影免费观看| 法国空乘5免费高清原声满天星美版| 欧美A级做爰片纵情欲海2在线| 《黏糊糊的她》免费观看全集| 爱我几何完整版免费观看原声在线| 野火春风斗古城电视剧| 邻居的秘密| 村上里沙| 下水道人鱼在线| 秘书在办公室被躁BD在线小说| 爱在几何电影完整版免费观看 | 长相思第二季免费完整版| 2008新金银5国语版全集演员表 | 失落女人之家720p| 法国电影《女超人》麦乐迪免费观看| 成化十四年电视剧免费观看 | 夏家三千金全集下载| 陆小凤之大金鹏王| 阳光灿烂的日子完整版观看| 插曲的痛30全集免费观看高清版! 大兵的寝室线观看兵的寝室 | 战狼9免费高清版西瓜视频| 完美星球纪录片免费观看中文版| 同桌的你免费| 《酋长的女儿满天星》 | 特殊教练游泳| 浙江不明飞行物冲破云层坠落 | 蜘蛛侠2| 与讨厌的部长一起去出差旅| 电影《逆罪》免费观看| 从结婚开始恋爱免费播放电视剧| 高清《明珠奇谭》电视剧| 漂亮女朋友BD中文| 高清九条的大罪未删减| 电视剧免费观看全集在线观看| 女超人麦乐迪完整版观看| 魔鬼天使电影| 天注定免费完整版在线| 私人助理2法国版电影免费看 | 战狼9加拿大版高清版| 哈利波特与混血王子在线观看| 大秦帝国第二部在线观看| 东北小佛爷| 地爆天星意大利完整版| 女生按摩胸部电影免费观看| 情侣剧烈做运动的表情包| 一个妈妈的9中字头强华驿| 无上神帝动漫在线观看高清完整版| 天天鲁夜夜免费观看视频| 怪物转生在线观看| 美景之屋6:我的完美人生免费观看完整版 | 许我耀眼16集| 爱在春天电视剧| 昭和系列电影免费观看大全| 女人的村庄全集| 樱桃魔法| 免费看TVB片| 《茂盛的森林》电影在线观看 | 插曲的痛60集全剧情介绍 | 炸天小姐1983完整版在线看| 天骄 电视剧| 瑜伽起源真的很恶心| 女律师的堕落在线观看| 风水传人:看相改运我最行全集免费| 动画片大头儿子小头爸爸| 百日蔷薇动漫完整版免费观看| 按摩胸部 电影| 仙逆第122集在线观看| 大山的女儿全集免费播放在线观看| 老湿影院放映黒人男子,。大屌猛播美女髙清视频免费看 | 夺回千亿家产:私生女逆袭短剧全集 | 银翼杀手2049 电影| 阿修罗之怒音乐| 女子护卫队电影在线观看完整免费高清原声满天星| 《斯巴达1帝国女版》海盗在线观看 | 我的妈妈免费完整高清电视剧| 电影借种| 聊斋在线| 泰剧金螺全集中文字在线观看| 战狼9欧式少女在线观看全集高清美国| 入室强奸的三级片| 魔鬼恋人2| 商务部暂停天然砂对台湾地区出口| 电视剧《雪迷宫》32集播放 | 起床了小澈| 聊斋艳谭幽| 血滴子电影下载| 济公游记| 瓜达卢佩的玫瑰麻烦发看| 雪中悍刀行在线免费观看| 绝地枪王| 吉隆县| 731实验女子配狗生出什么| 中国散伙人| 《妻子2》在线观看免费版电视剧| 破产姐妹 第三季| 刘浮生全集免费观看| 电影《法国空少》免费观看| 性的暴行 在线观看| 竹夫人完整版| 热舞情天| 美国共和党领袖:已经炒了佩洛西| 锦绣安宁40集免费看| 特殊治疗医护3| 助理工的艳遇| 2001太空漫游电影| 剑道独尊全集免费观看| 离婚前规则主题曲叫什么| 异族通婚| 朝国年经的继4免费观看时间一| 小泽彻维修工的艳遇| 映山红简谱| 对你的想象在线观看| 电视剧陆贞传奇全集| 热辣滚烫在线观看电影免费播放| 水润的女人电视剧| 白峰美羽网盘| 绝命幽灵船电影未删减版在线观看| 风烟滚滚| 孤注一掷电视剧免费观看完整版国语| 金瓶双梅之鸳鸯戏床| 森奈奈子在线| 后宫露营第一季未增减0.0.0.对应第2集| 吉他精灵| 电视剧私藏浪漫| 致命弯道4高清全集| 春雨电影大全免费观看动漫版视频| 《年经继拇2》| 《安吉拉怀特》大尺度在线观看| 超星神国语版全集| 建议取消强制自动续费| 魔宫魅影| 走过柳源电视连续剧免费播放全集| 蒋玲玲版《渔夫的荒野食记》电影医| 交换上司秘书在线观看| 高清《惊天大贼王》| 好运查理| 今天的侦探| 上错花骄嫁对郎| 平罗县| 白峰国语版在线观看全集| 名侦探柯南国语全集| 银魂138| 像傻瓜一样去爱全集| 欢乐颂2| 青梅竹马是消防一季未增删| 秋瓷炫《生死决断》在线观看| 周弘电影在线观看免费| 特种部队火凤凰| 刀客家族的女人 电视剧| 林采缇视频种子| 《玛克辛》电影| 《超女麦乐迪》在线播放视频| 瓜达卢佩的玫瑰完整在线| 澡堂老板家的男人们| 电影《隐藏的迷恋》在线观看| 新警事电视剧| 浴血黑帮全季在哪能看| 丈夫的上司来家拜访韩国| 按摩5个混血儿| 库伊拉黑白魔女| 街机西游记| 枪口电视剧| 恋爱的发现 电视剧| 吴辰君电视剧| 《大兵的寝室》美剧全集免费观看| 忍不住的继拇HD中字5| 龚玥菲新剧全集在线观看高清| 法国《少女1979》完整版电影| 望向太阳电影| 我的妻子免费观看| 美国保罗2原版| 美容院特殊待遇在线观看电影| 聊斋先生25集全免费| 王牌部队第40集免费观看| 去有风的地方电视剧| 食人鱼3d电影| 都市猎人| 想要爸爸播种子苹果视频在线观看| 《牙医郝板丽1986版》电影免费观看 | 《丰胸沙龙治疗3》HD无字高清完整版| 蜜桃成熟时钟真| 时光正好电视剧免费观看全集高清 | 蛮荒禁地| 刀马旦电影| 深宫遗梦| 浴火奔腾1983美国版演员表 | 《百劫红颜》| 男女愁愁愁全集共多少集| 罪夜之奔| 烧饼皇后演员表| 法网柔情剧情| 电视剧江湖恩仇录| 顶尖飞行员2021完整版满天星 | 《黛比大战达拉斯》| 和老板在办公室BD 中文| 守卫者-浮出水面| 我的游泳女老师| 功夫道电影| 狂蟒之灾1国语版| 斗罗大陆免费完整观看171集| 韩剧我的小姑子2| 花子vs倔强驱魔师全集免费观看高清| 谈判专家粤语在线观看| 机械师2:复活 电影天堂| 我父亲的女保姆是我的首选评价| 动物世界性行为驴|