在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > FPGA研發(fā)之道(23)-控制(上)

            FPGA研發(fā)之道(23)-控制(上)

            作者: 時間:2014-12-02 來源:網(wǎng)絡(luò) 收藏

              本質(zhì)上說,的模塊設(shè)計就是將輸入轉(zhuǎn)化成想要得到的輸出結(jié)果。而除了某些簡單模塊,即在當(dāng)拍內(nèi)完成,即將輸入進(jìn)行邏輯操作后,再輸出。(如簡單加法器等)。其余大部分的設(shè)計需要通過時序邏輯和組合邏輯混合實現(xiàn),時序邏輯帶來就是延遲起效的問題,舉例說,如實現(xiàn)某個信號(start)起效后,接下來五個周期需要分別進(jìn)行五種操作,分別是op0,op1,op2,op3,op4 等等。如何進(jìn)行控制,這就是每個工程師要面對的問題。

            本文引用地址:http://www.biyoush.com/article/266275.htm

              對于簡單控制,分別可以采用計數(shù)和移位寄存器的方式來解決問題。而對于較為復(fù)雜的控制,則需要設(shè)計來解決。下面將分別介紹

              : 對于上述操作來說,start起效后,可以通過計數(shù)實現(xiàn),設(shè)置寄存器count[2:0],有效信號開始時計數(shù)自加。 計數(shù)的方式帶來的問題就是,計數(shù)從零開始還是從1開始,假如初始化為0,則從0-4狀態(tài)可以分別輸出op0,op1,op2,op3,op4,但是在無有效信號時,計數(shù)會保持0,從而造成op0的輸出。 上述舉例雖然簡單,但是確實很多初學(xué)者或者工程師在仿真時會經(jīng)常會犯的錯誤。從設(shè)計來說,計數(shù)需要考慮初始值對于輸出的影響。同樣計數(shù)帶來的另一個問題就是,從零開始的計數(shù)會導(dǎo)致設(shè)計與實際不一致,例如,一個信號9拍后拉低,但從零計數(shù)到8時,已經(jīng)到9拍了(0-8),這種設(shè)計會導(dǎo)致命名count==8 與9拍存在不一致的現(xiàn)象。當(dāng)然也可以從1計數(shù)到9,這樣狀態(tài)在count==9時觸發(fā)。這樣就會初始化需要復(fù)位寄存器為1。當(dāng)然這個問題大端和小端的爭斗一樣,沒有終點。一個設(shè)計中如果多種計數(shù)來驅(qū)動計數(shù)的話,就需要特別小心這個問題計數(shù)。當(dāng)然也可把問題交給仿真器,仿真時根據(jù)波形調(diào)整,計數(shù)的狀態(tài)。

              移位寄存器:如采用移位寄存器,根據(jù)上述例子,則start信號有效后,設(shè)計5bit的移位寄存器flag[4:0]分別利用寄存器的某BIT來控制輸出,從而在每BIT有效時,分別輸出op0,op1,op2,op3,op4。假設(shè)此種狀態(tài)較少,寄存器資源較為豐富,因此利用移位寄存器是一個不錯的注意。

              assign op4 = ( count == 3’b100) ;

              assign op4 = flag[4] ;

              比較上述兩種輸出,則可以看出,通過計數(shù)的方式占用輸出資源較多,而移位寄存器在此種應(yīng)用下,占用邏輯就相對簡單。(僅針對小規(guī)模的計數(shù)來說,對于超過16的計數(shù),則使用更優(yōu))。另外,通過移位寄存器可以方便的進(jìn)行時序控制,不用糾結(jié)從零開始還是從1開始的問題,在某些簡單的處理下能夠達(dá)到更小的面積和更快的時序。

              對于復(fù)雜的控制,則,就是必須的。對于實現(xiàn),其實并不需要那么多的設(shè)計的方法。主要就是兩個要點。(1)獨熱碼。(2)三段式。

              對于第一點來說,獨熱碼,因為FPGA內(nèi)部寄存器資源較多,另外獨熱碼將會帶來額外的面積和時序優(yōu)化的好處。則以上述例子為例,增加狀態(tài)轉(zhuǎn)移的觸發(fā)信號,狀態(tài)轉(zhuǎn)移圖如下所示:

              

             

              狀態(tài)獨熱碼(也可以用define localparam)建議使用parameter或者localparam

              parameter idle == 6’b000001,

              op0_state == 6’b000010,

              op1_state == 6’b000100,

              op2_state == 6’b001000,

              op3_state == 6’b010000,

              op4_state == 6’b100000;

              三段式結(jié)構(gòu)如下

              //(1)當(dāng)前狀態(tài)

              always@(posedge sys_clk or negedge rst_n)

              if(!rst_n)

              cs_state <= idle;

              else

              cs_state <= ns_state;

              //(2)下一狀態(tài)的賦值

              always@(*)

              case(cs_state)

              idle : if(start)

              ns_state = op0_state;

              else

              ns_state = idle;

              op0_state :

              if(op0_over)

              ns_state = op1_state;

              else

              ns_state = op0_state;

              op1_state :

              if(op1_over)

              ns_state = op2_state;

              else

              ns_state = op1_state;

              op2_state :

              if(op2_over)

              ns_state = op3_state;

              else

              ns_state = op2_state;

              op3_state :

              if(op3_over)

              ns_state = op4_state;

              else

              ns_state = op3_state;

              op4_state :

              if(op4_over)

              ns_state = op4_state;

              else

              ns_state = idle;

              default ns_state = idle;

              endcase

              //(3)輸出狀態(tài)

              assign out1 = (cs_state == op0_state);

              always@(posedge sys_clk or negedge rst_n)

              if(!rst_n)

              out2_reg <= 1'b0;

              else if (cs_state == op2_state)

              out2_reg <= 1'b1;

              else

              out2_reg <= 1'b0;

              上述例子,介紹獨熱碼和三段式。三段式的好處不用說,就是邏輯清楚。可以看出out1輸出為組合輸出。out_2_reg為寄存輸出。那么獨熱碼在FPGA內(nèi)部的優(yōu)勢又有哪些?

              (1)綜合后,邏輯簡單

              例如assign out1 = (cs_state == op0_state); 綜合后的電路等同于

              assign out1= cs_state(0) ;//可以看出無邏輯消耗

              而 out2_reg 的電路等同于 將cs_state(2)寄存一拍,只需一個寄存器的消耗

              (2)時序優(yōu)化。

              從上述同樣得出結(jié)論,如果是使用某狀態(tài)cs_state(n)作為其他信號的輸入來說,其本身為寄存器信號,因此關(guān)鍵路徑就會減少一級??赡苓\行較快的頻率就會增加。如不是獨**,對比這兩條語句cs_state = 3 與cs_state(3) 一個是組合輸出,一個寄存器輸出。其不同也就是上述計數(shù)與移位寄存器的區(qū)別一致。

              那么一般狀態(tài)機(jī)會產(chǎn)生的錯誤會有哪些那?

              首先;就是狀態(tài)不全產(chǎn)生LATCH,前文已述,這是FPGA設(shè)計的大敵,解決這個問題的方法可以通過所有分支都設(shè)定確定狀態(tài),如上例中。有沒有更簡單的方式?

              其此:狀態(tài)機(jī)上述描述,并不直觀的顯現(xiàn)綜合后電路的描述,有沒有更直接的rtl的描述,一眼就能看出獨熱碼的特征和好處?

              最后:狀態(tài)機(jī)是一個較為成熟技術(shù),還會有哪些值得關(guān)注的地方?

              這些問題,下節(jié)再述。



            評論


            相關(guān)推薦

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

            關(guān)閉