<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 電源與新能源 > 牛人業(yè)話 > 大神教你如何做好邏輯設(shè)計(jì)

          大神教你如何做好邏輯設(shè)計(jì)

          作者: 時(shí)間:2014-05-16 來源:網(wǎng)絡(luò) 收藏

            規(guī)范很重要

          本文引用地址:http://www.ex-cimer.com/article/246996.htm

            工作過的朋友肯定知道,公司里是很強(qiáng)調(diào)規(guī)范的,特別是對(duì)于大的設(shè)計(jì)(無論軟件還是硬件),不按照規(guī)范走幾乎是不可實(shí)現(xiàn)的。邏輯設(shè)計(jì)也是這樣:如果不按規(guī)范做的話,過一個(gè)月后調(diào)試時(shí)發(fā)現(xiàn)有錯(cuò),回頭再看自己寫的代碼,估計(jì)很多信號(hào)功能都忘了,更不要說檢錯(cuò)了;如果一個(gè)項(xiàng)目做了一半一個(gè)人走了,接班的估計(jì)得從頭開始設(shè)計(jì);如果需要在原來的版本基礎(chǔ)上增加新功能,很可能也得從頭來過,很難做到設(shè)計(jì)的可重用性。

            在邏輯方面,我覺得比較重要的規(guī)范有這些:

            1.設(shè)計(jì)必須文檔化。要將設(shè)計(jì)思路,詳細(xì)實(shí)現(xiàn)等寫入文檔,然后經(jīng)過嚴(yán)格評(píng)審?fù)ㄟ^后才能進(jìn)行下一步的工作。這樣做乍看起來很花時(shí)間,但是從整個(gè)項(xiàng)目過程來看,絕對(duì)要比一上來就寫代碼要節(jié)約時(shí)間,且這種做法可以使項(xiàng)目處于可控、可實(shí)現(xiàn)的狀態(tài)。

            2.代碼規(guī)范。

            a.設(shè)計(jì)要參數(shù)化。比如一開始的設(shè)計(jì)時(shí)鐘周期是30ns,復(fù)位周期是5個(gè)時(shí)鐘周期,我們可以這么寫:

            parameter CLK_PERIOD = 30;

            parameter RST_MUL_TIME = 5;

            parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;

            ...

            rst_n = 1'b0;

            # RST_TIME rst_n = 1'b1;

            ...

            # CLK_PERIOD/2 clk <= ~clk;

            如果在另一個(gè)設(shè)計(jì)中的時(shí)鐘是40ns,復(fù)位周期不變,我們只需對(duì)CLK_PERIOD進(jìn)行重新例化就行了,從而使得代碼更加易于重用。

            b.信號(hào)命名要規(guī)范化。

            1) 信號(hào)名一律小寫,參數(shù)用大寫。

            2) 對(duì)于低電平有效的信號(hào)結(jié)尾要用_n標(biāo)記,如rst_n。

            3) 端口信號(hào)排列要統(tǒng)一,一個(gè)信號(hào)只占一行,最好按輸入輸出及從哪個(gè)模塊來到哪個(gè)模塊去的關(guān)系排列,這樣在后期仿真驗(yàn)證找錯(cuò)時(shí)后 方便很多。如:

            module a(

            //input

            clk,

            rst_n, //globle signal

            wren,

            rden,

            avalon_din, //related to avalon bus

            sdi, //related to serial port input

            //output

            data_ready,

            avalon_dout, //related to avalon bus

            ...

            );

            4) 一個(gè)模塊盡量只用一個(gè)時(shí)鐘,這里的一個(gè)模塊是指一個(gè)module或者是一個(gè)entity。在多時(shí)鐘域的設(shè)計(jì)中涉及到跨時(shí)鐘域的設(shè)計(jì)中最好有專門一個(gè)模塊做時(shí)鐘域的隔離。這樣做可以讓綜合器綜合出更優(yōu)的結(jié)果。

            5) 盡量在底層模塊上做邏輯,在高層盡量做例化,頂層模塊只能做例化,禁止出現(xiàn)任何膠連邏輯(glue logic),哪怕僅僅是對(duì)某個(gè)信號(hào)取反。理由同上。

            6) 在的設(shè)計(jì)上禁止用純組合邏輯產(chǎn)生latch,帶D觸發(fā)器的latch的是允許的,比如配置寄存器就是這種類型。

            7) 一般來說,進(jìn)入的信號(hào)必須先同步,以提高系統(tǒng)工作頻率(板級(jí))。

            8)所有模塊的輸出都要寄存器化,以提高工作頻率,這對(duì)設(shè)計(jì)做到收斂也是極有好處的。

            9) 除非是低功耗設(shè)計(jì),不然不要用門控時(shí)鐘--這會(huì)增加設(shè)計(jì)的不穩(wěn)定性,在要用到門控時(shí)鐘的地方,也要將門控信號(hào)用時(shí)鐘的下降沿 打一拍再輸出與時(shí)鐘相與。

            clk_gate_en -------- ----

            -----------------|D Q |------------------| gate_clk

            _out

            | | ---------| )--------

            -

            ------o|> | | | /

            clk | -------- | ----

            ------------------------------------

            10)禁止用計(jì)數(shù)器分頻后的信號(hào)做其它模塊的時(shí)鐘,而要用改成時(shí)鐘使能的方式,否則這種時(shí)鐘滿天飛的方式對(duì)設(shè)計(jì)的可靠性極為不利,也大大增加了靜態(tài)分析的復(fù)雜性。如的輸入時(shí)鐘是25M的,現(xiàn)在系統(tǒng)內(nèi)部要通過RS232與PC通信,要以rs232_1xclk的速率發(fā)送數(shù)據(jù)。

            不要這樣做:

            always (posedge rs232_1xclk or negedge rst_n)

            begin

            ...

            end

            而要這樣做:

            always (posedge clk_25m or negedge rst_n)

            begin

            ...

            else if ( rs232_1xclk == 1'b1 )

            ...

            end

          DIY機(jī)械鍵盤相關(guān)社區(qū):機(jī)械鍵盤DIY


          塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理

          上一頁(yè) 1 2 3 下一頁(yè)

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

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();