發表文章

[Verilog] `define 和 parameter 的差別與使用時機

在一段程式碼中,容易變動或者可調的數字,可以設為參數,讓程式在未來修改規格變得靈活。 Verilog 提供 parameter 關鍵字來定義參數。下列的程式碼提供一個例子: parameter counter_end = 99 ; parameter counter_step = 3 ; parameter counter_width = 8 ; reg [counter_width- 1 : 0 ] counter; wire [counter_width- 1 : 0 ] counter_zero = {(counter_width){ 1'b0 }}; always @( posedge clk or negedge rst_n) begin if (!rst_n) counter <= counter_zero; else if (counter == counter_end) counter <= counter_zero; else counter <= counter + counter_step; end 我們可以看出,counter 的行為,已受 parameter 的約束,因此未來 counter 如果需要更動,可以很快透過 parameter 來調整規格,這是我認為 parameter 比較好的用法。 如果一個電路包含三個子 IP,這三個子 IP 都吃同樣的 parameter,如果這些 IP 都有上述 parameter 的宣告在 code 內,我們就可以在宣告三個 IP 的 instance 時,將共同參數傳遞進去: func #( .counter_end( 99 ), .counter_step( 3 ), .counter_width( 8 ) ) 接下來討論 `define 語法。 `define 也可以用來定義參數,但以我的觀點,我認為 `define 比較像是從頂層往...

[Env] Icarus Verilog(iverilog) + gtkwave 安裝與環境建立

圖片
最近閒暇時間,我要開始使用 Intel 的 FPGA (DE2-115 VEEK-MT)來做一些小遊戲來玩玩。 在這之前我想先測試一些簡單的範例程式,例如顯示一些字在我買的 FPGA 螢幕上。 目前我要做的事為: 先建立一個模擬環境來寫 Verilog 以及 Testbench。 在我們的模擬環境測試一些簡單的小程式。 然後把簡單的小程式燒錄進 FPGA。 本篇文章要記錄的事情,就是如何做到上述第一步驟: 建立一個模擬環境 。 Let's Go! 我的工作環境主要都在 Linux,我使用的作業系統為 Elementary OS。 首先可以安裝一套免費的 Verilog 模擬器 Icarus Verilog: 官方網站在此 安裝方法很簡單,輸入以下指令: sudo apt-get install iverilog 接著我們要有一個可以看數位訊號波形的免費軟體,叫做 gtkwave,安裝一下: sudo apt-get install gtkwave 接著安裝 Verilator,這個軟體也是個免費的 Verilog 模擬器,但是我安裝 Verilator 目的為使用 Verilator 內建的 verilog lint 功能。lint 就是語法檢查,lint 可以讓 Verilog 內一些潛在的危險語法被偵測出來,例如 bit overflow 造成的運算錯誤。 sudo apt-get install verilator 安裝好以上三個免費工具之後,首先要練習將一個程式專案的資料夾結構整理好。 我習慣將一個程式專案用以下的資料夾結構組織起來: ├── build ├── doc └── src ├── bench └── rtl build:編譯程式的地方,以及放編譯出來的執行檔和 log,以及跑 lint 和放波形都在 build 資料夾內操作。 doc:放一些文件筆記。 quartus:放 Quartus 專案的地方。我的 FPGA 買的是 Intel(Altera) 公司的,因此使用的 FPGA 專案建置軟體是 Quartus。 src:放源碼的地方,分成兩個資料夾,一個放 Testbench 類的檔案,另一個放 rtl code 檔案。(即 v...

[Tools] Verilog-mode 用法整理 (usage collections)

