編寫之初,筆者並沒有太大的自信,因為筆者對偽隨機碼並沒有太多的認識。但老師有命,筆者不得不進行編寫,同時筆者也特別希望能有個項目來鍛煉自己。
筆者在開始編寫的時候,首先上網查了很多的資料,對偽隨機碼算是有了一定的了解,但是相關的程序代碼卻沒有找到多少,或許是太簡單,亦或許是涉及到商業,所以網上資源很少,沒辦法筆者又再次閱讀了有關偽隨機碼的資料。偽隨機碼又稱偽隨機序列,它是具有類似於隨機序列基本特性的確定序列。通常廣泛應用二進制序列,因此我們僅限於研究二進制序列。二進制獨立隨機序列在概率論中一般稱為貝努利(Bernoulli)序列,它由兩個元素(符號)0, 1或1, -1組成。序列中不同位置的元素取值相互獨立取0取1的概率相等等於1/2:我們簡稱此種系列為隨機系列。
隨機序列具有以下三個基本特性:
1)在序列中“0”和“1”出現的相對頻率各為1/2。
2)序列中連0或連1稱為游程。連0或連1的個數稱為游程的長度,序列中長度為1的游程數占游程 總數的1/2;長度為2的游程數占游程總數的1/4;長度為3的游程數占游程總數的1/8;長度為n的游程數占游程總數的1/2^n(對於所有有限的 n )此性質我們簡稱為隨機序列的游程特性:
3 如果將給定的隨機序列位移任何個元素 則所得序列的和原序列的對應的
元素有一半相同,一半不同。
如果確定序列近似滿足以上三個特性則稱此確定序列為偽隨機序列。
在明白了偽隨機碼的概念之后,筆者開始從功能上着手,采用由下至上的方式,進行編寫代碼。
因為本次要產生碼元序列為010110010001111的偽隨機碼,所以筆者首先編寫碼元序列為010110010001111,速率為2Khz的偽隨機碼。請注意,碼元序列的方向和速率。在理解其速率時,着實讓筆者頭疼了一番,最終筆者明白了其速率是指一位編碼的速率。
在理解這些東西時,筆者開始構思,不管采用什么方式,筆者只需產生編碼為010110010001111速率為2Khz的序列即可。因此筆者決定采用移位寄存器和分頻的方式來產生,以下為Verilog代碼:
module wsjm(clk,data_15bit_2Khz);
input clk;
output data_15bit_2Khz;
reg [14:0]data_out_15bit_2Khz;
reg [13:0]buffer_15bit_2Khz;
always@(posedge clk)
begin
buffer_15bit_2Khz<=buffer_15bit_2Khz+1'b1;
if(buffer_15bit_2Khz==13'd4090)
begin
buffer_15bit_2Khz<=0;
data_out_15bit_2Khz=data_out_15bit_2Khz>>1;
if(data_out_15bit_2Khz==16'b0000000000000000)
data_out_15bit_2Khz=16'b0101100100011110;
end
end
assign data_15bit_2Khz=data_out_15bit_2Khz[14:0];
endmodule
QQ:997989815