liujinmingjml 发表于 2012-5-10 08:57:10

请教一下关于CPLD读取DHT22数据的问题

使用的是Altera的EPM240T100C5的板子,
程序里面有三个状态
statetest = 1'b0;//for test;
statetest2 = 1'b1;//for test;
为状态测试信号
仿真波显示三个状态都能工作
可是下到板子里面后,DHT22管脚一直是高电平 求解原因

module Dt(
CLK,
RSTn,
IO_port,
data,
dataout,
statetest,statetest2
);

input CLK;
input RSTn;
inout IO_port;

output dataout;
output statetest;
output statetest2;


output data;
reg rdata;

assign data = rdata;

wire CLK_OUT;
Gen_Clk U1(
.CLK(CLK),
.RSTn(RSTn),
.CLK_OUT(CLK_OUT)
);


//tri1 IO_port;
reg rz;
reg rdin;
reg rdout;

wire dout;
assign IO_port=(!rz)?rdin:1'bz;
assign dataout = dout;
assign dout = rdout;
/*if(!z)
din_reg=din; //out
else
dout=dinout; //in
*/

reg State=3'b001;
//

reg count1=10'd0;
reg count2=9'd0;
reg isDone = 1'b0;
reg countd = 8'd0;
reg bitcnt = 6'd0;
reg test;
reg isEn = 1'b0;

reg statetest = 1'b0;
reg statetest2 = 1'b0;

always @ (posedge CLK_OUT )//01号状态,主机发送工作指令
begin
       
                if(State==3'b001)
                begin
               
                statetest = 1'b0;//for test;
                statetest2 = 1'b1;//for test;
               
                isDone <= 1'b0;
               
                                if(count1 < 10'd500)
                                begin
                                rz<=1'b0;
                                if(!rz) rdin=1'b0; //out
                                count1<=count1+1'b1;
                                end
                        else if(count1>=10'd500&&count1<10'd540)
                                begin
                                rz<=1'b0;
                                if(!rz) rdin=1'b1; //out
                                count1<=count1+1'b1;
                                end
                        else if(count1==10'd540)
                                begin
                                rz<=1'b1;//gaozu
                                count1<=0;
                                State<=3'b010;               
                                end       
                end


        if(State == 3'b010)
        begin
       
        statetest = 1'b1;//for test;
                statetest2 = 1'b0;//for test;
       
                if(count2 < 9'd160) //0-160读取电平状态 DHT22的两个答应位
                        begin
                        rz <= 1'b1;//in
                        if(rz) rdout = IO_port; //in
                        count2 <= count2 + 9'd1;
                        end
                else if(count2 == 9'd160)//&&count2<9'd320)
                        begin
                        rz <= 1'b1;//in
                        if(rz) rdout = IO_port; //in
                        //count2 <= count2 + 9'd1;
                        count2 <= 9'd0;
                        //en<=1'b1;
                        State <= 3'b100; ///////////////////////////////////////
                        end
                /*else if(count2 == 9'd320)
                        begin
                        rz <= 1'b1;//in
                       
                        //if(isDone)
                        State <= 3'b001;
                        count2 <= 9'd160;                           ////////读取完数据置位isDone                       
                        end*/
        end
       
        if(State == 3'b100)
        begin
       
        statetest = 1'b1;//for test;
                statetest2 = 1'b1;//for test;
       
                rz <= 1'b1;//in
                if(rz) rdout = IO_port; //in
               
                if(countd == 8'd40) begin rdata<=dout; countd<=8'd0;end
                if(isEn)countd<=countd+8'd1;
               
                test <= dout;
          if((!test)&dout)//posedge
          begin
                  
                        if(bitcnt == 6'd40)begin bitcnt <= 6'd0; isDone <= 1'b1; end   //6'd39
                        else beginbitcnt <= bitcnt + 6'd1;        end
                        isEn <= 1'b1;
                end
               
                if(test&(!dout))//negedge
                begin
                isEn <= 1'b0;
                end
               
                if(isDone)begin State <=3'b001; end
       
        end
end

endmodule

wye11083 发表于 2012-5-10 11:23:53

代码风格吧。没有else的if多数会被综合成锁存器或者干脆一条线。我可是吃了大亏了,所以我现在每写一个if,都是立刻跟一个else,管它有没有用。

liujinmingjml 发表于 2012-5-10 14:26:04

wye11083 发表于 2012-5-10 11:23 static/image/common/back.gif
代码风格吧。没有else的if多数会被综合成锁存器或者干脆一条线。我可是吃了大亏了,所以我现在每写一个if, ...

哦,那我都改改看,改了一上午现在都蒙了,现在连应答都有问题了{:3_55:}
页: [1]
查看完整版本: 请教一下关于CPLD读取DHT22数据的问题