張文梅,劉 偉,褚越強
(1.中國人民解放軍93756部隊 電子教研室,天津 300130;2.北華航天工業(yè)學(xué)院 河北 廊坊 065000)
隨著嵌入式產(chǎn)品的不斷增多,因此構(gòu)建其系統(tǒng)所需的芯片種類也不斷增多,由于產(chǎn)品在體積和功耗等方面的約束,有時很難在市場上找到與其需求相對應(yīng)的芯片,基于這個需求,本課題用Verilog HDL在FPGA上設(shè)計了一個I2C Slave的控制器,用來控制一些低速的設(shè)備,以此來滿足產(chǎn)品對特定芯片的需求。
現(xiàn)場可編程門陣列FPGA (Field Programmable Gate Array)是一種可以編程的數(shù)字集成電路 IC(Integrated Circuit),它包含了可配置的邏輯塊以及邏輯塊之間的互連線。所謂的現(xiàn)場可編程是指設(shè)計人員可以通過在工作現(xiàn)場完成對這些邏輯塊和連線的配置,以實現(xiàn)或改變復(fù)雜的電子系統(tǒng)的功能。隨著半導(dǎo)體加工工藝的不斷發(fā)展,F(xiàn)PGA在結(jié)構(gòu),速度,工藝,集成度和性能等方面都有了極大的改進和提高。本課題使用的是Altera公司的Cyclone II系列的芯片,它采用全銅層、低K值、90 nm、1.2 V SRAM工藝設(shè)計,提供4 608~68 416個邏輯單元,嵌入了18×18位的乘法器、專用外部存儲器接口電路、4 kB存儲器塊、鎖相環(huán)和高速差分I/O接口[1]。
I2C總線是一種通行世界的低速接口標(biāo)準(zhǔn)。在消費類電子的領(lǐng)域里,雖然有許許多多不同的應(yīng)用,但是其組成卻常常是確定的器件,如微控制器、隨機存儲器、電子可擦除式可編程存儲器及一些特殊用途的集成電路。這些器件需能彼此溝通。溝通的方式,其電路的需求是降低設(shè)計成本和減小設(shè)計的復(fù)雜性[2]。飛利浦公司鑒于此,提出一種總線架構(gòu),這種總線架構(gòu)是一種兩條線雙向的設(shè)計,此種總線架構(gòu)被稱為是Inter IC的總線,又簡稱I2C總線。它的特點是:只有兩條導(dǎo)線,分別為串行數(shù)據(jù)線(SDA)及串行時鐘信號線(SCL),這兩條導(dǎo)線同時連接到總線上所有的Master和Slave,因此在同一時刻里,只會有一組Master和Slave在操作[3]。如果有一個以上的Master希望啟動Bus,I2C具有的仲裁機制可以避免數(shù)據(jù)碰撞或破壞數(shù)據(jù)。串行操作在標(biāo)準(zhǔn)模式下,速率可以達到100 kbit/s,在快速模式下,速率可達到400 kbit/s。采用I2C的原因是節(jié)省成本和提高設(shè)計上的簡易性,而非及高的頻寬,如果是對存儲器類的存取,就不適合采用I2C作為接口。
隨著嵌入式產(chǎn)品的不斷增多,因此構(gòu)建其系統(tǒng)所需的芯片種類也不斷增多,由于產(chǎn)品在體積和功耗等方面的約束,有時很難在市場上找到與其需求相對應(yīng)的芯片,基于這個需求,本課題用Verilog HDL在FPGA上設(shè)計了一個I2C Slave的控制器,用來控制一些低速的設(shè)備。以此來滿足產(chǎn)品對特定芯片的需求。
本課題設(shè)計了一個I2C Slave控制器用來從I2C總線上接收數(shù)據(jù),傳送的數(shù)據(jù)除了啟始位和結(jié)束位以外,還有兩個字節(jié)的有效數(shù)據(jù),其中第一個字節(jié)數(shù)據(jù)的前7位是用來確定與所設(shè)計I2C slave控制器進行通信的地址位,第8位是讀寫的標(biāo)志位。當(dāng)控制器接收到地址數(shù)據(jù)后會與自身的地址進行比較,如果一致,會接收總線上第2個字節(jié),第2個字節(jié)是對控制器進行操作的命令位,控制器接收到這個數(shù)據(jù)后也會對其進行分析,從中取出有效位,來完成對各個外設(shè)的控制。
整個設(shè)計分為5個模塊,一個模塊為從I2C總線上接收數(shù)據(jù),一個模塊為地址匹配模塊,當(dāng)?shù)刂菲ヅ涑晒髸{(diào)用命令匹配模塊對傳送過來的命令進行匹配,匹配成功后會將命令傳至?xí)r鐘模塊來驅(qū)動時鐘,在數(shù)碼管上顯示時間。還有一個分頻模塊用來給時鐘模塊提供所需要的頻率。其綜合后的電路如圖1所示。
圖1 頂層模塊綜合圖Fig.1 Top-level module synthesis figure
此模塊負責(zé)從I2C總線上接收數(shù)據(jù),具體的設(shè)計思路是設(shè)計一個狀態(tài)機,一共10個狀態(tài),分別為bit_idle,bit_7,bit_6,bit_5,bit_4,bit_3,bit_2,bit_1,bit_0,bit_ack, 當(dāng)總線上沒有數(shù)據(jù)時為bit_idle狀態(tài),它等待著總線上出現(xiàn)開始信號。當(dāng)開始信號出現(xiàn)后狀態(tài)機跳轉(zhuǎn)到bit_7狀態(tài),在此狀態(tài)里將總線上SDA數(shù)據(jù)線的數(shù)據(jù)存入寄存器變量data_in[7]里,然后跳轉(zhuǎn)到下一狀態(tài)繼續(xù)接收總線上的數(shù)據(jù),當(dāng)狀態(tài)跳轉(zhuǎn)到bit_0時,即從總線上接收了8位數(shù)據(jù)后。此時狀態(tài)機會跳轉(zhuǎn)到bit_ack狀態(tài),在這個狀態(tài)控制器發(fā)送一個確定信號來告訴主控端己經(jīng)收到8位數(shù)據(jù)。然后再跳轉(zhuǎn)到bit_7狀態(tài)繼續(xù)接收總線上的數(shù)據(jù)[4]。此模塊的綜合電路圖如圖2所示。
圖2 接收模塊綜合圖Fig.2 Receive module synthesis figure
當(dāng)接收模塊從總線上接收到第一個8位數(shù)據(jù)后,它將會發(fā)送一個addr_en的使能信號,使地址匹配模塊使能,接收來自接收模塊的數(shù)據(jù),將接收到的數(shù)據(jù)與自身的地址進行對比。用Quartus對地址匹配模塊代碼進行綜合,得出電路圖如圖3所示。
圖3 地址匹配模塊綜合圖Fig.3 Address match module synthesis figure
當(dāng)?shù)刂菲ヅ淠K將數(shù)據(jù)接收模塊傳過來的數(shù)據(jù)進行對比后,如果與自身地址一致,會發(fā)送一個addr_match為1的信號,此信號是命令匹配模塊的一個使能信號。數(shù)據(jù)接收模塊接收到的第二個8位數(shù)據(jù)是命令,當(dāng)它接收這個命令后會發(fā)送一個cmd_en信號,當(dāng)addr_match與cmd_en信號都為1時,此模塊才會將接收到的命令與自身所存儲的命令進行對比,如果與自身所存儲命令相一致,就會控制各個模塊按照接收到的命令完成各自的功能。
對此模塊代碼進行綜合,得出如圖4所示電路。
圖4 命令匹配模塊綜合圖Fig.4 Command match module synthesis figure
時鐘模塊通過接收來自命令模塊的命令對其進行驅(qū)動。時鐘模塊自身包括3個模塊,分別是小時計數(shù)器模塊,分計數(shù)器模塊,秒計數(shù)器模塊。而分計數(shù)器模塊和秒計數(shù)器模塊又分別包含6進制模塊和10進制模塊[5]。時鐘模塊所綜合出來的電路,如圖5所示。
圖5 數(shù)字鐘綜合圖Fig.5 Digital clock synthesis figure
由于時鐘模塊所需的頻率是1 Hz,而外界所提供的時鐘是50 MHz,所以需要將外界頻率分頻,然后再送入時鐘模塊。其綜合電路圖如圖6所示。
圖6 分頻模塊綜合圖Fig.6 Frequency divided module synthesis figure
本仿真平臺設(shè)計了模擬I2C信號的輸入信號,目的是測試各個模塊是否能正常工作,下面是設(shè)計的一個信號輸入模塊,此模塊提供 3個信號,SDA,SCL和 reset信號,如圖 7所示,總線上一共發(fā)送了兩個字節(jié)的數(shù)據(jù),分別是5D(0101_1101)和 AE(1010_1110)[6]。
圖7 激勵信號圖Fig.7 Stimulus signal figure
圖8中,data_out為數(shù)據(jù)接收模塊從總線上接收到一個字節(jié)數(shù)據(jù)后就會將輸出,由圖可見,數(shù)據(jù)接收模塊可以正確的從總線上接收數(shù)據(jù)。當(dāng)接收到第一個字節(jié)后,模塊會輸出addr_en信號,這是地址匹配模塊的使能信號,當(dāng)數(shù)據(jù)接收到第一個字節(jié)的數(shù)據(jù)后,會將其送入地址匹配模塊去匹配。當(dāng)數(shù)據(jù)接收到第二個字節(jié)后,會輸出cmd_en信號,這個信號是命令匹配模塊的使能信號。由圖可知,此模塊可以正確的接收數(shù)據(jù)。
圖8 接收模塊驗證圖Fig.8 Receive module verify figure
由圖9可知,當(dāng)?shù)刂菲ヅ淠K接收到數(shù)據(jù)接收模塊傳過來的數(shù)據(jù)并且使能信號addr_en為1時,它與自身的地址5d進行對比后,發(fā)現(xiàn)它們是一致的。即輸出成功匹配的信號addr_match。
由圖10可知,當(dāng)數(shù)據(jù)接收模塊接收到第二個字節(jié)ae后,它會輸出一個命令匹配模塊的使能信號cmd_en,命令匹配模塊會在cmd_en和addr_en為1時將從數(shù)據(jù)接收模塊得到的命令字輸出從cmd端口輸出。
圖9 地址匹配模塊驗證圖Fig.9 Address match module verify figure
圖10 命令匹配模塊驗證圖Fig.10 Command match module verify figure
綜上所述,本課題用Verilog在FPGA上設(shè)計了I2C slave控制器,可以彌補專用I2C芯片功能單一的不足。以往的I2C控制器一般都指的是主控制器,用來發(fā)送I2C數(shù)據(jù)給I2C的專用芯片,而此控制器是從控制器,主要是從總線上接收數(shù)據(jù)并對數(shù)據(jù)進行分析來控制與其相連的外設(shè)。本控制器的不足之處在于只能有寫操作,沒有讀操作,因此需要在后續(xù)的研究中繼續(xù)完善功能。
[1]田紅霞,戴彥,鹿玉紅.基于FPGA的RS232串行接口設(shè)計[J].煤炭技術(shù),2010,29(9):194-196.TIAN Hong-xia,DAI Yan,LU Yu-hong.Design method of RS232 serial interface based on FPGA[J].Coal Technology,2010,29(9):194-196.
[2]杜慧敏.基于Verilog的FPGA設(shè)計基礎(chǔ)[M].西安:西安電子科技大學(xué)出版社,2006.
[3]孫玥.I2C總線的單片機C語言的實現(xiàn)[J].民營科技,2009,20(12):37-38.SUN Yue.I2C bus of the microcontroller C language implementation[J].Journal of Private Technology,2009,20(12):37-38.
[4]夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計教程[M].北京:北京航空航天大學(xué)出版社,2009.
[5]羅杰.Verilog HDL與數(shù)字ASIC設(shè)計基礎(chǔ)[M].武漢:華中科技大學(xué)出版社,2008.
[6]吳繼華,王誠.Altera FPGA/CPLD設(shè)計(基礎(chǔ)篇)[M].北京:人民郵電出版社,2005.