已回答假定已回答

问题: 求解AD7760 DRDY始终是高电平。

Run 在 2012-12-26 詢問的問題
最後回覆由fenghongdong於2017-5-31提供

这个是我用verilog写的一个程序,我下载到FPGA里面,测试DRDY始终是高电平,读回来的数据始终是十进制的26(0x1a),好像是我第二次写的数据(CR1的数据),硬件是按照手册上的原理图设计的,基准是4.095V.请前辈指教一下小弟,在此谢过了!
(声明:DRDY我没有电容)
module
AD7760(SYS_Rest,SYS_clk,data,AD_DRDY_n,AD_RST_n,AD_MCLK,AD_SYNC_n,AD_CS_n,AD_nRD_WR)
;
input SYS_clk;
input SYS_Rest;
input AD_DRDY_n;
//output
AD_DRDY_n;
output AD_RST_n;
output AD_MCLK;
output AD_SYNC_n;
output
AD_CS_n;
output AD_nRD_WR;
//inout [15:0]data;
output
[15:0]data;
wire AD_MCLK;
reg AD_SYNC_n;
reg AD_RST_n;
reg
AD_CS_n;
reg AD_nRD_WR;
reg [15:0]data; //数据总线
reg [15:0]data_out;
//数据输出总线
reg [15:0]data_outH;//数据输出高字节总线
reg
[15:0]data_outL;//数据输出低字节总线
reg [10:0]count;
reg wr_en;
reg
rd_en;
// IDLE || WR_CR2_address WR_CR2_data WR_CR1_address WR_CR1_data
||RD_data
parameter WR_CR2_address=16'h0002, WR_CR2_data=16'h0002,
WR_CR1_address=16'h0001,
WR_CR1_data=16'h001A;
parameter
start=1,stop=0;
assign AD_MCLK=~SYS_clk;// AD_MCLK可以由SYS_clk分频得到
always@(posedge AD_MCLK or
negedge SYS_Rest)
begin//-----------1
if(!SYS_Rest)
begin
AD_CS_n
<=1'b0;
AD_SYNC_n<=1'b0;
AD_RST_n <=1'b0;
count
<=10'd0;
wr_en<=start;
rd_en<=stop;
end
else
begin
//-------2
count<=count+1;
if(count==10'd1 )//复位
begin
AD_CS_n
<=1'b1;
AD_SYNC_n<=1'b1;
AD_RST_n
<=1'b0;
AD_nRD_WR<=1'b1;
wr_en<=start;
rd_en<=stop;
end
/*-------------------------*/
if(wr_en==start&&rd_en==stop&&count>=10'd2&&count<10'd4)//复位完成
begin
AD_RST_n<=1'b1;//2个周期的复位完成
end
/*-------------------------*/
if(wr_en==start&&rd_en==stop&&count>=10'd4&&count<10'd10
)
begin
//AD_nRD_WR<=1'b1;//写信号拉高,并且片选拉低,保持6个周期
AD_CS_n<=1'b0;
data<=WR_CR2_address;//写CR2地址
end
if(wr_en==start&&rd_en==stop&&count>=10'd10&&count<10'd16)
begin
AD_CS_n<=1'b1;//片选拉高,保持6个周期,把数据置于总线上
end
if(
wr_en==start&&rd_en==stop&&count>=10'd16&&count<10'd22
)
begin
AD_CS_n<=1'b0;//片选拉低,保持6个周期
,写CR2数据
data<=WR_CR2_data;//送CR2数据
end
if(
wr_en==start&&rd_en==stop&&count>=10'd22&&count<10'd28
)
begin
AD_CS_n<=1'b1;//片选拉高,保持6个周期
end

 


if(
wr_en==start&&rd_en==stop&&count>=10'd28&&count<10'd34)
begin
AD_CS_n<=1'b0;//片选拉低,保持6个周期
,写CR1数据
data<=WR_CR1_address;//写CR1地址
end
if(
wr_en==start&&rd_en==stop&&count>=10'd34&&count<10'd40)
begin
AD_CS_n<=1'b1;
end
if(wr_en==start&&rd_en==stop&&count>=10'd40&&count<10'd46)
begin
AD_CS_n<=1'b0;//片选拉低,保持6个周期
,写CR1数据
data<=WR_CR1_address;//送CR1数据
end
if(wr_en==start&&rd_en==stop&&count>=10'd46&&count<10'd51)
begin
AD_CS_n<=1'b1;
end
if(wr_en==start&&rd_en==stop&&count>=10'd51&&count<10'd52)
begin
data<="ZZZZZZZZZZZZZZZZ";
wr_en<=stop;
//写停止
rd_en<=start;//读开始
end
/*cs释放后等待五个周期*/
/*---------------------------------------------------*/
/*在读取期间AD_DRDY_n输出一个低电平的时候读取数据无*/
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd58&&count<10'd59)
begin
AD_nRD_WR<=1'b0;
//AD_nRD_WR比AD_CS_n早一个时钟拉低
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd59&&count<10'd60)
begin
AD_CS_n<=1'b0;
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd60&&count<10'd61)
begin
data_outH<=data;
//读高字节
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd61&&count<10'd62)
begin
AD_CS_n<=1'b1;
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd62&&count<10'd63)
begin
AD_nRD_WR<=1'b1;
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd63&&count<10'd64)
begin
AD_nRD_WR<=1'b0;
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd64&&count<10'd65)
begin
AD_CS_n<=1'b0;
end
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b1&&count>=10'd65&&count<10'd66)
begin
data_outL<=data;
//读低字节
end
/*
if(rd_en==start&&wr_en==stop&&count>=10'd60&&count<10'd61)
begin
AD_CS_n<=1'b1;
end
if(rd_en==start&&wr_en==stop&&count>=10'd61&&count<10'd62)
begin
AD_nRD_WR<=1'b1;
end
/*---------------------------test2011.4.1--------------------------*/
if(rd_en==start&&wr_en==stop&&AD_DRDY_n==1'b0&&count>=10'd66)//
begin
data<=data_outH|data_outL;//有新的转换结果可用时,AD_DRDY_n输出一个低电平为有效脉冲
count<=10'd46;//
end
/*---------------------------------------------------*/
end//-------2
end//---------1
endmodule

結果