發表文章

Nios II - Platform Designer 建立 Custom Component

圖片
建立好一個 Nios II System 之後 我們就可以利用 Nios II Software Build Tool 在上面開發 C Program 了 不過建立 Custom Component 的好處就是可以讓某些運算改由硬體來做 藉此提升效能 基本上參考手冊都把流程講完了 ( Nios II Custom Instruction User Guide ) 所以這裡只整理一些重點 跟自己在實作過程中碰到的問題 然後手冊雖然很長 但真的要有耐心一步一步照著做! 尤其是在 Platform Designer 建立 Custom Component 的地方 ================================================= Hardware 部分 下表列出了幾種 Custom Instruction Combinational => 該 Custom Component 為組合 (Combinational) 電路 Multicycle => 該 Custom Component 為時序 (Sequential) 電路 其中根據運算的 Cycle Count 是否固定,又可分為 fixed 或 variable fixed 表示從 start 送出後,固定某個 Cycle 數後就算好結果並回傳 (因此 done 訊號為非必要) variable 表示從 start 送出後,當 done 回傳為 1 時即可算好結果並回傳 (因此 done 訊號為必要) Extended => 讓該 Custom Component 可以做多個 Operation 用 n 來決定對該 Custom Component 下什麼指令 ================================================= Software 部分 建立好硬體部分後 就可以開啟 Software Build Tool 首先在手冊裡頭有提到自訂指令的函式宣告 例如這是回傳型態為 float 的函式 不過我們不需要這麼辛苦去 call 這些 function 因為在 <system.h> 裡頭都幫我們定義好了 接下來要在 code 中加入 #include <system.h> 然後先按 Build Project...

Nios II 使用 Host File System 的問題和注意事項

圖片
環境設置 OS: Windows 10 Software: Intel Quartus Prime Lite 18.0 Platform: Cyclone V GT 5CGTFD9E5F35C7 ==================================================== Host File System: 將要讀寫的資料放在 PC 上,然後就可以跟 PC 端做 File Operation ==================================================== 先前文章建立了一個完整的 Nios II System Quartus Qsys + Nios II 入門使用 但在嘗試使用 Host File System 的時候一直試不出來! 看了各種教學文章影片也都解決不了問題 後來才發現原來是因為之前 Nios II System 選擇的 Core 是 Nios II (Classic) e 雖然在 Host File System 的 Sample Code 裡頭說明是支援該 Core 的 但我自己實驗結果是沒辦法使用的 改成 Nios II f 之後就好了! 然後在新建 Project 後 也要記得 BSP Editor 裡的 Software Package  altera_hostfs 要打勾! 以及要注意 enable_small_c_library 不能打勾 ==================================================== Reference: (原創) 如何在Nios II EDS 8.0使用Host File System與Zip File System? (SOC) (Nios II)

Quartus Qsys + Nios II + SDRAM 進階使用

圖片
環境設置 OS: Windows 10 Software: Intel Quartus Prime Lite 18.0 Platform: Cyclone V GT 5CGTFD9E5F35C7 基本上跟  Quartus Qsys + Nios II 入門使用  的步驟一樣 只有 Platform Designer 部分需要更改 ============================================== 新增 DDR3 SDRAM Controller with UniPhy IP ============================================== PHY Setting 頁面設定 Speed Grade: 7 (配合板子) Memory clock frequency: 400 MHz PLL reference clock frequency: 100 MHz Memory Preset: MT41J64M16LA-15E ============================================== Memory Parameter 頁面設定 Total Interface Width: 8 Memory Initialization Option > Memory CAS latency setting: 8 Output drive strength setting: RZQ/4 ODT Rtt nominal value: RZQ/4 Memory Write CAS latency setting: 6 Dynamic ODT(RTT/WR) value: RZQ/4 ============================================== Memory Timing 和 Board Setting 保持不動  ============================================== Controller Setting 頁面設定 打勾 Generate power-of-2 data bus widths for Qsys or SOPC Builder Maximum Avalon-MM burst lenght: ...

Quartus Qsys + Nios II 入門使用

