《通信原理》課程項目報告
?
?
?
題 ???目:??? ??????基于開發板的通信系統 ?????????
組??? 號:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
任課教師: ???????????? ? ? ? ? ? ? ??
組??? 長: ??? ????????????
組??? 員: ? ???????????
組??? 員: ??? ???????????
組??? 員: ????????????
組??? 員: ?? ???????????
聯系方式:? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
?
二零一九年? 2 月 23 日
一、實施方案
設計要求:
在給定的開發板DE10-Lite上,完成以下任務:
?
第一級:完成數模轉換、二進制調制解調(不含2ASK)(60分)
?
第二級:完成多進制調制解調、或載波同步(80分)
?
第三級:同時完成多進制調制解調和載波同步(90分)
?
單項加分:載波是正弦波,或頻率硬件可調,或系統可以實現其他功能(每個10分)
實現思想:
使用偽隨機序列模擬基帶信號進行FSK調制,通過DA輸出調制波形;再接入AD口模擬信號接收端,對AD采樣的信號進行解調,恢復出原始基帶信號,并與原始信號進行比較。
在應用熟練軟件之后,根據相同的思路做了多進制FSK,對多進制的效率有了更深的體會。
二、實施過程及結果分析
拿到板子之后,我們組內討論得出:做FSK調制解調;一是便于觀察、演示,二是解調手段多樣,便于板子上實現。
不過初期組內熟悉quartus和verilog編程的并不多,而且對項目要求并不是很了解,所以前幾周更多的是學習verilog以及熟悉軟件。在做過通信原理實驗的同學幫助下,算是知道了FSK是怎么一回事,緊接著便著手初步的調制。
在中期的時候我們總算明白了該怎么起手去做:利用FPGA板子做出數字的正弦波,再用基帶信號去進行鍵控調制。
不過由于當時沒有DA模塊再加上對quartus的不熟悉,一切都只是簡單的嘗試,而且只能花費時間先去學仿真軟件modelsim,以期望能仿真出一個正弦波。
網上也各自找了怎么實現數字正弦波,一般的做法是要寫ROM模塊,通過累加地址依次輸出一個一個數據,數據的來源則是通過matlab實現。
最初感覺很復雜,各種各樣的軟件要聯合起來,大家都不大愿意去做,時間也越來越少,只有沉下心去一點點實現。
中途modelsim軟件又出現各種問題,庫文件不全,無法仿真,在網上找了很久找到一個笨辦法,每次仿真時都要手動重新選擇自己生成的庫文件:
https://wenku.baidu.com/view/67f7dbcb05a1b0717fd5360cba1aa81144318f00.html
在枯燥的重復操作中算是熟悉了基本的編程以及仿真方法,百度了很多資料,采用讀取ROM的方法總算是生成了初步的正弦載波,踏出了第一步,仿真圖如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中使用到來自matlab生成的mif文件作為數據源,matlab代碼如下:
clear;
?
%生成數據
depth = 64;
width = 8;
index = 0:2 * depth - 1;
value = 0.5*sin(2*pi*index/depth) + 0.5;
value = im2uint8(value);
%===============================開始寫mif文件===============================
addr=0:2 * depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
?
fid=fopen('data2.mif','w');? %打開或者新建mif,存放位置和文件名任意
???????????????????????? ?????%如果只寫文件名,則在當前目錄下建立此文件
fprintf(fid,str_width);
fprintf(fid,';\n');
fprintf(fid,str_depth);
fprintf(fid,';\n\n');
fprintf(fid,'ADDRESS_RADIX=HEX;\n');? %因為下面的數據輸入我選的是16進制,
?
fprintf(fid,'DATA_RADIX=HEX;\n\n');
fprintf(fid,'CONTENT BEGIN\n');
fprintf(fid,'\t%X : %X;\n',[addr;value]);? %開始寫數據了
fprintf(fid,'END;\n');
fclose(fid);
?
就是用128個點的數據去擬合一個周期的正弦波,同時這里用了數字圖像處理的一個函數im2uint8,將0~1的值直接轉化為0~255的8位二進制值。
仿真結束后,實際電路我們打算用FPGA的鎖相環PLL將時鐘擴展到128M,再去驅動這個ROM模塊,這樣就能生成1MHz的正弦載波了。
調用的過程中,我們也了解到FPGA一大方便之處:調用IP核。很多常用模塊都可以直接通過調核來實現相應功能,像之前實現的正弦載波其實可以直接調用NCO生成。
依靠著強大的百度,我們學會了調用PLL,成功生成128M時鐘驅動ROM實現了1MHz正弦波,并初次使用到了FPGA強大的“內置示波器signal tap”:
然后簡單實現了一個偽隨機序列,并編寫了選通輸出模塊,兩路載波分別為1M、2M,成功完成了2FSK的調制。
放假前夕,我們組拿到了ADDA子卡,可以通過DA輸出、信道傳輸后進行AD采樣來模擬接收了。
假期討論中我們遇到了一個很嚴重的問題,DA發送沒問題,AD接收有問題,我們按照ADDA子卡文檔上進行操作但觀察到的實際波形卻是:
第三行是調制輸出給DA口的,第二行是AD接收的,我們一度懷疑自己設置錯誤了,或者時鐘沒給正確。經過一系列排查,我們發現是頻率的問題。這個“信道”就像是一個低通濾波器,頻率越高衰減越嚴重。
因此我們不得不改變原來制定的1M、2M,將頻率降低到能夠演示的范圍。最后直接用10M時鐘驅動ROM模塊得到78k、156k的兩路載波,而隨機序列則是10k,也能滿足要求。
其調制實際波形通過示波器查看:
可以看到測量頻率為78k,與設計相符,不過這個正弦波很明顯可以看出一些不連續(臺階),放大后觀察:
這是因為一個周期實際上只用了128個點去近似模擬,這也是我們精度不高的原因。之后做MFSK的時候,已經熟悉了各種操作,通過調用NCO數控振蕩器生成的載波就很平滑,如下:
解調部分我們使用的是非相干解調,將AD接收的信號分兩路,分別通過對應的帶通濾波器,經過全波整流,再低通濾波即可提取出兩路信號的包絡,對兩路信號進行抽樣判決即可解調出原始基帶信號,就是按照書中原理實現的。
這里又牽扯到一個問題,濾波器的實現,查了很多網上的資料,它們一般都是調用的FIR Compiler這個一代IP核,而quartus16給的已經是FIR II這個IP核,有一些不同。
我們借助一代的資料再加上自己的摸索最終實現了FIR濾波器,它的實現同樣也要借助于matlab的數字濾波器設計,好在matlab集成了一個fdatool可以方便地給出我們需要的濾波器參數。
一般工程上實現濾波器不是我們學過的窗函數等方法,用的最多的是等紋波法,這些都可以直接借助fdatool,十分方便。
利用matlab得到的濾波器系數,設置好對應的采樣頻率、輸出位數就成功地實現了FIR濾波器的調用:
最后得到的兩路波形,由于2FSK的特性,判決門限就設置為0,兩路信號比較就可以得到輸出的二進制波形。
不過這里還有最后一個問題:實際應用往往需要得到二進制比特流,這就需要一個定時脈沖去抽樣輸出最終的二進制比特流信息。
我們組參考了《數字調制解調技術的MATLAB與FPGA實現AlteraVerilog版》一書,利用我們判決輸出的二進制波形,實現了一個簡單的“位同步定時”,能夠比較好地抽樣輸出,完成2FSK的解調,最終效果如下:
第一行是模擬的基帶信號,第三行是DA輸出的調制波形,第二行是AD采樣進來的信號(模擬接收端),第四、第五行分別是通過對應帶通濾波器的信號,第六、第七行是上面兩行提取包絡(全波整流、低通)波形,第八行是六、七行相減,判決前的波形;以0為門限判決得到第九行的二進制波形,但這并不是數據流。
調用位定時模塊,利用第九行的二進制波形得到了位定時脈沖(第十行),可以發現它的相位并不是固定的,在超前和滯后之間來回跳變,不過下降沿是比較穩定的,取下降沿抽樣輸出得到了最終的解調信號(最下面一行)!
做完這些后,整體流程就比較熟悉了,我們又做了一個簡單的4進制FSK,原理基本相同,不再贅述,直接上signal tap波形:
唯一不同點就是用了四種頻率的載波:第一行基帶數據(四進制),第二行DA輸出調制波形,第三行AD采樣波形(可以明顯發現頻率越大衰減越大),下面的還是帶通、提取包絡的波形,原理完全一樣。
最后解調出來的4進制信號與原始基帶信號比較:
比較好地恢復了基帶數據,完成了多進制調制解調。
三、項目總結
這次項目算是大學以來最大的挑戰之一了。最開始目標不明、軟件不會,一點點自學軟件以及verilog語言,之后能熟練地使用軟件完全都是時間堆起來的,quartus、modelsim、matlab等軟件聯合使用,最終完成了這次的項目。
做這次項目還理解到了FPGA開發的流程和它“模塊化”設計的理念,可以進行很好的分工、分模塊設計,最后在頂層文件里調用小模塊搭建起整個系統,這是不同于以往項目的。
在使用ADDA子卡之前我們全是使用的modelsim來進行仿真驗證,而使用ADDA模塊后由于仿真無法實現,我們換成了signal tap直接在板子上驗證結果,也使得我們對這個“內嵌示波器”有了充足的了解。
項目中也體會到一點:書本上通俗易懂的原理在實際工程中往往不是那么好實現的。我們使用的是非相干解調,也有“不會載波同步”的原因在里面,書中直接給出的同步載波卻是整個項目的最大難題,比較遺憾的是這個沒有實現,只參考書后完成了“位同步定時脈沖模塊”。
最后做的4進制調制解調也讓我們更深刻地理解了通信系統的“取舍難題”,我們做的MFSK,傳輸效率確實高了不少,但其耗費的資源(濾波器、尤其是帶寬資源)增加的不是一點半點。尤其是高速通信的當今,帶寬資源更是稀缺,也難怪MFSK實際中基本沒有應用,而基于PSK發展起來的QDPSK、QAM等技術得到了廣泛的應用,確實有著其優勢所在。
四、小組分工
?
參考文獻:
?
[1] ?? 杜勇. 《數字調制解調技術的MATLAB與FPGA實現AlteraVerilog版》. 電子工業出版社,2015.3
[2] ?? 李穎潔等. 《現代通信原理——信息傳輸的基本原理》.清華大學出版社,2007.5
評論
查看更多