引言
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