国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

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

發(fā)布時(shí)間:2014-12-9 13:45    發(fā)布者:看門(mén)狗
關(guān)鍵詞: FPGA
作者:阿昏豆

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

   對(duì)于簡(jiǎn)單控制,分別可以采用計(jì)數(shù)和移位寄存器的方式來(lái)解決問(wèn)題。而對(duì)于較為復(fù)雜的控制,則需要設(shè)計(jì)狀態(tài)機(jī)來(lái)解決。下面將分別介紹

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

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

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

   assign op4 = flag[4] ;

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

   對(duì)于復(fù)雜的控制,則狀態(tài)機(jī),就是必須的。對(duì)于FPGA實(shí)現(xiàn)狀態(tài)機(jī),其實(shí)并不需要那么多的設(shè)計(jì)的方法。主要就是兩個(gè)要點(diǎn)。(1)獨(dú)熱碼。(2)三段式。

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

   

狀態(tài)獨(dú)熱碼(也可以用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;

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

(1)綜合后,邏輯簡(jiǎn)單

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

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

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

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

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

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

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

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

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

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

本文地址:http://www.4huy16.com/thread-134808-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專(zhuān)區(qū)
  • Microchip第22屆中國(guó)技術(shù)精英年會(huì)上海首站開(kāi)幕
  • 電動(dòng)兩輪車(chē)設(shè)計(jì)生態(tài)系統(tǒng)
  • “芯”光璀璨,鵬城共賞——2025 Microchip中國(guó)技術(shù)精英年會(huì)深圳站回顧
  • 技術(shù)熱潮席卷三城,2025 Microchip中國(guó)技術(shù)精英年會(huì)圓滿收官!
  • 貿(mào)澤電子(Mouser)專(zhuān)區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表