名稱:tmp1075溫度傳感器I2C數(shù)碼管顯示IIC溫度verilog代碼(代碼在文末付費(fèi)下載)
軟件:ISE
語(yǔ)言:Verilog
代碼功能:
使用verilog編寫代碼,讀取IIC(I2C)接口的tmp1075溫度傳感器數(shù)據(jù),并在數(shù)碼管顯示,代碼兼容LM75
本代碼已在Basys2開發(fā)板驗(yàn)證,開發(fā)板資料:
FPGA代碼Verilog/VHDL代碼資源下載網(wǎng):www.hdlcode.com
工程文件
部分代碼展示
//tmp1075傳感器IIC控制模塊 module?tmp1075_rd?(? ?????????????????????//input? input????????????????sys_clk???????????, input????????????????sys_rst_n?????????, inout????????????????sda_port??????????, ?????????????????????//output? output????reg?[10:0]?tmp_out???????????,? output????reg????????clk_sclk?????????? ??????????????); wire???????sda_in; ?? //parameter?define? parameter?WIDTH?=?8; parameter?SIZE??=?8; //reg?define? reg????[WIDTH-1:0]???????counter?????????????; reg????[9:0]?????????????counter_div?????????; reg??????????????????????clk_50k?????????????; reg??????????????????????clk_200k????????????; reg??????????????????????sda?????????????????; reg??????????????????????enable??????????????; reg????[WIDTH-1:0]???????data_out????????????; reg????[31:0]????????????counter_init????????;????? ?? reg????[10:0]????????????buff????????????????;?? //wire?define? wire???[2:0]?????????????device_addr?????????; wire?????????????????????sda_input???????????; /******************************************************************************************************* **??????????????????????????????Main?Program???? **?? ********************************************************************************************************/ //tmp1075?device?address?is?000,?this?value?is?no?care?; assign?device_addr?=?3'b000;//地址000??????? //?counter?for?gen?a?clk_50k?:?need?count?to?1000,?for?50M/1000?=?50K?hz? always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin? ????????if?(sys_rst_n?==1'b0)?? ????????????counter_div?<=?10'b0; ????????else?if?(counter_div?>=?10'd999)//分頻產(chǎn)生50KHz頻率,50M/50K=1000=0~999 ????????????counter_div?<=?10'b0; ????????else ????????????counter_div?<=?counter_div?+?10'b1; end //?gen?a?clk_50k?use?counter_div?:??not?use?counter_div?0?-?500?is?for?i2c?bus?request?start?timing? always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin? ????????if?(sys_rst_n?==1'b0)?? ????????????clk_50k?<=?10'b0; ????????else??if?((counter_div?>=?375)?&&?(counter_div?<?875))???? ????????????clk_50k?<=?10'b1;//分頻產(chǎn)生50KHz頻率 ????????else ????????????clk_50k?<=?10'b0;//分頻產(chǎn)生50KHz頻率 end //?counter?for?init?for?tmp1075? always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin? ????????if?(sys_rst_n?==1'b0)?? ????????????counter_init?<=?32'h0; ????????else?if?(?counter_init?<?32'h5f5e100?)?//十六進(jìn)制5f5e100=100000000,50M計(jì)數(shù)100000000得2秒 ????????????counter_init??<=?counter_init?+?32'b1;???????????? ????????else?;?????????????????? end //?gen?a?200K?CLK?for?work?counter?count always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin?//產(chǎn)生200K頻率用于counter計(jì)數(shù) ????????if?(sys_rst_n?==1'b0)?? ????????????clk_200k?<=?10'b0; ????????else??if?((counter_div?>=?0??)?&&?(counter_div?<?125)) ????????????clk_200k?<=?10'b0; ????????else??if?((counter_div?>=?125)?&&?(counter_div?<?250)) ????????????clk_200k?<=?10'b1;?? ????????else??if?((counter_div?>=?250)?&&?(counter_div?<?375)) ????????????clk_200k?<=?10'b0;???????????????????????? ????????else??if?((counter_div?>=?375)?&&?(counter_div?<?500)) ????????????clk_200k?<=?10'b1; ????????else??if?((counter_div?>=?500)?&&?(counter_div?<?625)) ????????????clk_200k?<=?10'b0; ????????else??if?((counter_div?>=?625)?&&?(counter_div?<?750)) ????????????clk_200k?<=?10'b1;?? ????????else??if?((counter_div?>=?750)?&&?(counter_div?<?875)) ????????????clk_200k?<=?10'b0;???????????????????????? ????????else??if?((counter_div?>=?875)?&&?(counter_div?<?1000)) ????????????clk_200k?<=?10'b1;???? ????????else?; end //?when?tmp1075?init?finish,?work?counter?start?to?add always?@(posedge?clk_200k?or?negedge?sys_rst_n)?begin? ????????if?(sys_rst_n?==1'b0)?? ????????????counter?<=?8'h0; ????????else?if?(?counter_init?==?32'h5f5e100?) ????????????counter?<=?counter?+?8'b1;?//2s后counter開始以200K頻率計(jì)數(shù) ????????else?;???? end //generate?real?clk?for?SCLK?,when?the?i2c?bus?is?idle,?make?the?clk?wire?high?level always?@(*)?begin? ????????if?(?counter?>=?2?&&?counter?<=?118?) ????????????clk_sclk?=?clk_50k; ????????else?? ????????????clk_sclk?=?1'b1; end //?output?SDA?data?with?tmp1075?data?sheet?request? always?@(*)?begin?//根據(jù)tmp1075數(shù)據(jù)手冊(cè)要求,輸出iic時(shí)序 ????case?(?counter?)
tmp1075相關(guān)資料:
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=224
閱讀全文