室內(nèi)設(shè)計網(wǎng)站大全網(wǎng)seo新手教程
(原創(chuàng)聲明:該文是作者的原創(chuàng),面向?qū)ο笫?/em>FPGA入門者,后續(xù)會有進(jìn)階的高級教程。宗旨是讓每個想做FPGA的人輕松入門,作者不光讓大家知其然,還要讓大家知其所以然!每個工程作者都搭建了全自動化的仿真環(huán)境,只需要雙擊top_tb.bat文件就可以完成整個的仿真(前提是安裝了modelsim),降低了初學(xué)者的門檻。如需整個工程請留言(WX:Blue23Light),不收任何費用,但是僅供參考,不建議大家獲得資料后從事一些商業(yè)活動!)
前面的仿真一直說到仿真的數(shù)據(jù)用到的是隨機數(shù),verilog仿真的時候有提供產(chǎn)生隨機數(shù)的命令random,很多讀者可能會問,既然FPGA這么強大,用FPGA不能產(chǎn)生隨機數(shù)嗎?這個當(dāng)然是可以的,用FPGA產(chǎn)生真正的隨機數(shù)可能會相對麻煩一些,但是產(chǎn)生偽隨機數(shù)還是非常簡單的。
FPGA產(chǎn)生偽隨機序列可以用線性反饋移位寄存器來實現(xiàn),線性反饋移位寄存器(linear feedback shift register, LFSR)是指給定前一狀態(tài)的輸出,將該輸出的線性函數(shù)再用作輸入的移位寄存器。異或運算是最常見的單比特線性函數(shù):對寄存器的某些位進(jìn)行異或操作后作為輸入,再對寄存器中的各比特進(jìn)行整體移位。
寄存器的初始值叫做“種子”,因為線性反饋移位寄存器的運算是確定性的,所以,由寄存器所生成的數(shù)據(jù)流完全決定于寄存器當(dāng)時或者之前的狀態(tài)。而且,由于寄存器的狀態(tài)是有限的,它最終肯定會是一個重復(fù)的循環(huán)。然而,通過本原多項式, 線性反饋移位寄存器可以生成看起來是隨機的且循環(huán)周期非常長的序列。移位寄存器結(jié)構(gòu)簡單,運行速度快,實用的密鑰流產(chǎn)生器大多基于移位寄存器,移位寄存器理論也成了現(xiàn)代流密碼體制的基礎(chǔ)。
線性反饋移位寄存器的應(yīng)用包括生成偽隨機數(shù),偽隨機噪聲序列,快速數(shù)字計數(shù)器,還有擾頻器。線性反饋移位寄存器在硬件和軟件方面的應(yīng)用都非常得普遍。循環(huán)冗余校驗中用于快速校驗傳輸錯誤的數(shù)學(xué)原理,就與線性反饋移位寄存器密切相關(guān)。
上面說到了本原多項式,可以理解成我們常說額特征多項式,如下所示,gm為多項式的系數(shù),對于二進(jìn)制,多項式系數(shù)只能為1或0。
LFSR結(jié)構(gòu)如下圖所示,每一位的值等于前一位的移位值與最后一位反饋值取異或,即Q(k)=Q(k-1)^(gk*Q(n))。
由LFSR的結(jié)構(gòu)圖可以看出LFSR的FPGA實現(xiàn)非常簡單,我們來實現(xiàn)X^7+X^6+X^5+X^4+1這個本原多項式。整個代碼如下所示,非常的簡單。
在仿真里面設(shè)置初始值是7,雙擊sim目錄下的top_tb.bat,modelsim的仿真結(jié)果如下所示,rand_out取無符號的整數(shù),基本上是符合隨機數(shù)分布的。
如果想讓數(shù)據(jù)的隨機性更強一些,可以不定時的改變移位寄存器的初始值,如下所示,定義了一個寄存器cnt用于減法計數(shù),每計數(shù)到0就取當(dāng)前的rand_out重新組合后進(jìn)行計數(shù),進(jìn)一步增加了cnt隨機性。
modelsim的仿真如下所示。
讀者也可以自己設(shè)計,多加入一些隨機的因素,讓數(shù)據(jù)更加的隨機,同時也可以試試不同的本原多項式,或者取不同長度的移位寄存器,看看生成隨機數(shù)的效果。