AD9914的32引脚并行端口与一组4个独立的功能引脚协同工作,这些功能引脚控制并行端口的功能。该32引脚并行端口组成一个32位字,以位[31:0]表示(31表示最高有效位(MSB),0表示最低有效位(LSB)),4个功能引脚以F[3:0]表示。图41表示功能引脚、32引脚并行端口、内部编程寄存器以及DDS控制参数(频率、相位和幅度)的相互关系。注意并行端口可采用三种不同的模式工作,由功能引脚定义。
(1)当施加在功能引脚上的逻辑电平为F[3:0] = 0000时,并行模式有效。这样便可允许并行端口以并行接口的方式工作,为所有器件的编程寄存器提供访问。在并行模式中,32引脚端口(位[31:0])分为3组,它们分别是:由16个数据位组成的位[31:16]、由8个地址位组成的位[15:8]、以及由3个控制位组成的位[2:0]。地址位指向特定的器件寄存器,数据位存储寄存器的内容。控制位控制读写功能并设置数据总线的宽度;也就是说,用户可以选择数据总线宽度是否为16位(位[31:16])或8位(位[23:16])。并行模式允许用户以最高200 MBps的速率、使用16位数据(或100 MBps,使用8位数据)写入器件寄存器。(2)当施加在功能引脚上的逻辑电平为F[3:0] = 0001时,串行模式有效。这样便可允许并行端口以串行接口的方式工作,为所有器件的编程寄存器提供访问。在该模式下,32引脚并行端口中仅有5个引脚工作(位[4:0])。这些引脚提供芯片选择(CS)、串行时钟(SCLK)、以及I/O同步(SYNCIO)功能,用于串行接口以及两条串行数据线(SDO和SDIO)。串行模式支持最高80 Mbps的数据速率。(3)当施加到功能引脚上的逻辑电平为F[3:0] = 0010至1101(注意1110和1111未使用)时,并行端口用作访问DDS内核中32位频率、16位相位、以及12位幅度参数的高速接口。图41中的表格使用DDS的频率(FTW[31:0])、相位(POW[15:0])和幅度(AMP[15:0])参数识别位[31:0],从而显示32引脚并行端口的分段。注意,虽然AMP[15:0]表示16位分辨率,但实际的幅度分辨率为12位。因此,仅AMP[11:0]提供幅度控制(也就是说,未使用AMP[15:12])。
此外,为确保幅度控制,用户必须将CFR1寄存器(0x00[8])中的OSK使能位置位为逻辑1。通过允许用户直接控制DDS参数(频率、相位、幅度或这些参数的不同组合),F[3:0]引脚和位[31:0]一同为AD9914提供了无与伦比的调制能力。除此之外,并行端口以等同于1/24的系统采样时钟的采样速率运行。这允许DDS参数以最高145 MSPS(假定系统时钟为3.5 GHz)的速率更新,以便AD9914满足宽带调制应用的需求。
注意:并行端口的频率、相位和幅度变化将会通过不同的路径传达给DDS内核,导致不同的传播时间(延迟)。因此,调制多于一个的DDS参数需要对器件CFR2寄存器(0x01[15])的匹配延迟使能位进行置位,以便均衡从并行端口传播到DDS内核的每个DDS参数。注意高速调制要求使用一个DAC重构滤波器,它必须具有足够的带宽,以满足瞬态时域转换的要求。由于可通过FTW,POW和AMP寄存器进行直接DDS参数访问,IO_UPDATE引脚(见图41)便有了另一层灵活性。为支持这一功能,AD9914提供了一个寄存器控制位:并行端口数据流使能(0x00[17])。当该位置位为逻辑1时,并行端口无需I/O更新即可工作。然而,当该位为逻辑0时,器件会将并行端口数据发送到相应的寄存器(FTW、POW、AMP),但不会发送给DDS内核。直到用户对IO_UPDATE引脚进行置位,数据才会发送到DDS内核。
//parallel interface//写寄存器,无读取寄存器功能
module parallel_mode(
input sys_clk ,
input sys_rst_n , ,
output reg [31:0] Data_D0_D31 , //D2/SDIO/WR D1/SCLK/RD D0/CS/PWD
// output reg [2:0] Profile_select_PS0_PS2 , //暂时不用的功能;Profle选择引脚。数字输入(高电平有效)。使用此引脚可选择一种DDS相位/频率Profle(共8种)。改变引脚状态,可将所有当前I/O缓冲内容传输到相应寄存器。要改变状态,可设置SYNC_CLK引脚(引脚82)。
output reg [3:0] Function_F0_F3 , //功能引脚。数字输入。这些引脚的状态决定是否使用串行或并行端口。此外,功能引脚决定32位并行数据字如何根据FSK、PSK或ASK调制模式进行分割。
// input SYNC_OUT , //暂时不用的功能:数字同步输出。用于同步多个芯片。
// output reg SYNC_IN , //数字同步输入。用于同步多个芯片。
// output reg DRCTL , //斜坡控制。数字输入(高电平有效)。该引脚控制扫描方向(向上/向下)。斜坡方向由DRCTL引脚控制。此引脚上逻辑0可使DRG生成负斜率斜坡,逻辑1产生正斜率斜坡。
// output reg DRHOLD , //斜坡保持。数字输入(高电平有效)。当其有效时,暂停扫描。
// input DROVER , //斜坡结束。数字输出(高电平有效)。当数字斜坡发生器达到最大/最小编程值时,此引脚将切换到逻辑1。
// output reg OSK , //输出幅度键控。数字输入(高电平有效)。在手动或自动模式中启用OSK功能时,通过此引脚控制。在手动模式中,此引脚在0(低)和编程幅度比例因子(高)之间切换乘法器。在自动模式中,低电平向下扫描幅度至0,高电平向上扫描幅度至幅度比例因子。
// output reg EXT_PWR_DWN , //外部关断。数字输入(高电平有效)。此引脚高电平会启用当前编程的省电运行模式。
// output reg MASTER_RESET , //主机复位。数字输入(高电平有效)。所有存储元件清0,寄存器设置为默认值。
input SYNC_CLK , //时钟输出。数字输出。芯片中的很多数字输入(如I/O_UPDATE、PS[2:0]和并行数据端口D0至D31)必须在该信号的上升沿阶段设置。
output reg IO_UPDATE , //输入/输出更新。数字输入(高电平有效)。此引脚高电平会将I/O缓冲内容传输到相应的内部寄存器。 ,
// input scan_mode , //低电平为默认的25M带宽,高电平为200M带宽
// input scan_flag , //扫描状态触发信号
input [7:0] config_word_A , //dds地址控制字
input [15:0] config_word_D , //dds数据控制字
output reg parallel_idle , //并行编程空闲,高电平有效
input parallel_launch , //并行编程启动,触发信号
output reg [7:0] parallel_state//状态机
);
reg [7:0] parallel_cnt;
always @(posedge SYNC_CLK or negedge sys_rst_n)
begin
if(!sys_rst_n)//复位
begin
Function_F0_F3 <= 4'b0; //功能引脚默认使用并行模式。F[3:0]=0000。
Data_D0_D31[0] <= 1'b1; //默认使用16位数据宽度模式。若使用了16位模式,则高位字节(位[15:8])传送至寻址的寄存器,且低位字节(位[7:0])传送至相邻的低位地址。
Data_D0_D31[2] <= 1'b1; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
Data_D0_D31[15:8] <= 8'b0; //八位地址线 A[7:0]
Data_D0_D31[31:16] <= 16'b0; //默认16位数据线 D[15:0]
parallel_state <= 8'h0;
parallel_idle <= 1'b1;
IO_UPDATE <= 1'b0;
end
else
case(parallel_state)
8'h00:begin//空闲
Function_F0_F3 <= 4'b0; //功能引脚默认使用并行模式。F[3:0]=0000。
Data_D0_D31[0] <= 1'b1; //默认使用16位数据宽度模式。若使用了16位模式,则高位字节(位[15:8])传送至寻址的寄存器,且低位字节(位[7:0])传送至相邻的低位地址。
Data_D0_D31[2] <= 1'b1; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
Data_D0_D31[15:8] <= 8'b0; //八位地址线 A[7:0]
Data_D0_D31[31:16] <= 16'b0; //默认16位数据线 D[15:0]
IO_UPDATE <= 1'b0;
parallel_idle <= 1'b1;
parallel_cnt <= 8'h0; //计数器清零
if(parallel_launch)
begin
parallel_state <= 8'h01;
end
end
8'h01:begin
parallel_idle <= 1'b0; //非空闲
Data_D0_D31[2] <= 1'b1; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
Data_D0_D31[15:8] <= config_word_A[7:0]; //八位地址线 A[7:0]
Data_D0_D31[31:16] <= config_word_D[15:0]; //默认16位数据线 D[15:0]
parallel_cnt <= parallel_cnt + 1'b1;
if(parallel_cnt >= 4)//加上状态计数器变化1单位时间,相当于延迟5单位时间后改变 WR的电平
begin
parallel_state <= 8'h02;
end
end
8'h02:begin
Data_D0_D31[2] <= 1'b0; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
parallel_cnt <= parallel_cnt + 1'b1;
if(parallel_cnt >= 10)//加上状态计数器变化1单位时间,相当于延迟5单位时间后改变 WR的电平
begin
parallel_state <= 8'h03;
parallel_idle <= 1'b1;
end
end
8'h03:begin
Data_D0_D31[2] <= 1'b1; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
Data_D0_D31[15:8] <= 8'b0; //八位地址线 A[7:0]
Data_D0_D31[31:16] <= 16'b0; //默认16位数据线 D[15:0]
parallel_cnt <= parallel_cnt + 1'b1;
parallel_state <= 8'h04;
parallel_idle <= 1'b1;
IO_UPDATE <= 1'b1;
end
8'h04:begin
Data_D0_D31[2] <= 1'b1; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
Data_D0_D31[15:8] <= 8'b0; //八位地址线 A[7:0]
Data_D0_D31[31:16] <= 16'b0; //默认16位数据线 D[15:0]
parallel_cnt <= parallel_cnt + 1'b1;
parallel_state <= 8'h00;
parallel_idle <= 1'b1;
IO_UPDATE <= 1'b0;
end
default: begin
Function_F0_F3 <= 4'b0; //功能引脚默认使用并行模式。F[3:0]=0000。
Data_D0_D31[0] <= 1'b1; //默认使用16位数据宽度模式。若使用了16位模式,则高位字节(位[15:8])传送至寻址的寄存器,且低位字节(位[7:0])传送至相邻的低位地址。
Data_D0_D31[2] <= 1'b1; //WR_n 低电平有效 若使能并行模式,则该引脚用于写入数据,改变内部寄存器的数值。
Data_D0_D31[15:8] <= 8'b0; //八位地址线 A[7:0]
Data_D0_D31[31:16] <= 16'b0; //默认16位数据线 D[15:0]
parallel_state <= 8'h0;
parallel_idle <= 1'b0;
end
endcase
end
endmodule