LO Frequency Plan
概述
LO DIV是位于VCO和mixer之間的模塊,其作用是分頻和驅(qū)動長走線,設(shè)計難點在于底噪。
不同的band有不同的頻率覆蓋范圍,為了減小VCO的設(shè)計難度需要選擇合適的分頻方案。E-UTRA規(guī)定的band與頻率的對應(yīng)關(guān)系在3GPP或wikipedia上可以查到。
一般來說,決定了所要支持的band、分頻比步長、基本分頻器、VCO的最高頻率以及VCO的個數(shù),最佳的LO分頻方案就確定了。
- 所要支持的band決定于產(chǎn)品的定位,不需多說。
- 分頻比步長決定于mixer結(jié)構(gòu),即如果需要正交時鐘就至少有個除2,如果需要8相位時鐘就至少有個除4,這項選擇會非常大的影響能選用的方案。
- 基本分頻器決定于技術(shù)儲備,如果不能駕馭除3、除5那就老老實實的只用除2吧。
- VCO的最高頻率決定于所用工藝,頻率越高對寄生約敏感,暫以40nm工藝8GHz為上限進行討論,實際能做多高還要看VCO設(shè)計工程師的水平。
- VCO的個數(shù)決定于規(guī)劃的最大面積,也就是用成本換性能。
在選取方案時最重要的一個考慮項是VCO所需的調(diào)諧范圍,這是因為寬調(diào)諧范圍通常意味著小Q值的電感,即較差的相位噪聲。如果兩個VCO的話還可以考慮把對噪聲要求高的band都放在一個調(diào)諧范圍小的core里。
單core方案
由所需覆蓋的分頻后的頻率范圍和設(shè)定的VCO最高頻率可以得出可用的最大分頻比,再由分頻比步長和可用的基本分頻器種類得出真正可用的所有分頻比。(此處把f_max調(diào)整到了8080MHz,是因為max(f_h)*4=8080,若不調(diào)整會出現(xiàn)無法全面遍歷的問題)
% Up-link, f_max=8GHz, /2 could be used, /2 at least needed f_l = [1920, 1850, 1710, 1710, 824, 2500, 880, 1749.9, 1710, 1427.9, 699, 777, 788, 704, 815, 830, 832, 1447.9, 3410, 2000, 1626.5, 1850, 814, 807, 703, 2305, 452.5]; f_h = [1980, 1910, 1785, 1755, 849, 2570, 915, 1784.9, 1770, 1447.9, 716, 787, 798, 716, 830, 845, 862, 1462.9, 3490, 2020, 1660.5, 1915, 849, 824, 748, 2315, 457.5]; f_max = 8080; div_max= ceil(f_max/min(f_h)); basic_div = [2]; divs = []; for i=2:2:div_maxtmp = unique(factor(i));flag= 0;for j=1:1:length(tmp)if nnz(basic_div-tmp(j))==length(basic_div)flag = 1;break;endendif flag==0divs(end+1) = i;end end得到了所有可用的分頻比后就可以進行迭代了,初始方案為全都是最小分頻比,后面的方案均繼承前一個方案,然后調(diào)高限制最低頻率的band的分頻比,直到VCO的最高頻率超過設(shè)置的f_max或限制最低頻率的band的分頻比已是最大值。
i = 1; while 1if i==1plans(i, :) = divs(1)*ones(size(f_l));elseplans(i, :) = plans(i-1, :);for j=1:length(i_l)plans(i, i_l(j)) = next_div(divs, plans(i, i_l(j)), +1);endend[f_vco_l(i), f_vco_h(i), f_vco_range(i), i_l, i_h] = ...check_plan(f_l, f_h, plans(i,:));if f_vco_h(i)>f_max || max(plans(i, i_l))==divs(end)break;endi = i+1; end最后按照VCO調(diào)諧范圍進行排序,即可找到調(diào)諧范圍最小時的分頻方案。本例的結(jié)果如下圖所示,VCO的調(diào)諧范圍需要55%左右,難以實現(xiàn)。
對于無法接受的結(jié)果可以通過增加VCO個數(shù)、提高VCO最高頻率或采用/3/5分頻器改善(若限制不在大分頻比的band,采用/3/5分頻器也沒有作用,如本例),其中增加VCO個數(shù)是最直接、最有效的解決方法,缺點是會增加成本。
雙core方案
增加一個VCO有時候不僅僅是增大了一個VCO的面積,還帶來了布局布線上的困難,實在是不得已的辦法。
對于兩個VCO,首先要確定的是哪些band放到core1,哪些band放到core2。很直接的想到了遍歷,但是分法的數(shù)量隨著band個數(shù)的增加呈指數(shù)形式( n=∑?floor(k/2)?i=0?C?i?k?? ),以本例中的27個band來說就有67M種分法,遍歷的困難太大。
把f_l和f_h按照大小順序畫出來會發(fā)現(xiàn)有很多band的頻率范圍是相近的,可以把它們分成一組,通過這種方法來大大減少分法。
因此雙core方案的遍歷方法是:
具體實現(xiàn)代碼如下:
f_l = [1920, 1850, 1710, 1710, 824, 2500, 880, 1749.9, 1710, 1427.9, 699, 777, 788, 704, 815, 830, 832, 1447.9, 3410, 2000, 1626.5, 1850, 814, 807, 703, 2305, 452.5]; f_h = [1980, 1910, 1785, 1755, 849, 2570, 915, 1784.9, 1770, 1447.9, 716, 787, 798, 716, 830, 845, 862, 1462.9, 3490, 2020, 1660.5, 1915, 849, 824, 748, 2315, 457.5]; group = [10, 9, 8, 8, 4, 13, 5, 8, 8, 6, 2, 3, 3, 2, 4, 4, 4, 6, 14, 11, 7, 9, 4, 4, 2, 12, 1];% 根據(jù)分組進行組合 u_group = unique(sort(group));l_choose_group = 0; for i=0:floor(length(u_group)/2)l_choose_group = l_choose_group+nchoosek(length(u_group), i); end choose_group= zeros(l_choose_group, length(u_group));k = 1; for i=0:floor(length(u_group)/2)tmp = nchoosek(u_group, i);if isempty(tmp)choose_group(k, :) = ones(size(u_group));k = k+1;elsefor j=1:length(tmp(:,1))choose_group(k, :) = ones(size(u_group));choose_group(k, tmp(j,:)) = 2;k = k+1;endend end% 把組合結(jié)果映射回band sel_core = ones(length(choose_group(:,1)), length(group)); for i=1:length(choose_group(:,1))tmp = find(choose_group(i,:)==2);if ~isempty(tmp)for j=1:length(tmp)sel_core(i, group==tmp(j)) = 2;endend endfprintf('\t分組完成,共計%d條。\n', length(sel_core(:,1))); fprintf('\t開始遍歷:');% 逐條進行freq plan遍歷,并將最好的方案匯總在一起 plans = zeros(size(sel_core)); f_vco1_range= zeros(length(sel_core(:,1)), 1); f_vco1_l = zeros(length(sel_core(:,1)), 1); f_vco1_h = zeros(length(sel_core(:,1)), 1); f_vco2_range= zeros(length(sel_core(:,1)), 1); f_vco2_l = zeros(length(sel_core(:,1)), 1); f_vco2_h = zeros(length(sel_core(:,1)), 1); f_vco_range = zeros(length(sel_core(:,1)), 1); for i=1:length(sel_core(:,1))if mod(i, round(length(sel_core(:,1))/10))==0fprintf('.....%d%%', round(i*100/round(length(sel_core(:,1)))));endi1 = find(sel_core(i,:)==1);i2 = find(sel_core(i,:)==2);if ~isempty(i1)[tplans, tf_vco_range, tf_vco_l, tf_vco_h] = ...do_freq_plan(f_l(i1), f_h(i1));[tmp, j] = sort(tf_vco_range, 2, 'ascend');plans(i, i1) = tplans(j(1),:);f_vco1_range(i) = tf_vco_range(j(1));f_vco1_l(i) = tf_vco_l(j(1));f_vco1_h(i) = tf_vco_h(j(1));endif ~isempty(i2)[tplans, tf_vco_range, tf_vco_l, tf_vco_h] = ...do_freq_plan(f_l(i2), f_h(i2));[tmp, j] = sort(tf_vco_range, 2, 'ascend');plans(i, i2) = tplans(j(1),:);f_vco2_range(i) = tf_vco_range(j(1));f_vco2_l(i) = tf_vco_l(j(1));f_vco2_h(i) = tf_vco_h(j(1));endf_vco_range(i) = max([f_vco1_range(i); f_vco2_range(i)]); end fprintf('.....100%%\n');% 按照range升序排序 fprintf('\t== 單Core方案 ================================================\n'); fprintf('\tRange = %.3f, Fmin = %.1fMHz, Fmax = %.1fMHz, %s\n', ...f_vco1_range(1)*100, f_vco1_l(1), f_vco1_h(1), num2str(plans(1, :))); fprintf('\t== 雙Core方案 ================================================\n'); j = find(f_vco_range==min(f_vco_range)); sel_core = sel_core(j, :); plans = plans(j, :); f_vco1_range = f_vco1_range(j); f_vco1_l = f_vco1_l(j); f_vco1_h = f_vco1_h(j); f_vco2_range = f_vco2_range(j); f_vco2_l = f_vco2_l(j); f_vco2_h = f_vco2_h(j); f_vco_range = min([f_vco1_range, f_vco2_range], [], 2); [tmp, i] = sort(f_vco_range, 1, 'ascend'); for j=1:length(i)fprintf('\tRange_1 = %.3f%%, Fmin_1 = %.1fMHz, Fmax_1 = %.1fMHz; Range_2 = %.3f%%, Fmin_2 = %.1fMHz, Fmax_2 = %.1fMHz; %s; %s\n', ...f_vco1_range(i(j))*100, f_vco1_l(i(j)), f_vco1_h(i(j)), ...f_vco2_range(i(j))*100, f_vco2_l(i(j)), f_vco2_h(i(j)), ...num2str(sel_core(i(j), :)), num2str(plans(i(j), :))); end fprintf('\n');運行結(jié)果如下圖所示:
最終結(jié)果
Up-link的LO方案:
Down-link的LO方案(TDD模式的都放到了Down-link中):
總結(jié)
以上是生活随笔為你收集整理的LO Frequency Plan的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 折线图并添加误差阴影
- 下一篇: python读word中表格