上一篇文章 已經說明如何安裝 Verilog-mode 在 Vim 內。 以下主要把常用的 Verilog-mode 自動接線技巧做整理。 1.   最基本的 verilog 自動接線使用方法如下: module a(/*autoarg*/); input a,b; output c; endmodule 也就是在小括號內,輸入 /*autoarg*/ 關鍵字,通過 Verilog-mode 處理後,a, b, c 會自動貼到小括號內的 port 上: module a(/*autoarg*/    // Outputs    c,    // Inputs    a, b    ); input a, b; output c; endmodule 其實這一直是我覺得 Verilog 語法比較多餘的地方,因為已經宣告成 IO 的訊號,再貼一次到小括號內,似乎增加 code 長度,顯得多餘。一般的程式語言,函式的 argument 都只宣告一次而已。 2.   宣告 instance,也能自動接線,使用的關鍵字為 /*autoinst*/: module test; a a_inst(/*autoinst*/); endmodule 自動接線結果: module test; a a_inst(/*autoinst*/ // Outputs .c (c), // Inputs .a (a), .b (b)); endmodule 以上兩個就是最常用的自動接線。 3.   自動宣告 input 和 output: 假如在上述 test.v 內開頭寫: /*autoinput*/ /*autooutput*/ 則 Verilog-mode 處理結果: module test; /*autoinput*/ // Beginning of automatic inputs (from unused autoinst inputs) input a; // To a_inst of a.v input b; ...

[Env] Vim 安裝 Verilog-mode

我玩 FPGA 所撰寫的程式,都以 Linux 環境為主,畢竟我是 Linux 的支持者。在撰寫 Verilog 來玩的時候,最重要的是先建立一個很強的寫 Code 環境。這篇文章介紹如何使用網路上免費的自動接線工具,Verilog-mode。 寫 Verilog 時,自動接好 Port Name 會省很多力氣。 網路上有人已撰寫一個實用的工具,叫做 Verilog-mode。 請參考 這個連結 。 這個工具原本設計給 emacs 使用,但這裡介紹如何將它導入 Vim。 首先去 Verilog-mode 網站下載 verilog-mode.el.gz,解壓縮: gzip -d verilog-mode.el.gz 然後撰寫 python 程式 vmode.py,來呼叫這個 lisp: #!/usr/bin/env python2 import sys import os from subprocess import call def main():   if len(sys.argv) < 2:       print " [Err] vmode: no filename."   else:       fileName = sys.argv[1]       task = ["emacs", "-load", "Path_To/verilog-mode.el", "--batch", fileName, "-f", "verilog-batch-auto"]       call(task) if(__name__ == "__main__"):     main() 所以現在可以用 vmode.py 來對任意檔案做自動接線的動作: chmod +x ./vmode.py vmode.py <verilog 檔名> 現在我們要將 vmode.py 加到 vim 的快捷鍵內: 在 ~/.bashrc 內加入: if [ -f ~/.bash_aliases ]; then     . ~/.bash_aliases fi ...

[簡介] 第一篇,自我期許

圖片
好搭。 這個網站建立了,這是一個敢於創新,敢於實作的開始。 為什麼建立這個網站呢? 因為前幾年,我買了一台 Intel 的 FPGA 來玩:VEEK-MT,一直擺在房間,它被靜靜的放在角落好久,空有一身運算能力,卻沒人理它,我決定再度拿出來玩玩,看能利用 FPGA 來解決什麼問題,或是實作一些好玩的事情。 另外,我碩士買了很多本 FPGA 實作的書,裡面有好多有趣的小實驗,我都還沒有機會玩玩看,因此有空,就花一些體力,將這些小實驗研究一番。 我在這個部落格內的每篇文章,所描述的任何工具,都是網路上可以取得的免費資源,並且我都在 Linux 作業系統上操作這些免費工具,來實作好玩的東西,並了解如何用數學解決問題。同時,我也會參考坊間的參考書(包含我收藏的數學書籍跟各種 FPGA 相關教學書籍),來學習用邏輯設計的觀點,來思考自然哲學。 最後,我也會解一些大學 IC 競賽的題目,然後看看能學到什麼東西。 這個網站的宗旨,就是放開自己的內心,勇敢面對自己思考上的優點與缺點,精進自己,花一些體力,流一些汗水,去研究學問。即使某些學問很基本,也是很值得一再複習並一再思索的。不要壓抑自己,讓小屁孩的個性,能反映在創意上。 總之,我覺得能讓自己的腦袋動一動,挑戰一下自己的思考能力,把自己潛能發揮到極致,一直是我的夢想,Let's do it.