标题：RFAD
引言
RFAD是射频控制信息A/D转换模块中的一个重要组成部分，其用于产生需要定时的射频控制信号，如：AD_ON，DA_ON，通过选择两个SPI接口RF_SPI和AD_SPI把控制信号定时地发送到射频控制模块中的其他相应模块中,如：FIR模块[1]。该模块在整个射频控制中有着非常重要的作用，本文将详细阐述其基本功能和设计原理。如图1-1介绍了RFAD的功能结构：
图1-1 RFAD 功能结构图
控制信息
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
采样分频时钟
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
发送模式设计
为了使发送功率更加稳定，此模块在发送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
总结
RFAD作为射频控制模块中的重要部分，能够定时发送射频控制信息，并能根据实际情况调整发送模式。设计该模块最重要的三个方面即：定时发送射频控制信息，产生采样发送数据时钟分频和设计burst发送模式。本文对以上三大功能的设计方案做了基本介绍，希望对RFAD设计人员有所帮助。