之前我们写好了收发模块并进行了仿真,这个BLOG我就尝试在ZEDBOARD+FMCOMMS3试验平台上实现。
我们看上篇BLOG实现到的效果,BIT_IN经过了调制,之后经过解调(符号位过0检测)直接反应到BIT_OUT。
而我们实际在试验平台上检测要加上射频部分。大体过程这样:
发送端:BIT_IN -> FSK_modulator -> 上变频到2.4G(别的频率也可以)-> 天线
接收端:天线->下变频到基带->FSK_DEmodulator->BIT_OUT
当然这个过程省略了AD9361里面进行的各种插值和抽取。
我们这里自收自发,使用1R1T模式。
我们这里直接做成AXILITE外设的IP核。将几个参数都设置的可以改写。OK 动手开始。
// Add user logic here
wire [15:0] cnt0,cnt1 ;
wire [7:0] step0,step1 ;
assign {cnt1,cnt0} = slv_reg1[31:0] ;
assign {step1,step0} = slv_reg2[15:0] ;
assign {v_short,v_long} = slv_reg3[31:0] ;
wire [11:0] sin,cos;
always @ (posedge bb_clk) bb_i_out[15:0] <= { sin[11:0],4'b0000 } ;
always @ (posedge bb_clk) bb_q_out[15:0] <= { cos[11:0],4'b0000 } ;
FSK_modulator FSK_modulator (
.bb_clk(bb_clk),
.bit_in(bb_bit_in) ,
.cnt0( cnt0 ),
.cnt1(cnt1),
.step0(step0),
.step1(step1),
.sin(sin) ,
.cos(cos)
);
reg flag_bit ;
always @ (posedge bb_clk) flag_bit <= bb_q_in[11+4] ;
FSK_DEmodulator #(.SHORT_VALUE (1) ) FSK_DEmodulator (
.bb_clk(bb_clk),
.bit_out(bb_bit_out) ,
.v_short(v_short) ,
.v_long(v_long) ,
.flag_bit(flag_bit)
);
// User logic ends
大体看看没有什么问题了,IP是这一个样子。
bb开头表示是BASEBAND时钟域。这里的bb_bit_in和bb_bit_out我接在了PMOD上,我接一个USB转串口在上面,一会儿看是否可以进行回环测试,即TXD=RXD.测试OK。
写一下C语言部分的驱动
void FSK_TX_SET(unsigned int cnt0,unsigned int cnt1,unsigned int step0,unsigned int step1){
unsigned int t;
cnt0 &= 0xffff; cnt1 &= 0xffff; step0 &= 0xff;step1 &= 0xff;
t = cnt1;t<<=16;t|=cnt0;
*(volatile unsigned int *) (0x43c00000 + 1*4) = t ;
t = step1;t<<=8; t|=step0;
*(volatile unsigned int *) (0x43c00000 + 2*4) = t ;
}
void FSK_RX_SET(unsigned int v_short ,unsigned int v_long ){
unsigned int t;
v_short &= 0xffff; v_long &= 0xffff;
t = v_short;t<<=16;t|=v_long;
*(volatile unsigned int *) (0x43c00000 + 3*4) = t ;
}
void FSK_SET (){
FSK_TX_SET (0,0,4,9);
FSK_RX_SET(50,80);
}
之后编译一下,看看效果如何。