色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

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

          本文引用地址:http://cafeforensic.com/article/266428.htm

            第一個問題:如何避免產(chǎn)生lacth 示例如下,通過在always(*)語句塊中,添加默認賦值,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

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

            第二個問題:更直觀的獨熱碼的實現(xiàn)方式。示例如下

            //狀態(tài)定義

            parameter idle == 0,

            op0_state == 1,

            op1_state == 2,

            op2_state == 3,

            op3_state == 4,

            op4_state == 5;

            //(1)當前狀態(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;

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

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

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

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

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

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

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

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

          fpga相關文章:fpga是什么


          可控硅相關文章:可控硅工作原理


          比較器相關文章:比較器工作原理




          關鍵詞: FPGA 狀態(tài)機

          評論


          相關推薦

          技術專區(qū)

          關閉