名稱:溫度傳感器LM75溫度數(shù)碼管顯示(代碼在文末付費下載)
軟件:QuartusII
語言:Verilog
代碼功能:
讀取開發(fā)板上的溫度傳感器LM75的數(shù)值,并將溫度顯示在數(shù)碼管上。
本代碼已在開發(fā)板驗證,開發(fā)板資料:
FPGA代碼Verilog/VHDL代碼資源下載網(wǎng):www.hdlcode.com
部分代碼展示
module?LM75A_test(clk,rst_n,scl,sda,cs,seg); input?clk,rst_n;?//fu復位信號低電平有效,時鐘50MHz; output?scl;??//I2C時鐘,250KHz;時鐘周期為4us; inout?sda;???//I2C數(shù)據(jù)端; output[3:0]?cs;??//數(shù)碼管片選; output[7:0]?seg;??//數(shù)碼管段選; wire?done;????//?I2C讀取一個數(shù)據(jù)完畢,更新數(shù)碼管段選寄存器; wire[15:0]?data;//溫度數(shù)據(jù); //LM75的I2C接口控制 I2C_READ?I2C_READ( ????????.clk(clk), ?.rst_n(rst_n), ?.scl(scl),//I2C時鐘,250KHz;時鐘周期為4us; ?.sda(sda),//I2C數(shù)據(jù)端; ?.data(data)//溫度數(shù)據(jù); ??????????????); ?? //數(shù)碼管顯示 SEG_D??SEG_D( ???????.clk(clk), .rst_n(rst_n), .cs(cs),//數(shù)碼管片選; .seg(seg),//數(shù)碼管段選; .data(data)//溫度數(shù)據(jù)顯示 ?????????); endmodule //LM75的I2C接口控制 module?I2C_READ( ???????clk, rst_n, scl,sda,data ??????????????); ? ?input?clk;//總線時鐘?50MHz?? input?rst_n;//異步復位,低電平有效?? ?? output?scl;//SCL?時鐘?? inout??sda;//?SDA?數(shù)據(jù)總線?? output?[15:0]?data;//溫度數(shù)據(jù)?? ?? reg?[15:0]data_r;//溫度數(shù)據(jù)寄存器?? reg?scl;//SCL?總線寄存器?? reg?sda_r;//SDA?總線寄存器?? reg?sda_link;//SDA?總線數(shù)據(jù)方向標志?? reg?[7:0]scl_cnt;//SCL?時鐘產(chǎn)生計數(shù)器?? reg?[2:0]cnt;//用來標記SCL時鐘計數(shù)器?? reg?[25:0]timer_cnt;//定時器,每隔2s?讀取一次溫度數(shù)據(jù)?? reg?[3:0]data_cnt;//數(shù)據(jù)串并轉(zhuǎn)換寄存器?? reg?[7:0]address_reg;//器件地址寄存器?? reg?[8:0]state;//狀態(tài)寄存器?? //////////////////////////////////////////////////////////////////////////////////?? //進程1、2、3:產(chǎn)生SCL?總線時鐘?? always@(posedge?clk?or?negedge?rst_n)?? ????begin?? ????????if(!rst_n)?? ????????????scl_cnt?<=?8'd0;?? ????????else?if(scl_cnt?==?8'd199)?? ????????????scl_cnt?<=?8'd0;?? ????????else?? ????????????scl_cnt?<=?scl_cnt?+?1'b1;?? ????end?? always@(posedge?clk?or?negedge?rst_n)?? ????begin?? ????????if(!rst_n)?? ????????????cnt?<=?3'd5;?? ????????else??? ????????????case(scl_cnt)?? ????????????????8'd49:?cnt?<=?3'd1;//高電平中間?? ????????????????8'd99:?cnt?<=?3'd2;//下降沿?? ????????????????8'd149:cnt?<=?3'd3;//低電平中間?? ????????????????8'd199:cnt?<=?3'd0;//上升沿?? ???????????????default:?cnt?<=?3'd5;?? ????????????endcase
設計文檔:
1.LM75A簡介:
LM75A 是一個使用了內(nèi)置帶隙溫度傳感器和Σ-△模數(shù)轉(zhuǎn)換技術(shù)的溫度-數(shù)字轉(zhuǎn)換器。它也是一個溫度檢測器,可提供一個過熱檢測輸出。
LM75A 包含許多數(shù)據(jù)寄存器:配置寄存器(Conf),用來存儲器件的某些配置,如器件的工作模式、OS 工作模式、OS 極性和OS 故障隊列等(在功能描述一節(jié)中有詳細描述);
溫度寄存器(Temp),用來存儲讀取的數(shù)字溫度;設定點寄存器(Tos & Thyst),用來存儲可編程的過熱關(guān)斷和滯后限制,器件通過2 線的串行I2C 總線接口與控制器通信。LM75A 還包含一個開漏輸出(OS),當溫度超過編程限制的值時該輸出有效。LM75A 有3 個可選的邏輯地址管腳,使得同一總線上可同時連接8個器件而不發(fā)生地址沖突。
LM75A 可配置成不同的工作條件。它可設置成在正常工作模式下周期性地對環(huán)境溫度進行監(jiān)控或進入關(guān)斷模式來將器件功耗降至最低。OS 輸出有2 種可選的工作模式:OS 比較器模式和OS 中斷模式。OS 輸出可選擇高電平或低電平有效。故障隊列和設定點限制可編程,為了激活OS 輸出,故障隊列定義了許多連續(xù)的故障。
溫度寄存器通常存放著一個11 位的二進制數(shù)的補碼,用來實現(xiàn)0.125℃的精度。這個高精度在需要精確地測量溫度偏移或超出限制范圍的應用中非常有用。
正常工作模式下,當器件上電時,OS 工作在比較器模式,溫度閾值為80℃,滯后75℃,這時,LM75A就可用作一個具有以上預定義溫度設定點的獨立的溫度控制器。
2.LM75A規(guī)格:
讀出溫度數(shù)據(jù)。
3.實現(xiàn)原理
LM75A時鐘頻率入下圖所示:
由于系統(tǒng)時鐘為50Mhz,為了分頻方便,此處選用50Khz的頻率作為LM75A時鐘頻率。
50Mhz/50Khz = 50000000/50000 = 1000
LM75A讀溫度數(shù)據(jù)時序如下圖所示:
0 0 0 1 1 1 1 0?1 0 0
總共28個時鐘周期完成一次讀操作,所以計數(shù)器寬度設置為8位寬。
使用SCL的四倍頻率來控制計數(shù)器,使用計數(shù)器控制SDA相對于SCL的相位關(guān)系。
本程序還增加了上電初始化關(guān)斷LM75操作,因為器件上電一般需要有一個初始化時間,本程序初始化延時大概在幾十秒左右,故將程序下進去后幾十秒后才顯示溫度數(shù)據(jù)。
I2C總線數(shù)據(jù)通信協(xié)議規(guī)范(必須遵守):
主機和LM75A 之間的通信必須嚴格遵循I2C 總線管理定義的規(guī)則。LM75A 寄存器讀/寫操作的協(xié)議通
過下列描述之后的各個圖來說明:
1. 通信開始之前,I2C 總線必須空閑或者不忙。這就意味著總線上的所有器件都必須釋放SCL 和SDA 線,SCL 和SDA 線被總線的上拉電阻拉高。
2. 由主機來提供通信所需的SCL 時鐘脈沖。在連續(xù)的9 個SCL 時鐘脈沖作用下,數(shù)據(jù)(8 位的數(shù)據(jù)字節(jié)以及緊跟其后的1 個應答狀態(tài)位)被傳輸。
3. 在數(shù)據(jù)傳輸過程中,除起始和停止信號外,SDA 信號必須保持穩(wěn)定,而SCL 信號必須為高。這就表明SDA 信號只能在SCL 為低時改變。
4. S:起始信號,主機啟動一次通信的信號,SCL 為高電平,SDA 從高電平變成低電平。
5. RS:重復起始信號,與起始信號相同,用來啟動一個寫命令后的讀命令。
6. P:停止信號,主機停止一次通信的信號,SCL 為高電平,SDA 從低電平變成高電平。然后總線變成空閑狀態(tài)。
7. W:寫位,在寫命令中寫/讀位=0。
8. R:讀位,在讀命令中寫/讀位=1。
9. A:器件應答位,由LM75A 返回。當器件正確工作時該位為0,否則為1。為了使器件獲得SDA 的控制權(quán),這段時間內(nèi)主機必須釋放SDA 線。
10. A’:主機應答位,不是由器件返回,而是在讀2 字節(jié)的數(shù)據(jù)時由主控器或主機設置的。在這個時鐘周期內(nèi),為了告知器件的第一個字節(jié)已經(jīng)讀走并要求器件將第二個字節(jié)放到總線上,主機必須將SDA 線設為低電平。
11. NA:非應答位。在這個時鐘周期內(nèi),數(shù)據(jù)傳輸結(jié)束時器件和主機都必須釋放SDA 線,然后由主機產(chǎn)生停止信號。
12. 在寫操作協(xié)議中,數(shù)據(jù)從主機發(fā)送到器件,由主機控制SDA 線,但在器件將應答信號發(fā)送到總線的時鐘周期內(nèi)除外。
13. 在讀操作協(xié)議中,數(shù)據(jù)由器件發(fā)送到總線上,在器件正在將數(shù)據(jù)發(fā)送到總線和控制SDA 線的這段時間內(nèi),主機必須釋放SDA 線,但在主器件將應答信號發(fā)送到總線的時間周期內(nèi)除外。
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=222