FPGA(10)dht11驱动(单总线)与单总线协议总结

总结:

        通过一个星期的单总线协议(NEC协议,ds18b20协议,dht11协议)的学习,FPGA正式入门,在单总线学习中,知道FSM(有限状态机)的构造,能够独立自主构造。

        在单总线红外驱动解码(NEC协议)只是对输入数据的解码,串行数据,转到并行数据,也知道怎样把数据同步到主机时钟,生成上升和下降沿的标志,通过上升或者下降沿标志进行计数,进而判断高低电平,我想这是未来写通信驱动的必备环节。当然,初学者可以画波形图进行编写,现在,感觉FPGA已经入门了,无需波形图,只要画个大致状态机,计数,仲裁,取值,都可以依靠状态机所处状态和一些中间变量。

        在单总线ds18b20学习中,学到一个端口可以做输入输出,在这里,主要学会了真正的并行思想,通过在每个状态规定在什么标志信号,使能输出,然后写出输出值,最后使用aasign语句,在使能信号有效时,输出当前的值,当使能信号无效时,输出高阻态。

        在单总线dht11学习中,其实就是上面两总线的综合,通过状态机大致表示信号输出方向,然后通过上升下降沿来计数,记录高低电平持续时间,然后就是状态机的跳转,由于信号在数据传输40个数据,而且时间还是大约时间,所以状态机在数据状态还不能使用系统延时计数跳转,,而是使用BIT计数,通过上升沿标志或者下降沿标志判断当前读的位数是否达标,达标在跳转。

dht11状态机 

 

 代码

module  dh11_trl(sys_clk,sys_rst,data1_inout,data12_out,data8_out,sign);

    input   wire    sys_clk,sys_rst;
    
    inout   wire    data1_inout;
    
    output  reg     [11:0]   data12_out;
    output  reg     [7:0]    data8_out;
    output  reg              sign;

//主时钟
reg     clk_1us;
reg     [4:0]   cnt_clk24;
reg     clk_2us;
reg     [5:0]   cnt_clk49;
reg     data1_reg1;
reg     data1_reg2;
wire    fall_flag;
wire    rise_flag;

//状态机
reg     [4:0]       state;
parameter   start_waite1_5s =5'b00_001;
parameter   send_start      =5'b00_010;
parameter   answer_send     =5'b00_100;
parameter   data_state      =5'b01_000;
parameter   end_waite1s     =5'b10_000;

reg     [20:0]          cnt_time;

reg     [7:0]           cnt_lowin;
reg     [7:0]           cnt_highin;
reg     [6:0]           cntBit40;
reg     [39:0]          data40_out_temp;
reg                     error_flag;
wire    [7:0]           check_data;
reg                     qout_temp;
reg                     qout_en;


parameter   start_time          =21'd1_800_000;//(1.5s)
parameter   send_time           =21'd20_000;//(18ms-20-30ms)
parameter   answer_time         =21'd500;          //回复状态总时间(10us-13-20us+81us-83-85us+85us-87-88us)
parameter   answerSend_low_min  =21'd70;           //低电平记录min时间
parameter   answerSend_low_max  =21'd100;          //低电平记录max时间
parameter   answerSend_high_min =21'd70;           //高电平记录min时间
parameter   answerSend_high_max =21'd100;          //高电平记录max时间
parameter   d
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦灵-影

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

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

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

打赏作者

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

抵扣说明:

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

余额充值