環境設置 OS: Windows 10 Software: Intel Quartus Prime Lite 18.0 Platform: Cyclone V GT 5CGTFD9E5F35C7 ================================================= Nios II 簡介 Nios II 為 Altera 所設計的 32-bit RISC soft-core CPU 其完全在 Altera 的 FPGA 板子上實現 版本有分為 f/s/e e是最便宜最簡單的 也是下面的實驗我們會選擇的版本 ================================================= Platform Designer 簡介 簡單來說 他就是可以用 Intel 的 IP 定義你的系統的工具 IP 之間的連接 或是對應到的位址之類的 所以如果要設計一個只有由 Intel IP 所組成的系統 這是非常方便的工具 ================================================= 以下實驗基本上都是參照 helloworld:基於Qsys的第一個Nios II系統設計 來去完成 所以有些詳細的步驟不在贅述 請直接參考網站裡面寫的 下面只會大概提到該做什麼事情 以及遇到的問題和解決方式 ================================================= 實驗 - Platform Designer 這裡主要是要建立 硬體 系統 步驟 1. 在 Quartus 建立新的專案 2. 建立 bdf 檔案 3. 點  Tool > Platform Designer,進到  Platform Designer 頁面 在這裡主要要新增 4 個元件 Nios II (classic) Processor On-Chip Memory (RAM or ROM) Intel FPGA IP JTAG UART Intel FPGA IP System ID Peripheral Intel FPGA IP 然後將該連的線連起來 每個元件的 clk 都要接到時鐘的 clk_out 每個元件的 reset 都要接到時鐘的 reset Nios II (clas...

Intel DDR3 SDRAM Controller with UniPHY - Micron Memory Model 使用

圖片
實驗環境 軟體: ModelSim - Intel FPGA Starter Edition 10.5b (Quartus Prime 18.0) Micron 的 MT41K512M16HA-125:A ---------------------------------------------------------------------- Memory Model 使用 本文所使用 Memory Model 的為  Micron 的 MT41K512M16HA-125:A 點連結進入官網 從官網下載 Verilog Model 後 就會得到整包的 Memory Model 連 testbench 也幫你寫好了 readme.txt 裡頭也大概有描述該怎麼使用這包程式 不過自己在使用上還是有遇到一些問題 所以記錄下來 下載完並解壓縮後 會得到這包檔案 首先文件裡面提到的 do tb.do 我在 modelsim 的命令列執行後沒辦法使用 所以還是不要偷懶 直接自己寫 .do 檔案 請直接在該目錄底下新增 ddr3.do ddr3.do vlib work vmap work work vlog -work work -sv +define+den4096Mb ddr3.v vlog -work work -sv +define+den4096Mb tb.v vsim -t ps work.tb view wave add wave -binary /tb/rst_n add wave -binary /tb/ck add wave -binary /tb/ck_n add wave -binary /tb/cke add wave -binary /tb/cs_n add wave -binary /tb/ras_n add wave -binary /tb/cas_n add wave -binary /tb/we_n add wave -unsigned /tb/ba add wave -unsigned /tb/a add wave -binary /tb/dm add wave -hexadecimal /tb/dq add wave -hexadecimal /tb/dq0 add wave -hexadecimal /tb...

Formal Verification(正規驗證)介紹和如何使用 SVA(System Verilog Assertion) 做驗證

圖片
(零)前提: 關於 Formal Verification,其實我也還不是很理解,而且資源也不是那麼多,尤其很多都只是觀念性的介紹,甚至寫得很艱澀難懂落落長,但沒實質提到該怎麼做 Formal Verification。 但據說驗證在 IC 設計上又是非常重要的,所以雖然這部分真的不好理解,還是硬著頭皮收集資料寫下這一篇,所以這篇也不會寫到太深,畢竟這整個要講起來是很專業領域的。 因此這篇適用於對 Formal Verification 完全不理解的人,希望可以幫助你入門。 (一)正文: 當我們完成一塊電路時,要怎麼確定功能跟預期的結果是一樣的? 1. 在軟體內跑 Waveform,比對預期結果和實際結果     (1) 有 GUI,淺顯易懂     (2) 新手友善 2. 寫 Testbench,比對預期結果和實際結果     (1) 許多參數要自己設定     (2) 需要下點功夫才能理解 上述方法都是把所有的 Case 會產生的結果用手寫出來,然後再用人眼去比對每個預期結果和實際結果是不是一樣。 但此時問題來了,但如果今天有上千個 Case,還是只能靠我們自己把這上千個 Case 列出來,然後一一用人眼比對嗎? 此時 Formal Verification 的功用就出來了! 簡單來說它就是把你 電路該有的行為列成正規化的公式 然後再用一個 檢查器去確認你的電路的行為總是會跟這個公式所描述的行為 是一樣的 這部分對於一個新手來說可能真的會很 Hardcore 不過會了之後真的會變得很方便! Functional Verification 把所有 Testcase 列出來然後作驗證。 Formal Verification (二)實驗: 安裝: 首先要安裝好這些東西 yosys symbiyosys gtkwave yices sudo apt-get install autoconfig lubgmp3-dev (Ubuntu) sudo yum install autoconfig lubgmp3-dev (CentOS,不過沒實際試過,只是猜測應該是這樣) 以上東西要怎麼裝,Google 就可以查到了 我本身的環境是使用 CentOS7,在安裝過程中也碰到蠻多坑的 (雖然後來還是自...

Verilog - testbench 的撰寫

我們利用 Verilog 完成電路設計後 必須要測試這個電路的所有功能和輸出是否和預期符合 因此我們可以撰寫 testbench 來去測試該電路模組的功能 本篇會假設事前已經完成了一個電路設計  (以下簡稱 DUT,Design Under Test,顧名思義就是待測試的電路設計) 所以主要會著重在 testbench 的撰寫來去測試這個 DUT 假設這是我的 DUT ( lab02.v ) module lab02(clk, A, B, C); input clk, A; output B, C; reg B, C; always@(posedge clk) begin B <= A; C <= B; end endmodule 然後在同個資料夾底下新建檔案 tb.v 步驟大概分為以下 先打上預期的 延遲時間單位 / 波型時間單位 似新建 Verilog 模組的撰寫,但注意 ( ) 內無需加入 parameter 將原本的 input 訊號線宣告為 reg,output 訊號線宣告為 wire 加入 DUT Module,並各自連接上在此模組對應宣告的 reg 和 wire 線 設定你想要的波型 1. 先打上預期的 延遲時間單位 / 波型時間單位      這邊可以自己設計想要的      舉個例子來說           `timescale 1ns / 100ps          (1 ns)  波型時間單位 是什麼意思應該很好懂      就是你在跑模擬波型圖時,間隔一個時間單位會是多久     (100 ps)  延遲時間單位 則是設定波型時      會利用例如 #1 讓某個訊號線在 延遲一個時間單位 後做對應動作      而這個 #1 所代表的時間單位即是你的 延遲時間單位 2. 似新建 Verilog 模組的撰寫,但注意 ( ) 內無需加入 parameter ...