词条 | RFAD |
释义 | RFAD(射频A/D控制信息定时发送器)。1. 引言RFAD是射频控制信息A/D转换模块中的一个重要组成部分,其用于产生需要定时的射频控制信号,如:AD_ON,DA_ON,通过选择两个SPI接口RF_SPI和AD_SPI把控制信号定时地发送到射频控制模块中的其他相应模块中,如:FIR模块[1]。该模块在整个射频控制中有着非常重要的作用,本文将详细阐述其基本功能和设计原理。如图1-1介绍了RFAD的功能结构: 图1-1 RFAD 功能结构图 2. 定时发送射频控制信息RFAD的主要功能是定时传输射频控制信息,在此模块中设计了两个FIFO: DATA FIFO用于存储射频控制信息, TIME FIFO用于存储时间信息。模块中将设定当系统帧计数器与TIME FIFO中对应的时间相同时,与这个时间对应的射频控制信息就应被发送出去[2] ,设计流程如下图所示: 图2-1定时发送射频控制信息设计流程图 l 设计存储射频控制信息模块 该模块的设计中将定义两个FIFO(first in first out),分别用于存储时间信息和射频控制信息。如例2-1将说明如何定义data_fifo(用于存储射频控制信息)以及如何对fifo进行读/写操作: eg2-1:define data_fifo module data_fifo (rst_,clk,wr_i,rd_i,wr_addr,rd_addr,fifo_data_i,fifo_data_o); input rst_ ,clk, wr_i,rd_i; input [4:0] wr_addr, [4:0] rd_addr; input [11:0] fifo_data_i; output [11:0] fifo_data_o; reg [11:0] fifo_data_o; // 定义12bit,深度为32的FIFO reg [11:0] register_fifo[0:31]; //下面设计写fifo的情况 always @(posedge clk or negedge rst_) begin if(!rst_) //复位信号到来时,复位fifo中的每一位。 begin register_fifo[0]<=12'b0; end else if(wr_i==1'b1)//写信号使能时,根据写地址,把射频控制信息写入fifo register_fifo[wr_addr]<=fifo_data_i; end //下面设计读fifo的情况 always @(posedge clk or negedge rst_) begin if (!rst_) fifo_data_o<=12'b0; else if (rd_i==1'b1) //读信号使能时,根据读地址,把射频控制信息从fifo中取出来 fifo_data_o<=register_fifo[addrd_i]; end endmodule l 定时发送模块设计 在上例中的fifo读/写使能信号都是由外部模块驱动的,因此需要设计一个模块用于确定何时使能读/写信号,即当time_fifo中存储的时间信息与帧计数器相同时,需使能读/写使能信号输出data_fifo存储的射频控制信息。如例2-2所示: eg2-2:define transfer time module time_count(rst_,clk,fifo_time,framc,read_en,fifo_read_en); input rst_, clk; input [15:0] fifo_time,[15:0] framc; output read_en;//该信号使能,读地址累加 output fifo_read_en;//该信号使能,data_fifo输出射频控制信号 reg time_int; reg[1:0] time_int_delay; assign fifo_read_en = time_int |(time_int_delay[0]); assgin read_en = time_int_delay[0] |(time_int_delay[1]); //即read_en比fifo_read_en延迟一个clk使能 always @(posedge clk or negedge rst_) begin if(!rst_) time_int <= 1'b0; else if(fifo_time == framc)// 当time_fifo中存储的时间信息等于framc(帧计数器) time_int <= 1'b1; //time_int被使能 else time_int <= 1'b0; end always @(posedge clk or negedge rst_) begin if(!rst_) time_int_delay[1:0] <= 2'b0; else time_int_delay[0] <= time_int; time_int_delay[1] <= time_int_delay[0]; end endmodule l 竞争发送模块设计 当chip在 idle情况下,将有RF控制信息(此时为idle_data)需要发送,当chip唤醒后则应优先发送idle_data。若idle_data与控制信息在同一时刻发送,则存在竞争发送的情况。因此该模块限定了当idle_en与pllon信号同时拉高时,rfctrl要发送idle_data中的相应比特,从而取代fifo_data中相应比特的发送。如图2-2所示: 图2-2 RFAD 在idle情况下工作流程图 Verilog设计举例如例2-3所示: eg2-3:transfer idle_data and fifo_data: module idle_time(fifo_data,pllon,idle_en,idle_data,rfctrl_o); input [5:0] fifo_data,[5:0] idle_data,[5:0]idle_en; input pllon; output [5:0] rfctrl_o; reg[5:0] rfctrl_o; always @(pllon or fifo_data or idle_data or idle_en)//组合逻辑电路 begin if(!pllon) rfctrl_o[5:0] = fifo_data[5:0]; else //即当pllon拉高时且idle_en的相应bit位为1时,输出idle_data的相应bit,否则输出fifo_data的相应bit rfctrl_o[0] = (idle_en[0])?idle_data[0]:fifo_data[0]; rfctrl_o[1] = (idle_en[1])?idle_data[1]:fifo_data[1]; rfctrl_o[2] = (idle_en[2])?idle_data[2]:fifo_data[2]; rfctrl_o[3] = (idle_en[3])?idle_data[3]:fifo_data[3]; rfctrl_o[4] = (idle_en[4])?idle_data[4]:fifo_data[4]; end end endmodule 3. 产生数据采样分频时钟RFAD发送数据的频率需与外接模块如:FIR保持一致,RFAD采样发送数据的时钟是系统时钟的分频时钟,其关系如图3-1所示。因此产生分频时钟和采样使能信号是该模块设计的关键,如图3-2所示: 图3-1 设置分频系数=4时sclk和clk之间的关系 图3-2 在spi_en =0,CKE=1,CKP=0配置下发送数据采样波形 产生分频时钟及发送数据时序设计思路如例3-1所示,下图为仿真结果图: 图3-3 产生Sclk及发送Rf_data仿真结果图 eg3-1: generator drv_clk and send rfctrl_data: module drv_clk(rst_,clk,frq_drv,sclk,spi_en,rfctrl_data,Rf_data_o); input clk,rst_; //系统时钟 input[3:0] frq_drv; //分频系数 input[11:0] rfctrl_data; //需要发送的射频信息 output Rf_data_o; //发送数据信号线 output sclk,spi_en; reg[3:0] count; //产生数据采样分频时钟 always @(posedge clk or negedge rst_) begin if(!rst_) count[3:0] <= 4'b0; sclk <= 1'b0; else begin count <= count+1; if(count == frq_drv - 1) //当count计数到分频系数-1时,sclk变相 begin sclk <= ~sclk; end end end //发送射频控制信息 always @(posedge clk or negedge rst_) begin if(!rst_) count[3:0] <= 4'b0; Rf_data_o <= 1'b0; else begin count <= count+1 if(count == 2*frq_drv-1) begin Rf_data <= rfctrl_data[11]; //每次发送rfctrl_data的最高bit rfctrl_data[11:0] <= {rfctrl_data[10:0], 1'b0};//然后rfctrl_data[11:0]左移一位 end end endmodule 4. burst发送模式设计为了使发送功率更加稳定,此模块在发送APC(自动功率控制)时提供了burst模式,即把一次性需要发送的功率分为几步发送出去,并规定了每步发送的功率=step_value*para,这样就避免在发送功率控制信息时产生突激[4]。仿真结果如图4-1所示: 图4-1 APC在burst方式下发送数据仿真结果时序图 burst的设计思路如例4-1所示: eg4-1 burst step design: module burst(rst_,clk,apc_flag,step0,step1,step2,para,burstout,burst_en); input rst_,clk,flag; input [11:0]step0,[11:0]step1,[11:0]step2;//每步所需发送的功率值 input [11:0]para;//每步功率的增益 otput[15:0] burstout;//最后每步发送的功率值= para * step_value input burst_en; wire [15:0] burstout; reg [11:0] step_value; reg [1:0] step_count;//记录目前发送的步数 assign burstout = step_value*para; always @(posedge clk or negedge rst_) begin if(!rst_) step_value[11:0] <= 12'b0; else begin case(step_count) 2'b00: step_value[11:0]<= step0[11:0]; 2'b01: step_value[11:0]<= step1[11:0]; 2'b10: step_value[11:0]<= step2[11:0]; ndcase end end //计算step_count always @(burst_en) begin step_count <= step_count+1; end endmodule 5. 总结RFAD作为射频控制模块中的重要部分,能够定时发送射频控制信息,并能根据实际情况调整发送模式。设计该模块最重要的三个方面即:定时发送射频控制信息,产生采样发送数据时钟分频和设计burst发送模式。本文对以上三大功能的设计方案做了基本介绍,希望对RFAD设计人员有所帮助。 |
随便看 |
|
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。