-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Cхема приемника и передатчика (в прямоугольниках - внутренние элементы ПЛИС).
Номиналы зависят от паразитных емкостей и тп, можно менять. Варикап любой ВЧ, с емкостью ~20пФ при малых напряжениях смещения(0..1В) (сам использовал не тот, что на схеме указан, а другой с похожими параметрами).
Тк в проекте использовался стробоскопический осциллограф (для настройки), который раньше был написан на "Си как HDL", то и остальной код был написан на нем-же. Для "полевых" тестов использовался упрощенный код (который заливался после настройки) - без осциллографа и ethernet (тк батарейное питание, и помех меньше). Если кто-то захочет попробовать повторить проект, этот упрощенный код могу перевести в верилог (на перевод осциллографа пока нет времени).
Но настройка непростая. И надо учитывать, что через встроенные диоды текут токи, поэтому 100% гарантии, что ПЛИС не сгорит, нет (у меня DE0-nano и для приемника, и для передатчика).
Топ-модуль приемника на "Си как HDL", в v.zip используемые верилоговские модули PLL, ROM, RAM, *.mif (sig4clk2 использовался для осциллографа 900Мвыб/сек, для приемника это не нужно, но не стал сильно менять код). //-----------------------------------------------------------------------------
ext [1] CLOCK_50;
ext [2] AMP_CMP;
bit [2] AMP_SW;
bit [1] AMP_GEN;
bit [8] LED;
top(){
bit [1] clk450, clk225;
pll2(9,1,2)(CLOCK_50, clk450, clk225);
bit [2][4] sig4clk2;
rx4clk2(clk450, AMP_CMP[0], sig4clk2[0]);
rx4clk2(clk450, AMP_CMP[1], sig4clk2[1]);
bit [2] sigOR;
rx4(clk225, sigOR[0], sig4clk2[0]);
rx4(clk225, sigOR[1], sig4clk2[1]);
bit [1] data, ready;
amp(clk225, data, ready, sigOR, AMP_GEN, AMP_SW);
filtled(clk225, data, ready, LED);
}
//-----------------------------------------------------------------------------
ext [1] data, rdy;
bit [8] LED;
filtled(){
bit [16] hs; rom("hsin.mif")(ah, hs);
bit [16] hc; rom("hcos.mif")(ah, hc);
bit [11] ah;
bit [12] ar, aw;
bit [1] isin;
bit [1] re, we;
agen(ah, ar, aw, isin, re, we, rdy);
bit [1] qw, qr;
mem(12,1)(qw, data, aw, we, qr, 0, ar, 0);
filt(LED, qr, we, re, isin, hs, hc);
}
//-----------------------------------------------------------------------------
reg [11] ah;
reg [12] ar, aw;
reg [1] isin;
reg [1] re, we;
ext [1] rdy;
agen(){
reg [11] step; isin=step[10];
reg [1] rdy0, we0, clr;
rdy0=rdy;
we0=we;
we=rdy0&~rdy;
re=we0&~we;
ah=ah+step;
if(ah==1495) step=-1;
if(ah==0) step=0;
if(re){ ah=1; step=1; }
ar=ar+1;
if(ar==2990) ar=0;
if(re) ar=aw;
if(we){
aw=aw+1;
if(aw==2990) aw=0;
}
}
//-----------------------------------------------------------------------------
reg [8] LED;
ext [1] qr, we, re, isin;
ext [16] hs16, hc16;
filt(){
reg [32] hs, hc;
hs={{16{hs16[15]}},hs16};
hc={{16{hc16[15]}},hc16};
reg [32] sadd, ssub, cadd, csub;
reg [32] m, mc, ms, ac, as;
if(qr^isin) ssub=ssub+hs; if(~qr^isin) sadd=sadd+hs;
if(qr) csub=csub+hc; if(~qr) cadd=cadd+hc;
if(re){
mc=cadd-csub;
ms=sadd-ssub;
ac=mc[31]?~mc:mc;
as=ms[31]?~ms:ms;
m=ac+as;
LED[7:2]=m[24:19];
LED[0]=qr;
LED[1]=~qr;
ssub=0; sadd=0;
csub=0; cadd=0;
}
}
//-----------------------------------------------------------------------------
reg [1] sig;
ext [4] sig4clk2;
rx4(){ sig = |sig4clk2; }
//-----------------------------------------------------------------------------
reg [1] data, ready;
ext [2] ampcmp;
reg [1] AMP_GEN;
reg [2] AMP_SW;
amp(){
reg [2][8] delay;
reg [2][8] code1;
reg [2][8] code0;
reg enagen;
ready=0;
delay=delay+1;
if(delay==0){ enagen=1; AMP_GEN=0; }
if(enagen){
if(delay[0][1:0]==1) AMP_GEN=1;
if((delay[0][1:0]==2)&(|ampcmp)&(code0==0)){ code0=delay; code1=ampcmp; }
if(delay[0][1:0]==3) AMP_GEN=0;
}
if(delay==2046) enagen=0;
if(delay==2048) data=code0[0][2]^code1[0][0];
if(delay==2050) ready=1;
if(delay==2127){ AMP_GEN=0; code0=0; code1=0; }
if(delay==2143) AMP_SW=0x0;
if(delay==2600) AMP_SW=0xz;
if(delay==2999) delay=0;
}
//-----------------------------------------------------------------------------
|