搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2012-5-10 08:57:10 | 显示全部楼层 |阅读模式
使用的是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 [40:0]data;
reg [40:0]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 [2:0]State=3'b001;
//

reg [9:0]count1=10'd0;
reg [8:0]count2=9'd0;
reg isDone = 1'b0;
reg [7:0]countd = 8'd0;
reg [5:0]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[bitcnt]<=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 begin  bitcnt <= 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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入442汤圆

发表于 2012-5-10 11:23:53 | 显示全部楼层
代码风格吧。没有else的if多数会被综合成锁存器或者干脆一条线。我可是吃了大亏了,所以我现在每写一个if,都是立刻跟一个else,管它有没有用。

出0入0汤圆

 楼主| 发表于 2012-5-10 14:26:04 | 显示全部楼层
wye11083 发表于 2012-5-10 11:23
代码风格吧。没有else的if多数会被综合成锁存器或者干脆一条线。我可是吃了大亏了,所以我现在每写一个if, ...

哦,那我都改改看,改了一上午现在都蒙了,现在连应答都有问题了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表