我用的是AD0804,按时序图写出的状态机程序,但是在数码管老是无法正常显示,数字不是老跳就是定在一个值不动,我让其每隔0.5秒就转换一次
always@(posedge clk)
if(sw)
begin
cs<=1;
rd<=1;
wr<=1;
statead<=idle;
end
else
case(statead)
idle:
begin
statead<=start;
cs<=0;
end
start:
begin
statead<=deng;
wr<=0;
cntwr<=0;
end
deng:
if(cntwr==4'd6)
begin
cntwr<=0;
wr<=1;
statead<=nobusy;
cntbusy<=0;
end
else
cntwr<=cntwr+1;
nobusy:
****** if(cntbusy==16'd50000)
begin
cntbusy<=0;
statead<=trans;
rd<=0;
cnttrans<=0;
end
else
cntbusy<=cntbusy+1;
trans:
if(cnttrans==4'd10)
begin
cnttrans<=0;
vol<=db;
rd<=1;
statead<=final;
end
else
cnttrans<=cnttrans+1;
final:
begin
statead<=idle;
cs<=1;
end
endcase
注意打****号的语句,我感觉问题是不是就是出在这里,按datasheet里wr置高后有一段nobusy又有一段busy的时间,这段时间我一直不知道到底该取多少。。。请问这个延时过长的话或过短的话分别会造成什么情况啊?当然。。。我认为可能是这里有错误,可能其他地方时序也有不对,能有哪位好心人能全部看看就最好不过了
引用: 引用 1 楼 peasant_lee 的回复:
你是说WR持续时间?
否,就是转换时间,WR变低再变高不是要等待一段时间吗?然后再让RD变低变高
就是有效电平的持续时间咯,呵呵。首先我看不懂硬件描述语言,这些保持时间要符合硬件要求,datasheet要求延时多长,你就按照它就OK了,假如还不行,估计不是延时的问题,时序。。。
那敢问这位仁兄有用过AD么?不知是用的哪个型号的?用什么控制的啊?
引用: 引用 5 楼 lincoln24 的回复:
那敢问这位仁兄有用过AD么?不知是用的哪个型号的?用什么控制的啊?
AD肯定用过,是用mcu控制的,一般是mcu自带的,不过则这独立的AD我也在读书的时候做过,单单就控制DA正常工作,不难的,就一些控制信号。
恩,我也是觉得不难,我也严格按时序图做了但是就是出不来,我还怕延时不够索性把转换延时加的很长,不过他要不就是没反应要不就是数字乱跳,话说延时过长的话会不会也有影响?
就是说,你现在用FPGA来控制AD芯片,但是结果是检测到的AD值,一就是没反应,二就是经常乱跳。你所说的没反应,是不是就是没检测到AD值?还是固定一个AD值?
假如硬件没问题,我还是怀疑控制信号控制的不好,比如cs 或者转换结果输出的FD, 是否设了高阻态,之类的。。。
我是用8位LED来显示8位AD所转换后的数,没反应即是说灯就一直全亮(低电平时会亮),乱跳即是说LED显示出来的值不固定而且值相差很大,而我输入的是直流电
FD设了高阻态。。?额。。有这个可能,可我LED初始化时就设为8'hff了,你是说这里有问题?
对的。在AD转换之后,你的ad要输出数据,就不应该设为高阻态。
还有,你是否确定你的显示部分是正确的?因为你的系统,现在有两部分:AD检测部分,和LED显示部分。要排除问题,确定LED显示部分没有错,这样,显示乱才代表是检测到数据是错的。
引用: 引用 10 楼 peasant_lee 的回复:
还有,你是否确定你的显示部分是正确的?因为你的系统,现在有两部分:AD检测部分,和LED显示部分。要排除问题,确定LED显示部分没有错,这样,显示乱才代表是检测到数据是错的。
LED应该是没问题吧。。不就是你给0他就亮,你给1他就灭么,如果数据输出是全1,他就应该全灭。。应该没有错的可能吧
在AD转换之后,你的ad要输出数据,就不应该设为高阻态。
-----------AD的输出应该跟芯片自己有关吧,他输出多少我LED灯就显示多少,难道有哪里可以设置高阻态还是非高阻么。。。如果你指的是我LED是否设为高阻,我已经在复位时让他等于ff了,AD转换后把值赋予他的时候他难道会变成高阻么。。?
你的ad芯片0804有个输出高阻态的引脚设置,你看看那个引脚有没有接?给什么电平了?看是否是AD输出高阻态了。
楼主 采用FPGA 控制LED数码管 ,是采用静态扫描 还是动态扫描??
感觉楼主的问题,在于LED数码管的刷新频率 没有弄好;
楼主 注意调试 下LED的刷新频率,以及对应的延时。
楼主可以百度或GOOGLE下,看动态扫描来控制LED 时,为了保证人的视觉感受,对应的刷新频率的设置。
引用: 引用 12 楼 peasant_lee 的回复:
你的ad芯片0804有个输出高阻态的引脚设置,你看看那个引脚有没有接?给什么电平了?看是否是AD输出高阻态了。
没找到这个引脚。。。DATASHEET上面貌似没说啊
话说我现在IO口很奇怪啊。。。我用手碰他们LED有些灯也会灭掉,这是什么原因啊(未接芯片时)
就是 FD引脚,我刚才还特意查了一份资料。的确是0804,不知道为什么你那个没有。
额……那那个引脚是第几管脚?
我现在外接io口很奇怪啊,我人为的用5V电源接了一下其中一个外接口(等于给其中一个灯接了高电平?),但是他却有两个灯熄灭了,不知道这是什么问题啊…?
现在终于能出来了。。。不过测得数总是偏大,不知道这会是芯片本身的问题还是我程序的问题?
数小的时候会相差0.2左右,数大会相差0.4左右。。。。
应该是芯片本身的问题,程序就两种情况,一就是读不出来,或者读错,二,读出来了,那肯定是你芯片转换出来的数据。