為什麼這篇Verilog鄉民發文收入到精華區:因為在Verilog這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者Zephyr750 (紅蓮西風750)看板Electronics標題[心得] verilog c...
Verilog 在 Danny I-Te Hung Instagram 的最讚貼文
2021-04-04 15:59:54
#InnovateAsia Transformation Biped walking through Robot Kinemaics Task modeling Deep learning CNN Tele-operation 全部都用verilog寫在FPGA上 這樣還不夠創新的話 那我也是醉...
先說我不是高手!但是在verilog中略有心得
PTT的C_CPP版得知Programing版
在Programing版討論HDL串中發現此版
小小的瀏覽一下發現對於verilog有很多討論
就想在此與版友分享
----------------癈話完畢--------------------
Verilog Code是硬體,寫出來的就是元件(不只是語法)
所以,新手要練到
1.在寫的同時,可以知道自己寫的是什麼元件
2.在合成的同時,可以知道合成出來的檔是什麼
是一件很重要的事
先來說第一件事
「在寫的同時,可以知道自己寫的是什麼元件」
要對於語法與元件的意義了解到某種程度,才可以掌握得很好
那語法要怎麼了解呢?(此篇先討論這件事吧?!)
HDL大致上分成兩種電路
1.有clk
2.無clk
學術上(或業界)使用的詞很多!像Gate level、RTL...來分類電路
在此盡可能不要提這些專有名詞(因為我也搞不太懂)
「有clk」的電路屬於「受時間控制」的電路
也就是 觸發時 輸入是什麼,輸出才是什麼,花的時間以clk數(全波)計算
例如:
在Verilog中
always@(posedge clk) 表示 在clk正緣觸發時,以下電路動一次
always以下描述的電路隨clk的正緣變化才存在(動作)!
輸入是什麼東西,變化了幾次,都不存在(動作或影響)...
這也是最常見的寫法
還有「<=」的語法
「<=」代表不等待上一行回應,完成馬上執行
(這觀念是老師教的,我自己還沒有很懂!但老師的確是這樣講的沒錯)
我自己的理解是「觸發同時執行」(相同時間,也就是隨時間控制)
所以「<=」會放在「always@(正緣或負緣 clk)」的裡面。
還有「reg」的語法
在特定時間時,才更新內容的電路元件
不然儲存的內容不變(儲存功能就這樣出現了)
所以「reg」會放在「<=」的左邊,因為要更新資訊。
「無clk」的電路屬於「不受時間控制」的電路
: -也就是輸入是什麼,輸出馬上就是什麼,花的時間以gate count計算
+也就是輸入是什麼,輸出馬上就是什麼,花的時間以gate delay計算 //bakerly更正
例如:
在Verilog中
assign ...
assign後面描述的電路為永久存在!
只要輸入變化,輸出也就會馬上變化
(因為沒有時間條限制電路的存在性)
同義寫法為(個人不常這麼寫,不過很多assign可以用這個取代)
always@* 或 always@(a, b, c, ...)(沒有正負緣)
還有「=」的語法
「=」代表等待上一行回應後,再執行
(這觀念是老師教的,我自己還沒有很懂!但老師的確是這樣講的沒錯)
就是不隨時間影響,永久存在的電路(接線之類的)
所以「=」會放在always@(正緣或負緣 clk)外面
還有「wire」的語法
字面上是線,但是它代表永久存在的資料空間,只要輸入改變輸出就改變
(所以,不拿來用在儲存資料)常用在元件之間的立即傳遞資料
這種電路速度極快!不用等clk完成全波,馬上就可以做很多動作(只要輸入一直變)
但是容易失控
----------------------------------------------------------------
接下來講常見句子
先說無clk的
assign a = (c > 10) ? b : b+1;
(c > 10)?
也就是
if(c > 10)(這種寫法在有clk的比較常見,只差在一個DFF)
代表一個方塊,裡面很多邏輯閘,在條件成立時輸出為hi(1bit的訊號輸出)
這個方塊已經在synthesis時最佳化(用數位邏輯教的方法)
輸出的線接給一個2to1的選擇器
輸入都算好了 b, b+1,輸出就等選擇的線決定誰要輸出
assign a = b + c;
assign a = b;
assign a = ....
剩下的我想不用我多說了!多練習就可以看懂複雜的Gate level電路了!
再說有clk的電路
always@(posedge clk)
代表以下電路都有接clk這條線,並且是正緣觸發(沒有小圓圈)
+---- +----
clk | clk |
----|> ----o|>
| |
+---- +----
正緣 負緣
always@(poedge clk, negedge rst)
begin
if(!rst) → 在此一定要使用!,而且上面的negedge rst一定要寫
...
end
有寫 negedge rst 電路不會把
if(!rst) //若rst負緣觸發
當作是
if(rst == 0) //若rst低準位
或
if(~rst) //若rst低準位
在有clk影響的電路將clk和rst設定好之後,就看見以下的語法(常用語法)
(因大多數電路都是用DFF組成,
所以rst通常都會設定,不過也有不用的時候!)
always@(posedge clk, negedge rst) //正負緣看需求訂定
begin
if(!rst)
begin
....(初始化設定)
end
else
begin
....(電路function)
end
end
以上,應該可以應付很多新手觀念上模糊的問題了!
之後只要依一開始講的方向去做,合成完看RTL、synthesis report的時間估計
以及檔案之間的變化,慢慢的就可以成為高手了!
而合成的過程也可以在coding時掌握住!也就有寫元件的感覺了....
在那時,如果有人問你,你可以說「我不是高手!不過略懂..」
跟別人分享心得,互相成長!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.80.140.211
※ 編輯: Zephyr750 來自: 114.33.224.25 (04/17 21:46)