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