黑金开发板逻辑编写学习——IIC温度读取模块

一、项目介绍

使用温度传感器LM75进行温度读取。

二、LM75芯片介绍

温度测量范围-55~+125℃,分辨率为0.125°C。

芯片具有两种工作模式,一种比较模式一种中断模式。

设置上限温度Tos与下限温度Thyst。

比较模式,温度高于上限温度Tos,OS引脚输出active,温度低于下限温度Thyst,OS引脚输出重置,该模式下适合控制外部设备冷却风扇或热敏开关。

中断模式,在温度高于上限温度Tos或低于下限温度Thyst时OS引脚active。

工作状态图

数据寄存器

数据计算公式

三、数据读取模块编写

 input              sys_clk,
 input              rst_n,
 output             scl, 
 inout              sda,      
 output reg[16:0]       data

模块输入输出数据

`define     SCL_POS          (cnt==3'd0)      
`define     SCL_HIG          (cnt==3'd1)
`define     SCL_NEG          (cnt==3'd2)     
`define     SCL_LOW          (cnt==3'd3)  
`define    DEVICE_READ        8'b1001_0001    //read device addr
//************************************************************/
reg[2:0] cnt;  
reg[7:0] cnt_delay;    
reg scl_r;      
always @ (posedge sys_clk or negedge rst_n)
    if(!rst_n) cnt_delay <= 8'd0;
    else if(cnt_delay == 8'd199) cnt_delay <= 8'd0;   
    else cnt_delay <= cnt_delay+1'b1;

always @ (posedge sys_clk or negedge rst_n) 
begin
    if(!rst_n) cnt <= 3'd5;
    else begin
        case (cnt_delay)
            9'd49:     cnt <= 3'd1;
            9'd99:     cnt <= 3'd2; 
            9'd149:    cnt <= 3'd3;  
            9'd199:    cnt <= 3'd0; 
            default:   cnt <= 3'd5;
            endcase
        end
end
 
always @ (posedge sys_clk or negedge rst_n)
    if(!rst_n) scl_r <= 1'b0;
    else if(cnt==3'd0) scl_r <= 1'b1;
       else if(cnt==3'd2) scl_r <= 1'b0;
assign scl = scl_r;   
//---------------------------------------------      

将scl信号分为上升、高电平、下降、低电平四种状态。

使用系统时钟生成scl信号,每一百个系统时钟周期scl信号电平翻转一次。

定义八位设备地址1001_0001。

上图为IIC数据传输状态机。

数据处理部分重点有:

sda=sda_link?sda_r:1'bz;

这里使用sda_link信号控制sda引脚是输入还是输出。

sda_link==1,sda=sda_r此时sda引脚做输出,向外传输数据,用于IIC总线向外传输设备地址。

sda_link==0,sda=1'bz此时sda引脚高阻,用于外部数据输入。

data_conv、data_conv1、data_conv2用于数据转换与拼接。

data_conv=read_data[15]?~read_data[15:0]+1'b1:read_data[15:0];

read_data[15]==1,最高位为1,设备读取温度为负值,数据进行~read_data[15:0]+1'b1处理获得温度数值;最高位为0,设备读取温度为正值,数据无需处理。

data_conv1=data_conv*125;

data_conv2=data_conv1/100/32;

数据乘于精度0.125获得当前温度值,除32不清除是为什么。

data={read_data[15],data_conv2[15:0]}

将处理好的数据进行拼接。

模块代码链接:https://pan.baidu.com/s/1QerC_-sgUL8ktOcjgHa2IQ
提取码:kjzx

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Verilog是一种硬件描述语言,用于设计和模拟电子系统。LM75A是一种数字温度传感器,常用于测量温度。 使用Verilog语言编写的LM75A模块可以通过Verilog代码实现对LM75A温度传感器的控制和读取。以下是一个简单的LM75A模块的Verilog代码示例: ```verilog module LM75A ( input wire clk, // 时钟信号 input wire rst, // 复位信号 output wire [7:0] temp // 输出温度信号 ); reg [7:0] temp_reg; // 温度寄存器 // 温度传感器读取过程 always @(posedge clk or posedge rst) begin if (rst) begin temp_reg <= 8'b00000000; // 温度寄存器复位为0 end else begin // 读取温度传感器数据并存储到温度寄存器 // 将读取到的数据转换为对应的温度值 // 将温度值存储到temp_reg寄存器中 // 这里需要根据LM75A的数据手册编写相应的代码 // ... end end // 温度输出 assign temp = temp_reg; endmodule ``` 在这个示例中,LM75A模块包含一个时钟信号`clk`、复位信号`rst`和一个输出温度信号`temp`。其中,`temp`信号表示从LM75A传感器读取到的温度值。 通过时钟信号和复位信号的控制,模块温度读取并存储到内部的温度寄存器`temp_reg`中。从`temp_reg`中获取的温度值通过输出信号`temp`提供给其他模块使用。 需要注意的是,LM75A传感器的具体读取过程以及将读取到的数据转换成温度值的方式需要根据LM75A的数据手册来实现。以上代码仅是一个示例,具体实现需要根据实际情况进行适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱多多小姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值