開發(fā)筆記
2015.7.13 - 2015.7.17
簡述
本周是我真正開始接觸verilog開發(fā)的一周,
本周我主要是完成了一個(gè)小型的計(jì)數(shù)平均器的開發(fā)。
- 首先,我把設(shè)計(jì)轉(zhuǎn)化為verilog設(shè)計(jì)語言
- 然后,使用modelsim對每個(gè)模塊進(jìn)行了功能性仿真,已驗(yàn)證邏輯設(shè)計(jì)的正確性。
- 隨后,使用了signaltap ii對項(xiàng)目進(jìn)行片上仿真
- 最終,項(xiàng)目通過了多次普通頻率信號(hào)的仿真之后,確定運(yùn)行正常且實(shí)現(xiàn)了最初的設(shè)計(jì)目的
細(xì)節(jié)
設(shè)計(jì)目的和預(yù)期
時(shí)鐘
晶振時(shí)鐘使用的是50 Mhz,而經(jīng)過PLL之后倍頻為系統(tǒng)時(shí)鐘 100Mhz
功能
先采集每10ms輸入脈沖的數(shù)量,再對10個(gè)采樣值取平均數(shù)
設(shè)計(jì)圖和verilog代碼的實(shí)現(xiàn)
設(shè)計(jì)上分為三個(gè)模塊
- PLL模塊:用于產(chǎn)生系統(tǒng)時(shí)鐘和測試信號(hào),直接使用IP核產(chǎn)生。c0為2倍頻,用于系統(tǒng)時(shí)鐘;c1為四倍頻,用于測試對照時(shí)鐘;c2為四分頻,用于模擬采樣信號(hào)
- echantion模塊:用于采樣,由verilog編寫
- calcul模塊:用于處理數(shù)據(jù)輸出平均值,由verilog編寫
remarque
verilog代碼的編寫有很大自由,但是綜合軟件特別笨,往往無法綜合代碼。
以下是寫出可綜合代碼需要注意的點(diǎn):
- 盡可能簡化結(jié)構(gòu),模塊化編程。
- 如有可能,在一個(gè)結(jié)構(gòu)內(nèi)只對一個(gè)變量做調(diào)整
- 一個(gè)變量只能在一個(gè)always行為語句中被賦值
- assign 只能給wire賦值
- 輸入輸出接口的數(shù)據(jù)長度要一致
- 預(yù)先判斷好數(shù)據(jù)長度,防止數(shù)據(jù)過大而溢出
- 使用reset而不是initial
- 使用==和!= 而不是 ===和!==
modelsim的仿真
modelsim是一款強(qiáng)大的仿真軟件,此次用于功能性仿真。需要注意的是modelsim可以理解所有verilog語言,所以testbench的自由度比較高,但是仿真結(jié)束后未必意味著可以綜合。
推薦在仿真之后使用tool> Netlist Viewer > technology Map Viewer和RTL Viewer來確認(rèn)。 technology Map Viewer 可以看出代碼是否真的可以被綜合,而RTL Viewer可以看到是否邏輯正確
引腳分配
使用tcl腳本分配引腳,語句模板是
set_location_assignment PIN_30 -to i_clk
signalTap ii的仿真
這是本項(xiàng)目的關(guān)鍵,通過逐個(gè)模塊信號(hào)的仿真,可以最終得到符合要求的最終項(xiàng)目版本。
另外,生成的.sof文件位于output_file文件夾里
remarque
時(shí)鐘的設(shè)置是關(guān)鍵,推薦使用最高頻率的時(shí)鐘或者系統(tǒng)時(shí)鐘。
此處我們使用的是PLL產(chǎn)生的四倍頻時(shí)鐘
實(shí)驗(yàn)中使用的采樣和仿真結(jié)果
50Mhz ->每次取樣10ms脈沖數(shù)為500 0x1F4

25Mhz ->每次取樣10ms脈沖數(shù)為250 0xFA

12.5Mhz ->每次取樣10ms脈沖數(shù)為125 0x7D

總結(jié)
通過這個(gè)項(xiàng)目,我初次接觸了完整的開發(fā)流程,并且試驗(yàn)了modelsim的使用,為之后項(xiàng)目開發(fā)做了準(zhǔn)備。