总结:
通过一个星期的单总线协议(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