2ASK调制解调
? ? ? ? ASK調(diào)制解調(diào)中,調(diào)制信號(hào)為二進(jìn)制數(shù)字信號(hào)(2ASK),載波幅度僅有兩種狀態(tài)變化,發(fā)送的信號(hào)上沒有載波時(shí)表示發(fā)送的碼元0,信號(hào)上有載波時(shí)發(fā)送的碼元1,可看作一個(gè)單極性的脈沖序列和一個(gè)載波相乘。
2ASK信號(hào)調(diào)制模型:
2ASK信號(hào)解調(diào)模型:
?由整流電路對(duì)輸入信號(hào)取整,將交流信號(hào)轉(zhuǎn)換成直流信號(hào),低通濾波器濾出基帶信號(hào)的包絡(luò),經(jīng)判決輸出,完成解調(diào)。
FPGA 端的實(shí)驗(yàn)框圖:
????????發(fā)送端:由ARM將數(shù)據(jù)傳入DDR,通過DMA進(jìn)行數(shù)據(jù)讀取并進(jìn)行并串轉(zhuǎn)換,再由tx_ask進(jìn)行調(diào)制,將調(diào)制后的信號(hào)送入AD9361經(jīng)PA后發(fā)送出去;
? ? ? ? 接收端:AD9361接收到的數(shù)據(jù)送入rx_fir進(jìn)行整流以及濾波,再由mean模型進(jìn)行均值平滑濾波器以消除噪聲干擾,bitsync模塊進(jìn)行數(shù)據(jù)同步,判決輸出,將接收到的模擬信號(hào)轉(zhuǎn)為數(shù)字信號(hào),由串并轉(zhuǎn)換將數(shù)據(jù)恢復(fù)成8位有效數(shù)據(jù),通過DMA寫回DDR,ARM端用串口將數(shù)據(jù)返回至上位機(jī),由上位機(jī)進(jìn)行解調(diào)正確性的判斷。
????????實(shí)驗(yàn)采用AD9361+zynq 框架實(shí)現(xiàn),首先需要搭建基于AD9361 的收發(fā)器框架。
1、AD9361 PL側(cè)框架搭建
????????AD9361框架圖:
?1T1R和2T2R讀寫時(shí)序圖:
?????????1T1R模式需要兩個(gè)時(shí)鐘才能完整的接收完一個(gè) 12 位的數(shù)據(jù),根據(jù)data_clk 和 rx_frame 信號(hào)先接收 I Q 路數(shù)據(jù)的高 6 位,再接收低 6 位;
? ? ? ? 2T2R模型需要四個(gè)時(shí)鐘才能完整接收完一個(gè)12位數(shù)據(jù),在rx_frame 信號(hào)為高時(shí),接收1個(gè)通道數(shù)據(jù),為低時(shí)接收另一個(gè)通道數(shù)據(jù);需要注意的是,rx_frame為高時(shí),接收的是兩個(gè)通道的高6位,反之接收低6位數(shù)據(jù);
? ? ? ? AD9361接口模塊設(shè)計(jì)框圖:
RX 鏈路:IBUFDS -> IDELAY -> IDDR ->RX_CHANNEL_IQ
TX 鏈路:TX_CHANNEL_IQ -> ODDR -> OBUFDS
IBUFDS和OBUFDS進(jìn)行單端信號(hào)與差分信號(hào)的相互轉(zhuǎn)換,因?yàn)镕PGA無法處理差分信號(hào);
IDDR和ODDR進(jìn)行單沿與雙沿采樣數(shù)據(jù)的轉(zhuǎn)換;
IDELAY用于動(dòng)態(tài)調(diào)制接收數(shù)據(jù)與時(shí)鐘的延遲;
RX_CHANNEL_IQ 和 TX_CHANNEL_IQ 是對(duì)RX 和 TX數(shù)據(jù)的解析,提取1T1R和2T2R模式下的? I /Q 路數(shù)據(jù);
FPGA系統(tǒng)搭建:
2、ASK信號(hào)的調(diào)制
? ? ? ? ?調(diào)制原理:發(fā)送的數(shù)據(jù)為0,則輸出0;發(fā)送的數(shù)據(jù)為1,則輸出載波信號(hào),即正余弦信號(hào)。
????????參數(shù):采樣時(shí)鐘 40MHZ,數(shù)據(jù)頻率100Kbps,載波頻率1.25MHZ,每個(gè)載波周期內(nèi)采樣點(diǎn)數(shù) 40/1.25=32個(gè),每個(gè)數(shù)據(jù)周期內(nèi)有 40/0.1=400個(gè)采樣點(diǎn)
????????模塊設(shè)計(jì)思路:調(diào)制模塊內(nèi)部需要先聲明兩個(gè)數(shù)組存放sin和cos對(duì)應(yīng)的數(shù)據(jù);通過計(jì)數(shù)器,在采樣時(shí)鐘作用下,從0~32進(jìn)行循環(huán)計(jì)數(shù),模塊每輸入一個(gè)數(shù)進(jìn)行一次判斷;當(dāng)輸入數(shù)據(jù)為0,輸出0;輸入數(shù)據(jù)為1,輸出sin 和cos數(shù)組內(nèi)與當(dāng)前計(jì)數(shù)器對(duì)應(yīng)的值。
使用MATLBA生成 sin 和 cos 數(shù)組:
t = 1:1/32:1; y1 = 255 * sin(2*pi*t); y2 = 255 * cos(2*pi*t); y1 = round(y1); y2 = round(y2); file = fopen('data.txt','w'); fprintf(file,'%d, ',y1); fprintf(file,'\n'); fprintf(file,'%d, ',y2); fclose(file);HLS實(shí)現(xiàn)tx_ask模塊:
void tx_ask(ap_uint<1> data_in, ap_int<12> *sin, ap_int<12> *cos){ap_int<12> cos_table[32] ={255 ,250 ,236 ,212 ,180 ,142 ,98 ,50 ,0 ,- 50 ,-98 ,-142 ,-180 ,-212 ,-236 ,-250 ,-255 ,-250 ,-236 ,-212 ,-180 ,-142 ,-98 ,-50 ,0 ,50 ,98 ,142 ,180 ,212 ,236 ,250};ap_int<12> sin_table[32] ={0 ,50 ,98 ,142 ,180 ,212 ,236 ,250 ,255 ,250 ,236 ,212 ,180 ,142 ,98 ,50 ,0 ,-50 ,-98 ,-142 ,-180 ,-212 ,-236 ,-250 ,-255 ,-250 ,-236 ,-212 ,-180 ,-142 ,-98 ,-50};if(data_in == 1){*sin = sin_table[count.range(4, 0)];*cos = cos_table[count.range(4, 0)]; } else {*sin=0;*cos=0; }count ++;if(count == 32) {count =0; } } }3、接收鏈路rx_fir 模塊實(shí)現(xiàn)
????????先進(jìn)行abs()函數(shù)取絕對(duì)值進(jìn)行整流,再由FIR低通濾波,濾除高頻載波信號(hào)。
? ? ? ? fir參數(shù)設(shè)置:采樣率40MHZ,54階低通濾波器,Hamming窗,通帶頻率100K;
?
?
void rx_ask (ap_int<20> *y,ap_int<12> x) {const ap_int<8> c[54] = {1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 17, 18, 18, 18, 18, 18, 18, 17, 17, 16, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 2, 2, 1, 1 };static ap_int<12> shift_reg[54];ap_int<26> acc;ap_int<12> x_t;int i;acc=0;x_t = abs(x);Shift_Accum_Loop: for (i=54-1;i>=0;i--) {if (i==0) {acc+=x_t*c[0];shift_reg[0]=x_t; } else {shift_reg[i]=shift_reg[i-1];acc+=shift_reg[i]*c[i]; } }*y = acc.range(25,6); }?4、均值濾波
? ? ? ? 將連續(xù)輸入的相鄰的數(shù)進(jìn)行累加求平均值,以濾除噪聲產(chǎn)生的毛刺,再送入同步模塊,使得其減少誤判。
void mean(ap_int<20> dina,ap_int<20> *dout){static ap_int<20> shift_reg[16];ap_int<24> acc;acc =0;int i;Shift_Accum_Loop:for(i=16-1;i>=0;i--){if(i==0) {shift_reg[0] = dina;acc += dina;}else{shift_reg[i]=shift_reg[i-1];acc+=shift_reg[i];}}*dout=acc.range(23, 4); //div 16dout =0; }5、判決輸出
????????包絡(luò)檢波輸出基帶波形后,需要將其進(jìn)行判決轉(zhuǎn)換為二進(jìn)制,因此要考慮判決門限的大小和符號(hào)采樣問題,保證門限判決的正確性和只對(duì)每一位符號(hào)判決后的二進(jìn)制值采樣一次。
? ? ? ? 數(shù)據(jù)幀結(jié)構(gòu):
????????工作流程:
? ? ? ? ?當(dāng)輸入值增大,則認(rèn)為有數(shù)據(jù)輸入,但也需要排除噪聲干擾的情況,所以對(duì)輸入值求均值,當(dāng)均值大于門限值,可判定有數(shù)據(jù)輸入,可進(jìn)行符號(hào)判決;利用FIFO進(jìn)行數(shù)據(jù)延拍,以便在最佳采樣點(diǎn)采集到穩(wěn)定數(shù)據(jù)。
? ? ? ? ?判決門限:
? ? ? ? 輸入數(shù)據(jù)大于門限值,判定數(shù)據(jù)為1;輸入數(shù)據(jù)小于門限值,判定數(shù)據(jù)為0;
? ? ? ? 符號(hào)判決:
? ? ? ? 保證一個(gè)符號(hào)周期內(nèi),只對(duì)符號(hào)采樣一次,且在判決后的二進(jìn)制數(shù)據(jù)的正中間時(shí)刻采樣;
? ? ? ? 判斷幀頭:
? ? ? ? 幀頭由巴克碼和定界符組成,利用序列檢測(cè)器即可實(shí)現(xiàn)。
? ? ? ? 檢測(cè)到幀頭后,可提取LEN信息,得到數(shù)據(jù)的長(zhǎng)度,以便得到裸數(shù)據(jù),寫入DDR。
6、DMA實(shí)現(xiàn)
????????ARM端通過串口接收數(shù)據(jù)并寫入DDR,FPGA通過DMA將數(shù)據(jù)讀出送入調(diào)制部分;而解調(diào)部分則將數(shù)據(jù)通過DMA寫回DDR,由ARM返回給上位機(jī)。
?DMA IP:
?
?S_AXI_LITE:配置通道,axi_dma IP去DDR里面哪個(gè)地址空間,讀多少數(shù)據(jù),由此接口配置讀取的地址及讀取數(shù)據(jù)的長(zhǎng)度;S_AXI_LITE配置后之后啟動(dòng)讀,就能夠從IP輸出端驅(qū)動(dòng) HP口讀取數(shù)據(jù),中間需要經(jīng)過協(xié)議轉(zhuǎn)換IP(interconnected);
M_AXI_MM2S輸出的是從DDR存儲(chǔ)器中讀出要發(fā)送的數(shù)據(jù),該數(shù)據(jù)需要通過自定義緩存模塊(s_axis_rd)進(jìn)行數(shù)據(jù)位寬轉(zhuǎn)換(64bit->8bit)和跨時(shí)鐘域處理,每次緩存一幀突發(fā)數(shù)據(jù);
M_AXI_S2MM輸出的數(shù)據(jù)同樣需要通過自定義緩存模塊(m_axis_wr)進(jìn)行數(shù)據(jù)位寬轉(zhuǎn)換(8bit->64bit)和跨時(shí)鐘域處理,緩存完一幀突發(fā)長(zhǎng)度時(shí)進(jìn)行寫操作,將解調(diào)數(shù)據(jù)寫入DDR;
? ? ? ? 解決輸入數(shù)據(jù)長(zhǎng)度不為 8字節(jié)整數(shù)倍的問題:
? ? ? ? 因?yàn)榭倲?shù)據(jù)長(zhǎng)度不可知,當(dāng)不為8字節(jié)整數(shù)倍時(shí)需要插入無效字節(jié),使得FIFO讀的時(shí)候可以整體8字節(jié)讀出,便于FIFO讀空內(nèi)部的數(shù)據(jù)。如果是8字節(jié)的整數(shù)倍的數(shù)據(jù)長(zhǎng)度,其低三位為000;
如果不是8字節(jié)的整數(shù)倍,可以將數(shù)據(jù)長(zhǎng)度的低三位取反再加1得到的值作為無效數(shù)據(jù)填充進(jìn)FIFO內(nèi)部。舉例:數(shù)據(jù)長(zhǎng)度低三位為3'b011,余數(shù)為3,需要寫入5字節(jié)湊齊8字節(jié),則將3'b011取反再加1,即得到3'b101,為十進(jìn)制5。
總結(jié)
- 上一篇: MySQL的IFNULL() 函数使用
- 下一篇: 房屋建筑结构安全自动在线监测系统解决方案