最近一直在學stm32,怕時間久了FPGA 生疏,就重新做了下八選一的波形發生器,用lpm_rom做,做完之后再用quartus進行功能仿真和時序仿真,主要是把實驗流程記錄下來。以免過陣子又忘了。
一、設計輸入
Step1 打開Quartus軟件,新建工程:File -> New Projiect Wizard,設置工程文件夾存放位置以及工程名
一路Next,到Page3 of 5選器件,我的是Cyclone II EP2C8Q208C8,然后又是Next直到Finish。
Step2 新建文件*.bdf文件,采用原理圖輸入:File -> New -> Design -> Block Diagram/Schematic File,OK!新建一個*.bdf文件。
Step3 新建mif文件,這個文件用來裝lpm_rom初值:File -> New -> Memory Files -> Memory Initialization File,OK。
字數為256,字的位數為8,一會兒建lpm_rom再細講。點OK。用MATLAB生成sin波形的初始值,裝入mif文件。總共有256個值,裝好之后如下
在wave_sel_8_1工程文件夾下新建一個mif文件夾,用來裝初始化文件。把新建的mif文件保存到mif文件夾下,名字為sin.mif。這個文件用來裝sin波形的初始值。
Step4 對新建的*.bdf文件進行編輯。雙擊空白部分,出現Symbol窗口,在Libraries一欄選擇d:/altera/90/quartus/libraries... -> megafunctions -> storage -> lpm_rom。點OK,出現下圖
進行lpm_rom配置:output file 選擇VHDL或Verilog HDL,這個是沒什么影響的。lpm_rom_sin是修改后的名字。
Next
Output 位寬為8位,memory為256個字。由於位寬是8位,所以每個字也是8位,256個字即memory的深度,需要8位地址線可尋址,2^8 = 256。所以地址線寬度為8,說明可尋址深度是2^8 = 256。輸出寬度為8,說明每個存儲單元是8位。
一路Next直到這里
這是新建的memory初始化,點Browse,在mif文件夾下,找到sin.mif文件。路徑如下:
一直Next到最后一步
這幾個文件暫時還搞不清楚,都選上吧。暗色的是不能更改的。
Finish之后出現
選Yes,在bdf文件上單擊鼠標,剛才新建的lpm_rom_sin就放到工程里了。
Step5 到此為止,一個完整的lpm_rom_sin做好了,現在最重要的是要保存成果。把這個bdf文件保存在wave_sel_8_1文件夾下,名字為wave_sel_8_1.bdf。重復step3 和step4,依次把lpm_rom_triangular、lpm_rom_square、lpm_rom_sawtooth1、lpm_rom_sawtooth0、lpm_rom_ladder、lpm_rom_stair1、lpm_rom_stair0剩下的7個lpm_rom做好。這8個波形依次是正弦波、三角波、方波、鋸齒波1(向上)、鋸齒波0(向下)、梯形波、階梯波1(向上)、階梯波0(向下)。就是麻煩,小心仔細一點就OK了。
好了,8個波形ROM產生了,還差一個計數模塊和一個選擇模塊。最麻煩的部分已經做完了,Ctrl + S一下,然后休息一下。
Step6 新建計數模塊,File -> New -> Design -> VHDL Files
保存為count.vhd,放在wave_sel_8_1下。
右鍵count.vhd -> Create Symbol Files for Current File。
回到bdf文件下,雙擊空白部分
選擇Project -> COUNT,點擊OK。放入工程中。Crtl + s。養成保存的好習慣。
Step7 新建選擇模塊,File -> New -> Design -> VHDL Files
保存為SEL8_1.vhd。剩下步驟同step6。
Step8 所有的模塊都已經做好了,就剩下輸入、輸出管腳了。還是雙擊bdf文件的空白部分
直接在Name中輸入input,點OK。Output也一樣,總共需要3個輸入,一個輸出。3個輸入分別是CLK、CLRn、in_sel[2..0](這個是總線,3跟,器選擇作用)。一個輸出是output[7..0]。選中的波形就通過這個output輸出。
Step9 連線,最后結果是
有事沒事就按Ctrl + S。現在看一下整個工程的目錄結構
然后就得仿真了,仿真的目的是在軟件環境下驗證電路的行為和設想中的是否一致。功能仿真是在設計輸入之后,是沒綜合、布局布線之前的仿真,又叫行為仿真或前仿真,不考慮電路的邏輯和門的時間延時,着重考慮電路在理想環境下的行為和設計構想的一致性。時序仿真又稱后仿真,是在綜合、布局布線時候,即電路以及映射到特定的工藝環境后,考慮期間延時的情況下對布局布線的網標文件的一種仿真,器件延時信息是通過反標時序延時信息來實現的。
二、功能仿真
我用的是Quartus II 9.0,以前裝過Quartus II 11.0,根本就沒有波形文件這一說,當然就仿不了真了,所以又換回來了。
Step1 新建一個波形文件:File -> New -> Verification/Debugging Files -> Vector Waveform File。
Step2 添加節點,雙擊紅色區域,出現下圖
點擊Node Finder
一路OK返回
保存為
Step3 設置仿真截止時間:Edit -> End time。截止時間為1ms。
Step4 設置時鍾周期為20ns,如下
Step5 設置復位信號CLKn
Step6 設置選擇信號in_sel
設置選擇信號設置為10.24us(1024ns)加1,時鍾周期為20ns,即每512個周期選擇信號加1,而每個波形的取樣值為256個,所以最終結果是每個波形出現兩次然后接着出現下一個波形。
Step7 設置仿真模式Assignments -> Settings -> Simulator Settings
Step8 生成功能仿真網表。
Step9 到現在為止都沒有編譯過整個工程,功能仿真只是驗證它的行為是不是符合設計要求,不需要編譯,查看Task欄
點擊開始功能仿真。漫長的等待,這個時候總是相當緊張的。
OK,看波形之前進行簡單的設置
出現
OK
Y
OK
8個波形依次出現,每個波形兩個周期。如果把in_sel信號的時間設為512ns,則每個波形出現一次,如下
出現的順序很有意思,可以想一下為什么是這樣。最先建波形的卻最后出現。
三、時序仿真
時序仿真之前得綜合、布局布線。
Step1 綜合,右鍵 -> start
Step2 布局布線,,同上
完了之后任務欄狀態為
Step3 設置仿真模式Assignments -> Settings -> Simulator Settings
Step4 點擊仿真,經過一些簡單的設置后出現波形
整個過程沒有管腳分配及時序約束,這應該是在設計輸入中完成的。編程與配置也沒做。