<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > 擴頻通信中偽隨機序列編解碼器的FPGA實現(xiàn)

          擴頻通信中偽隨機序列編解碼器的FPGA實現(xiàn)

          作者: 時間:2008-12-30 來源:網(wǎng)絡(luò) 收藏

          1 技術(shù)及理論基礎(chǔ)
          技術(shù)一般是將待傳送的信息數(shù)據(jù)被偽隨機編碼(擴頻序列:Spread Sequence)調(diào)制,實現(xiàn)頻譜擴展后再傳輸;接收端則采用相同的編碼進行解調(diào)及相關(guān)處理,恢復原始信息數(shù)據(jù)。
          一種典型的擴頻系統(tǒng)的物理模型如圖1所示。

          本文引用地址:http://www.ex-cimer.com/article/192174.htm


          2 擴頻系統(tǒng)的
          在擴展頻譜通信系統(tǒng)中,起著很重要的作用。在直擴系統(tǒng)中,用將傳輸信息展寬,在接收時又用它將信號壓縮,并使干擾信號功率擴散,提高了系統(tǒng)的抗干擾能力;在跳頻系統(tǒng)中,用偽隨機序列控制脈沖發(fā)送的時間和持續(xù)時間。由此可見,偽隨機序列性能的好壞是一個至關(guān)重要的問題。
          m序列是最常用的一種偽隨機序列。它是最長線性反饋移位寄存器序列的簡稱。是由帶線性反饋的移位寄存器產(chǎn)生的序列,并且具有最長的周期。
          帶線性反饋邏輯的移位寄存器設(shè)定各級寄存器的初始狀態(tài)后,在時鐘觸發(fā)下,每次移位后各級寄存器狀態(tài)會發(fā)生變化。觀察其中一級寄存器(通常位末級)的輸出,隨著移位時鐘節(jié)拍的推移會產(chǎn)生移位寄存器序列。它是一個周期序列,其周期不但與移位寄存器的級數(shù)有關(guān),而且與線性反饋邏輯有關(guān)。此外,周期還與移位寄存器的初始狀態(tài)有關(guān)。
          一般情況下,n極線性反饋移位寄存器的構(gòu)造如圖2所示。


          圖中,ci(i=0,1,???,n)表示反饋線的連接狀態(tài),ci=1表示連接線通,第n-i級輸出加入反饋中;ci=0表示連接線斷開,第n-i級輸出為參加反饋。因此,一般形式的線性反饋邏輯表達式為:

          將等式左邊的an移至右邊,并將an=C0an(C0=1)代入上式,則上式可以改寫為:

          并稱之為線性反饋移位寄存器的特征多項式。特征多項式與輸出序列的周期有密切的關(guān)系,一個產(chǎn)生最長線性反饋移位寄存器序列(即m序列)的n級移位寄存器,其特征多項式必須是n次的本原多項式。
          3 設(shè)計模塊圖
          設(shè)計選擇用(12,8)線性分組碼、5級M序列從2倍噪聲中恢復原始信號, 整個系統(tǒng)的構(gòu)架如圖3所示。

          整個系統(tǒng)分為6大模塊,分別實現(xiàn)不同的功能。其中包括兩個行為模塊:信號產(chǎn)生即頂層測試模塊(Signal)、模擬信道加噪模塊(add_noise);4個可綜合模塊:漢明碼編碼和解碼模塊(ham_code、ham_decode)、m序列編碼和解碼模塊(m_code、m_decode)。
          首先要解決幀同步的問題,即如何在對真正信號進行m序列解碼之前判斷已經(jīng)達到完全的同步。在發(fā)送實際信號之前,發(fā)送一個8位的同步頭數(shù)據(jù)1111110,在接收端開始時每進入一個信號就進行一次乘法加法運算,選取一個比較大的閾值,只有在開始接收到一個超過閾值的信號之后才認定達到了完全的同步;在此之后進行同步解碼,等收到第一個0信號之后,進入數(shù)據(jù)接收狀態(tài),這樣就解決了如何同步的問題。在進入數(shù)據(jù)接收狀態(tài)后,每收到480個(實際發(fā)送400個,經(jīng)漢明碼編碼后變?yōu)?80個)信號就進行下一次尋找同步的狀態(tài),也就是重新發(fā)送一個8位的同步頭信號,重復上面的過程,再次達到同步,繼續(xù)接收下480個信號。這樣即使產(chǎn)生頻率錯位也只會在480個信號的后幾個信號產(chǎn)生錯誤,不會保持很多的錯碼,是個很好的方案。
          3.1 時鐘信號
          此處把M序列時鐘信號連接到管腳上,clk_1及其31倍頻clk_31,其中clk_31時鐘頻率為20MHz(如圖4所示)。為驗證此時鐘信號,選用RIGOL DS1102CD數(shù)字存儲示波器。DS1102CD數(shù)字存儲示波器是可選裝16通道邏輯分析儀的混合信號示波器,可以將16路數(shù)字信號和2路模擬信號同時顯示到屏幕上,它具備400 MSa/s實時采樣率、25 GSa/s等效采樣率和1M的存儲深度,且體積小巧、觸發(fā)靈敏度可調(diào),很適合日常實驗使用。


          3.2 ham_code,ham_decode模塊
          漢明碼編解碼模塊的內(nèi)部框圖如圖5所示,其中s_p,p_s分別為串行轉(zhuǎn)并行和并行轉(zhuǎn)串行模塊。由于漢明碼的編解碼過程是對并行數(shù)據(jù)進行處理,所以需要將輸入的串行數(shù)據(jù)流進行轉(zhuǎn)換,編解碼完畢以后再轉(zhuǎn)換為串行。


          兩個模塊聯(lián)合仿真結(jié)果如圖6所示,p_out_link信號為并行輸出控制信號,error為錯誤指示位。先把串行數(shù)據(jù)流依次讀入8位移位寄存器,每讀入8個數(shù)據(jù),產(chǎn)生一個p_out_link脈沖,將移位寄存器中的數(shù)據(jù)并行輸出;經(jīng)過漢明碼編碼后變?yōu)?2位并行數(shù)據(jù);在p_s模塊,把12位并行數(shù)據(jù)讀入寄存器,再依次移位輸出,即完成了編碼的過程。解碼過程與其類似。從圖中可以看到,經(jīng)編碼后8位數(shù)據(jù)(如11011010)變?yōu)?2位(1101101011100),之后又可解碼出原數(shù)據(jù),說明這兩個模塊的設(shè)計達到了預(yù)期效果。


          3.3 m_code模塊
          當本模塊中的數(shù)據(jù)采樣時鐘信號clk_1的上升沿來臨的時候,對同步頭信號或者要發(fā)送的隨機數(shù)據(jù)信號進行采樣,并將采樣值存在輸入數(shù)據(jù)寄存器indata_buf中。由clk_31控制產(chǎn)生m序列的移位寄存器進行循環(huán),產(chǎn)生相應(yīng)的m序列串(包含0、1信號),完成編碼的過程。在本模塊中還同時進行了發(fā)送信號的調(diào)制過程,也就是在產(chǎn)生m序列串的同時對其完成相應(yīng)的調(diào)制:將信號1調(diào)制為2位的01(帶符號位的+1)信號;將信號0調(diào)制為2位的11(帶符號位的-1)信號。
          圖7中最下邊的信號shift_buf就是產(chǎn)生m序列的5級移位寄存器,通過查表知道產(chǎn)生5級m序列的本原多項式為x5+x2+1,推出其線性反饋邏輯表達式為a5=于是將一個+1數(shù)據(jù)信號編碼并調(diào)制為相應(yīng)的+M序列串:1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 -1;相應(yīng)的0信號對應(yīng)于一個-m序列串。每進來一個clk_31上升沿就根據(jù)indata_buf中存的待發(fā)數(shù)據(jù)和移位寄存器的相應(yīng)關(guān)系發(fā)送一位信號,將待發(fā)送的信號轉(zhuǎn)化為與之對應(yīng)的±m(xù)序列串。


          3.4 addnoise模塊
          此模塊是一行為模塊,模擬的是實際傳輸過程。這個模塊相對比較簡單:將前一個coder模塊產(chǎn)生的m序列串(unnoised_data)讀入之后加入帶符號的2倍噪聲(noise=random % 3產(chǎn)生最大值為2的隨機數(shù)),這樣所得到的就是加入噪聲的接收端信號(noised_data)。
          圖8中可以看到, noised_data=unnoised_data+noise。也就是說在clk_31的上升沿到來的時候,將收到的M序列串與隨機噪聲相加,得到加噪聲的信號,在接收端進行相應(yīng)的解調(diào),恢復原有信號。


          3.5 decoder模塊
          當接收到同步頭結(jié)束信號0之后,就進入了同步解調(diào)主體部分。在coder模塊中曾經(jīng)說過,為了解決編碼和解碼時鐘不完全一樣的問題,在每發(fā)送480個數(shù)據(jù)之后重新進行一次同步查找過程。這由其中的一個計數(shù)器main_counter來控制,當查找到同步頭結(jié)束0信號之后,開始對main_counter進行計數(shù)加1。當main_counter計數(shù)到480后,進行同步頭再次檢測,再次達到同步之后重復上面的步驟。所以每次解碼只能得到480個數(shù)據(jù),要進行多次的過程才可以將一個完整的信息完全發(fā)送到接收端。
          在這里需要對程序中的一些細節(jié)與對應(yīng)的圖像進行比較詳細的說明。
          首先,在同步頭的判斷時選取的閾值是28。在尋找同步的過程中,如果接收到的31個信號和本地的31位M序列沒有完全同步,則由于M序列的性質(zhì)使得累加的結(jié)果比較小,一般小于10,即使在噪聲的干擾下也不會超出20的水平;但是如果兩者完全同步,累加的結(jié)果應(yīng)當在30左右。所以在這里所選取的閾值為28。
          第二,在本模塊中,不論是尋找同步頭還是同步解碼,對解碼用到的累加器所賦的初始值都為50。也就是說,在上面介紹的判斷同步頭的過程中,在對每一個輸入數(shù)據(jù)都進行累加之后,實際選取的閾值是50+28=78。這樣做的目的很簡單,為了方便計算和相應(yīng)的判斷。因為輸入的信號可能是正的也可能是負的,所以所做的運算也可能是加法或減法。如果把基準值都賦為0,那么在電路實現(xiàn)的過程中,舉個很簡單的例子:9位的累加結(jié)果寄存器如果為0(二進制表示為2’b000000000),加上輸入信號-2(即帶符號的3’b110),本應(yīng)當產(chǎn)生-2的結(jié)果,但是在實際硬件實現(xiàn)的時候卻不能得到所要的答案。它的運算方法為:
            

          可以從上面的運算結(jié)果中清楚地看出,直接在0的基礎(chǔ)上進行加減運算會出現(xiàn)預(yù)料之外的結(jié)果。這種方法只有通過相應(yīng)的擴位運算才可以達到所要的結(jié)果。也就是說對于輸入的3位信號(indata),必須將其擴充成為相應(yīng)的9位值才可以跟sum進行加減運算。還是以上面數(shù)據(jù)為例,在indata(2’b110)數(shù)據(jù)一進來就將其擴展成為帶符號位9位的數(shù)據(jù)(9’b111111110),兩者都是表示帶符號位的數(shù)據(jù)-2,但是后者和sum進行加減時就不會出現(xiàn)上面的問題。

          但是這樣對于這種方法來說,遠不如直接將累加器sum的初始值設(shè)定為50方便,這樣一來就只在正數(shù)的范圍內(nèi)進行考慮。同樣的到達同步解碼狀態(tài)后,實際也不是將0定為判斷基準,而是50。通過如圖9所示的圖像可以看出來。


          上面的圖形是在找到同步頭之后進行同步解碼的開始情況。最上面兩個信號是輸入信號indata和將輸入信號經(jīng)過絕對值運算得到的結(jié)果psumi,將帶符號的3位信號轉(zhuǎn)化為不帶符號的2位數(shù)據(jù),再根據(jù)與第j位+M序列符號位與輸入數(shù)據(jù)符號位的比較,選取相應(yīng)的加法或者減法運算。
            從上圖中還可以看出,累加器sum的開始的基準值為50。每進入一個數(shù)據(jù)就在50的基準上進行加減法運算。最后當計數(shù)器j從0累加到31之后,就做一次相應(yīng)的判決輸出:如果sum值大于50就輸出信號為1,如果小于50就輸出為0,見圖10。


          圖中在計數(shù)器j達到30的時候,對應(yīng)的sum值為12(小于50),于是outdata進行判斷輸出,輸出信號為0(低電平)。這樣就完成了計數(shù)累加判斷的過程。
          4 系統(tǒng)性能
          在加入差錯控制編碼后,傳輸20 000個字節(jié)未發(fā)現(xiàn)誤碼。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();