看板 Electronics 關於我們 聯絡資訊
先說我不是高手!但是在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
pachingoo:推 04/17 18:48
xwxw:推 04/17 20:02
robertshih:"="與"<="的涵意很深 如果做到synthesis就看得出差異了 04/17 20:25
pupucar:不使用專有名詞而喜歡用自己的語言 等你出來工作就知道死 04/17 20:45
pupucar:除非你天縱英才 可以一人搞定專案 都不用cowork的 04/17 20:47
Zephyr750:樓上!只是本篇不用!不代表一輩子不用....XD 04/17 20:53
echw:推!! 不過很多東西還是自己摸過才知道 04/17 21:25
echw:像前面有人說的 "=" 和 "<=" 不完全是原PO所解釋得如此 04/17 21:26
echw:比較簡單的用法裡面 "="可以用在你像是寫"c語言"那樣用 04/17 21:28
echw:初學者通常會在"="和"<="有疑問 是因為寫道"always" 04/17 21:30
echw:always裡面的描述 可以類似電路化的思考 用"<=" 04/17 21:32
echw:或者"c語言"的方法 用"=" 這是比較基礎的概念 04/17 21:32
Zephyr750:我個人不推薦把c語言和HDL語言拿來比較或介紹觀念... 04/17 21:41
Zephyr750:我改一下好了! 04/17 21:42
※ 編輯: Zephyr750 來自: 114.33.224.25 (04/17 21:45) ※ 編輯: Zephyr750 來自: 114.33.224.25 (04/17 21:46)
Zephyr750:好像愈改愈看不懂!^^" 04/17 21:47
echw:已經寫得很好了XDD 04/17 21:55
maxwellee:推推推 04/18 02:24
luckyBF:推一下 04/18 07:39
masage0514:大大 我想請問 !rst跟~rst難道不一樣嗎?差在哪?謝謝 04/20 12:48
uxijgil:reg不一定是受時間控制的 ex: reg a; always @(*) a = b; 04/20 21:35
uxijgil:!(2'b10) = 1'b0 ; ~(2'b10) = 2'b01 ; 對單訊號則沒差 04/20 21:37
Zephyr750:~所有bit反向, ! 1'b1(最小的bit)反向 04/20 23:20
Zephyr750:!(2'b10) = ~(1'b0) = 1'b1 好像是這樣才對 04/20 23:23
※ 編輯: Zephyr750 來自: 114.33.224.25 (04/21 00:02)
Pash77:錯 !2'b10 = ~(2'b10==0) = ~0 = 1 不然你用 !2'b01 就知 04/21 06:42
Pash77:我也寫錯! 是 !=0 才對 04/21 06:43
Pash77:!rst = !(rst!=0) 所以 rst=0 時 !(0!=0)=!0=1 04/21 06:46
Pash77:這個全華中譯本應該有吧? 04/21 06:48
pikachu2005:推~+1 04/21 13:55
potatojerry: ~: bitwise, ! : logical 04/22 23:09
bakerly:gate count是面積單位,不是時間單位, wire真的就是線 04/23 22:08
※ 編輯: Zephyr750 來自: 59.120.98.226 (11/14 11:23)
tj0706: 推推 04/07 11:34
sneak: !(2'b10) = https://muxiv.com 08/13 19:11
sneak: 不使用專有名詞而喜歡用 https://daxiv.com 09/17 23:05