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

FPGA研發(fā)之道(24)-控制(下)

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

  首先依次回答上篇提出的幾個(gè)問題:

      第一個(gè)問題:如何避免狀態(tài)機(jī)產(chǎn)生lacth 示例如下,通過在always(*)語句塊中,添加默認(rèn)賦值,ns_state = cs_state;

always@(*)

      ns_state = cs_state;

      case(cs_state)     

         idle :

                  if(start)

                  ns_state =  op1_state;

         op0_state :

                if(op0_over)

                  ns_state =  op1_state;

         op1_state :

                if(op1_over)

                  ns_state =  op2_state;

         op2_state :

                if(op2_over)

                  ns_state =  op3_state;

         op3_state :

                if(op3_over)

                  ns_state =  op4_state;

         op4_state :

                if(op4_over)

                  ns_state =  op4_state;

         default ns_state = idle;

       endcase

這樣,分支沒有賦值的語句全部會(huì)賦值為ns_state = cs_state ;以IDLE狀態(tài)為例,當(dāng)前cs_state為idle。因此實(shí)際上 ns_state=idle。這條語句的作用,即在沒有分支賦值的情況下,默認(rèn)賦值當(dāng)前狀態(tài)。

第二個(gè)問題:更直觀的獨(dú)熱碼的狀態(tài)機(jī)實(shí)現(xiàn)方式。示例如下

//狀態(tài)定義

parameter   idle == 0,

             op0_state == 1,

             op1_state == 2,

             op2_state == 3,

             op3_state == 4,

             op4_state == 5;

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

always@(posedge sys_clk or negedge rst_n)

       if(!rst_n)

         cs_state <=  6'b000001;

       else

         cs_state <= ns_state;

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

always@(*)

        ns_state = 0;

      case(1)     

         cs_state[idle] :

                  if(start)

                    ns_state[op0_state] =  1'b1;

                  else

                    ns_state[idle] = 1'b1;

          cs_state[op0_state] :

                  if(op0_over)

                    ns_state[op1_state] = 1'b1;

                  else

                    ns_state[op0_state] = 1'b1;

          cs_state[op1_state] :

                  if(op1_over)

                    ns_state[op2_state] = 1'b1;

                  else

                    ns_state[op1_state] = 1'b1;

         cs_state[op2_state] :

                  if(op2_over)

                    ns_state[op3_state] = 1'b1;

                  else

                    ns_state[op2_state] = 1'b1;

         cs_state[op3_state]:

                  if(op3_over)

                    ns_state[op4_state] = 1'b1;

                  else

                    ns_state[op3_state] = 1'b1;

         cs_state[op4_state] :

                  if(op4_over)

                    ns_state[idle]= 1'b1;

                  else

                    ns_state[op4_state] = 1'b1;

         default    ns_state[idle]= 1'b1;

       endcase

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

assign out1 = cs_state [op1_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;

        

上例中,定義狀態(tài)機(jī)是,同樣定義為0,1,2,3,4,5,6的值而不是獨(dú)熱碼,只不過使用時(shí),這些值用于賦值的為狀態(tài)機(jī)的某一bit。值得注意的是,在ns_state 通過組合邏輯賦值時(shí),首先需要將ns_state賦值為零,也就數(shù)說,除了需要賦值為1的狀態(tài),其他都需要賦值為0。但此種編碼方式下,就需要謹(jǐn)慎對(duì)待分支賦值不全的情況,因此此時(shí),ns_state會(huì)賦值為0。產(chǎn)生非想要的后果。

   通過第三段的輸出賦值可以看出,其輸出分別是cs_state [op1_state]的直接輸出,cs_state[op2_state]的寄存后一拍再輸出。其產(chǎn)生的效果與前文(控制-上)中介紹的產(chǎn)生的效果是一致的。因此可根據(jù)習(xí)慣,選擇一種的實(shí)現(xiàn)即可。

最后一個(gè)問題:狀態(tài)機(jī)使用可以直觀的通過定義的狀態(tài)來控制各個(gè)信號(hào)的輸出和控制,獨(dú)熱碼本質(zhì)上還是將狀態(tài)機(jī)轉(zhuǎn)變成一組某一時(shí)刻只有一個(gè)起效的寄存器,換個(gè)角度可以看做加強(qiáng)版的移位寄存器。其他需要注意問題有,

(1)如果狀態(tài)機(jī)定義而沒有使用,綜合工具將綜合掉此狀態(tài),因此綜合后的狀態(tài)會(huì)和工程師所定義的狀態(tài)不同。通過檢查綜合文件,就能得知其對(duì)應(yīng)關(guān)系,避免通過嵌入式邏輯分析儀抓信號(hào)時(shí),信號(hào)與實(shí)際不一致現(xiàn)象。

(2)如通過單周期信號(hào)啟動(dòng)狀態(tài)機(jī),要注意,如單周期信號(hào)起效時(shí),狀態(tài)機(jī)未跳轉(zhuǎn)回有效狀態(tài),會(huì)導(dǎo)致出錯(cuò),應(yīng)該將單周期信號(hào)轉(zhuǎn)換成電平信號(hào),等啟動(dòng)有效后再將電平信號(hào)拉低。

(3)狀態(tài)如出現(xiàn)未定義的狀態(tài)(如獨(dú)熱碼出現(xiàn)全零狀態(tài)),latch是其中一個(gè)主要的原因,上電后未有效復(fù)位也會(huì)導(dǎo)致此種可能。

(4)狀態(tài)機(jī)結(jié)合移位寄存器可以有效減少狀態(tài)的數(shù)目。例如某個(gè)狀態(tài)中,每個(gè)周期要進(jìn)行多個(gè)操作,不需要再分解成多個(gè)小狀態(tài),通過移位寄存器來控制這些狀態(tài)的操作能夠簡(jiǎn)化設(shè)計(jì)。

總之:狀態(tài)機(jī)是FPGA設(shè)計(jì)的一項(xiàng)基本設(shè)計(jì),而“獨(dú)熱碼”和“三段式”的設(shè)計(jì)能夠使設(shè)計(jì)達(dá)到事半功倍的效果。也是事實(shí)上行業(yè)內(nèi)的FPGA設(shè)計(jì)的標(biāo)準(zhǔn)寫法。而標(biāo)準(zhǔn)化能使難以理解的FPGA的代碼能夠有更好的移植和IP化的基礎(chǔ)。

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

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

廠商推薦

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

相關(guān)視頻

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