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