• 方案介紹
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

tmp1075溫度傳感器I2C數(shù)碼管顯示IIC溫度verilog代碼

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

名稱: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

工程文件

image.png

部分代碼展示

//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)資料:

tmp1075-2.png

點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=224

相關(guān)推薦