<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > FPGA研發(fā)之道(14)寫(xiě)在coding之前的鐵律

FPGA研發(fā)之道(14)寫(xiě)在coding之前的鐵律

作者: 時(shí)間:2014-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏

  寫(xiě)在之前的那些鐵律

本文引用地址:http://dyxdggzs.com/article/265175.htm

  (1)注釋?zhuān)?好的代碼首先必須要有注釋?zhuān)⑨屩辽侔ㄎ募⑨專(zhuān)丝谧⑨專(zhuān)δ苷Z(yǔ)句注釋。

  文件注釋?zhuān)何募⑨尵褪且粋€(gè)說(shuō)明文:這通常在文件的頭部注釋?zhuān)糜诿枋龃a為那個(gè)工程中,由誰(shuí)寫(xiě)的,日期是多少,功能描述,有哪些子功能,及版本修改的標示。這樣不論是誰(shuí),一目了然。即使不寫(xiě)文檔,也能知道大概。

  接口描述:module的接口信號中,接口注釋描述模塊外部接口,例如AHB接口,和SRAM接口等等。這樣讀代碼的人即可能夠判斷即模塊將AHB接口信號線(xiàn)轉換成SRAM接口信號。

  功能語(yǔ)句注釋?zhuān)?內部關(guān)鍵邏輯,狀態(tài)機某狀態(tài),讀過(guò)程、寫(xiě)過(guò)程。

  注釋的重要性,毋庸置疑,好的注釋?zhuān)軌蛱岣叽a的可讀性,可維護性等等??傊?,養成注釋的好習慣,代價(jià)不大,但是收益很大。

  (2)語(yǔ)句:

  開(kāi)始寫(xiě)代碼是,在設計中,特別是在可綜合的模塊實(shí)現中,verilog的語(yǔ)句是很固定的。在的設計中,不外乎邏輯和組合邏輯,除此之外,別無(wú)他法。對于開(kāi)始功能編碼來(lái)說(shuō),只需知道組合邏輯信號即可生效,邏輯在時(shí)鐘的下一拍起效就夠了。

  下面是編碼的實(shí)例。

  組合邏輯:兩種組合邏輯的描述,其功能是一致的。

  assign A = B ? 1 : D ? 2 :3;

  always@(*)

  if(B)

  A = 1

  else if(D)

  A = 2;

  else

  A = 3;

  組合邏輯 如果是異步復位的話(huà),描述如下

  always@(posedge sys_clk or negedge rst_n)

  if(!rst_n)

  a <= 0;

  else

  a <= b;

  也就是說(shuō),在verilog的可綜合電路的編碼中,只需要三種語(yǔ)句,分別是assign, always(*) 及的always(`CLOCK_EDGE clk ) 。 `CLOCK_EDGE 可以是上升沿或者下降沿。

  為什么用always@(*) 而不是always(敏感信號列表)?!?”包含所有敏感信號列表,如果在過(guò)程中,漏掉了某個(gè)敏感信號,則會(huì )導致仿真不正確,例如本例中,敏感變量列表中,需要B or C 但是如果漏掉一個(gè),仿真就會(huì )在B或C有變化時(shí),輸出沒(méi)有變化。導致仿真和功能不一致,但是對于綜合工具來(lái)說(shuō),功能還是能夠正常工作的,不會(huì )因為敏感變量列表中的值未列全而不綜合某條語(yǔ)句。某些情況下,敏感列表的值可能有十幾個(gè)甚至更多,遺漏是可能發(fā)生的事情,但是為了避免這種問(wèn)題,最好采用always(*)而不用敏感變量列表的方式,來(lái)避免仿真結果不一致的情況發(fā)生。

  (3)賦值:老話(huà)重提,阻塞與非阻塞

  很多同志喜歡鉆研阻塞賦值和非阻塞賦值,這兩種賦值,分別在always塊里面用于的阻塞“=”給組合邏輯賦值,非阻塞”<=”給時(shí)序邏輯賦值。這應該是鐵律,應該在編碼過(guò)程中被嚴格的遵守下來(lái)?!盀槭裁?,不這么用程序也能跑”。這句話(huà)部分是正確的,疑問(wèn)永遠是工程師最好的老師。

  誠然,某些情況下,不嚴格的執行也跑,但是在某些情況下,實(shí)現二者就不一樣。

  對于下面兩個(gè)例子來(lái)說(shuō)明,為什么?

?

  對于value1的描述方式:其綜合后的如下所示

  

?

  如果從實(shí)際的編譯結果上看 b和b1 及c和c1其使用阻塞賦值和非阻塞賦值最終的結果是一致的,因此,也就是說(shuō),某些情況下,二者的編譯結果一致。

  

?

  而對于value2的描述方式:其綜合后的電路圖如下所示。

  

?

  而對于第二中描述方式,阻塞賦值和非阻塞賦值的區別就顯現出來(lái)了,從綜合后的圖中可以看到,c1信號是b1信號的寄存,而c信號和b信號為同一信號,都為a信號的寄存。

  作為工程師,一項基本的能力,就是要知道代碼綜合后的電路和時(shí)序,不要讓其表現和你預想的不一致,“不一致”就意味著(zhù)失敗。即是代碼的失敗,也是工程的失敗

  對于阻塞和非阻塞賦值區別和詳細說(shuō)明來(lái)說(shuō),其能夠編寫(xiě)一本書(shū)(如有時(shí)間也可專(zhuān)題詳述),但是對FPGA工程師,對于verilog的編碼而言,則只需要按照時(shí)序邏輯用“<=”非阻塞,組合邏輯用阻塞“=”賦值即可。不要挑戰那些規律,試圖通過(guò)語(yǔ)言的特性來(lái)生成特殊電路的嘗試是不可取的,開(kāi)個(gè)玩笑的話(huà),是沒(méi)有前途的,要把設計的精力放在通過(guò)可用的電路來(lái)實(shí)現需求上,不要舍本逐末。在數字電路設計中,我們需要的是一個(gè)確定的世界,“所見(jiàn)及所得”,不要讓你所想的和綜合編譯工具得認識不一致。這也就是不要亂用和混用這兩個(gè)賦值的原因。

  (4)一個(gè)變量一個(gè)“家”

  不要在兩個(gè)always語(yǔ)句中同一個(gè)變量賦值。(這是必須的)

  也盡量不要在同一個(gè)always語(yǔ)句中,對兩個(gè)變量賦值。(這是可選的)

  如果是一組信號,其有共同的控制條件,則在同一always語(yǔ)句中賦值能夠減少代碼行數,提高可讀性,除此之外,最好分開(kāi)來(lái)寫(xiě)。如果幾個(gè)不太相關(guān)的信號在同一里面賦值,其可讀性極差,在組合邏輯中,還容易產(chǎn)生latch。

  而前者賦值方式,綜合工具肯定會(huì )報錯,這到不用很擔心,因為能夠報的錯誤時(shí)是最容易被發(fā)現的。俗語(yǔ)說(shuō):“咬人的狗不叫”,而對于FPGA設計來(lái)說(shuō)“致命的BUG,從來(lái)不報錯”。

  (5)鎖存

  FPGA中不要有鎖存器的產(chǎn)生。最容易產(chǎn)生的是在always(*)語(yǔ)句中,最后一定是所有分支條件都要描述并賦值,(一定要有最后的else)。狀態(tài)機中,同樣如此,不但需要有default的狀態(tài),每個(gè)狀態(tài)的都要有所有的分支都要賦值。

  鎖存器,是FPGA設計的大敵,因為會(huì )導致非你想要的錯誤功能的產(chǎn)生,并且導致時(shí)序分析錯誤,就會(huì )產(chǎn)生前述的問(wèn)題“所見(jiàn)不是所得”,并且綜合工具不會(huì )報錯。

  如果你設計的電路功能,仿真正確,而實(shí)際工作不正常,有一部分的原因是生成了鎖存器,如果設計很大,不容易查的話(huà),可以打開(kāi)綜合報告,搜索“LATCH”關(guān)鍵詞,查看是否有鎖存器的產(chǎn)生,一句話(huà)“鎖存器,必殺之”。

  時(shí)序邏輯會(huì )產(chǎn)生鎖存器嗎?當然不會(huì ),時(shí)序邏輯綜合結果必然是觸發(fā)器,因此不用檢查時(shí)序邏輯的分支條件。

  綜上:這是寫(xiě)在之前的話(huà),編碼的主要功能應該是用可靠的電路來(lái)描述FPGA功能和需求,不要試圖通過(guò)語(yǔ)言的特性來(lái)描述功能,設計的主要精力應放在用已知的電路(組合邏輯,時(shí)序邏輯)描述未知功能。

fpga相關(guān)文章:fpga是什么


電路圖符號相關(guān)文章:電路圖符號大全




關(guān)鍵詞: FPGA coding 時(shí)序

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>