查看: 439|回复: 5
打印 上一主题 下一主题

AD9854串行写入问题

[复制链接] qrcode

20

主题

53

帖子

130

积分

注册会员

Rank: 2

积分
130
楼主
跳转到指定楼层
发表于 2015-9-26 11:39 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原来我用的AD9854是采取并行写入方式,现在尝试串行写入方式。
用FPGA写入控制字,可写入之后AD9854无法工作,请高手帮忙看看问题在哪?



S/P SELECT:FPGA输出逻辑0,将其置为低;
D7…D0:无用,FPGA输出1,将其置为高;
A5…A3:无用,FPGA输出1,将其置为高;
IO/RESET:如下图倒数第二行;
SDIO:通过SDIO向AD9854写控制字,下图第四行;
I/O UD CLK:如下图倒数第三行:
SCLK:FPGA生成4MHz时钟;
CS:如下图倒数第一行;


上图是FPGA仿真输出的时序图。

<1>:写入相位字——00000001(instruction byte)+00100000(相位字第1个字节)+00000000(相位字第2个字节)。
<2>:写入频率字——00000010(instruction byte)+……
<3>:写入控制字——00000111(instruction byte)+……
<4>:写入OSK I multiplier——00001000(instruction byte)+……

(控制字只写了这么多,以前用并行写入时就这么写的,AD9854可以正常输出)

以上所写入用高位优先(MSB)的方式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
沙发
发表于 2015-10-28 05:25 AM | 只看该作者
已经解决了。
我将CS信号延迟了一个SCLK时钟周期,与SDIO信号同时作用(原来的程序IO/RESET信号提前SDIO一个SCLK时钟周期),使CS的下降沿对准sdio的第一个数据的开始边沿,如图:

AD9854输出正确。
修改了所有信号的时序才发现只有这个CS的这个改动是有效的。
可是我还是不明白,在我的理解中,片选信号CS只需置低等待sdio信号即可,为何要一定要与信号sdio同时跳变?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

20

主题

53

帖子

130

积分

注册会员

Rank: 2

积分
130
板凳
 楼主| 发表于 2015-10-30 10:20 AM | 只看该作者
d                                                                                                                                                                       
回复 支持 反对

使用道具 举报

20

主题

53

帖子

130

积分

注册会员

Rank: 2

积分
130
地板
 楼主| 发表于 2016-1-3 03:34 AM | 只看该作者
你能不能把并行的时序图,发一下,最好程序也发一下,呵呵。谢谢啊                                                                                                                                                                       
回复 支持 反对

使用道具 举报

20

主题

53

帖子

130

积分

注册会员

Rank: 2

积分
130
5#
 楼主| 发表于 2016-1-3 04:34 AM | 只看该作者
程序是用verilog写的
仿真是在ISE下调用modelsim
现在ISE启动不了了,重装很麻烦
先给你程序参考一下吧:
是用状态机写的,并行模式:
module dds_words(
reset,
CLK,
dds_wr,//dds写管脚
dds_rd,//dds读管脚
dds_address,
dds_words
);
input reset;
input CLK;
output dds_wr;
output dds_rd; //"0"有效;
output [5:0] dds_address;
output [7:0] dds_words;

wire dds_wr; //"0"有效
wire dds_rd; //"0"有效;

reg [5:0] dds_address;
reg [7:0] dds_words;
reg [3:0] state;
parameter IDLE = 4'b0000, DDS_CLK_MULT = 4'b0001,
DDS_FREWORD1_0 = 4'b0010, DDS_FREWORD1_1 = 4'b0011,
DDS_FREWORD1_2 = 4'b0100, DDS_FREWORD1_3 = 4'b0101,
...................;//parameter 部分定义了状态机的状态变量

assign dds_wr = CLK;
assign dds_rd = 1'b1;

always @(posedge CLK or posedge reset)
if(reset)
begin
state <= DDS_CLK_MULT;
end

else
case(state)
DDS_CLK_MULT:
begin
dds_address <= 6'h1E; //参考时钟控制寄存器的地址
dds_words <= 8'h45; //参考时钟控制寄存器的值,此次写入的值表示对参考时钟5倍倍频

state <= DDS_FREWORD1_0;//跳转至下一个状态,开始写频率字
end
DDS_FREWORD1_0:

begin
dds_address <= 6'h09;//09为频率字第一个地址,此状态向频率字第一个寄存器地址写入值,下一个状态DDS_FREWORD1_1写第二个寄存器地址08
dds_words <= 8'h00;
state <= DDS_FREWORD1_1;
end
DDS_FREWORD1_1:
begin
dds_address <= 6'h08;
dds_words <= 8'h00;
state <= DDS_FREWORD1_2;
end
////////////依次写完所需的寄存器值
default : state <= IDLE;

endcase


endmodule
回复 支持 反对

使用道具 举报

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
6#
发表于 2016-1-3 06:09 AM | 只看该作者
我的邮箱1021158380@qq.com                                                                                                                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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