AD9914编程和功能引脚

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

你可能感兴趣的:(AD9914编程和功能引脚)