摘 要: 隨著電子信息技術(shù)的不斷發(fā)展,電子系統(tǒng)模塊化的設(shè)計(jì)思想已經(jīng)深入人心。因此,加強(qiáng)軟件和硬件模塊設(shè)計(jì)經(jīng)驗(yàn)的相互借鑒意義重大。針對(duì)這種情況,借助于有限狀態(tài)機(jī)理論,提出了一種將C程序轉(zhuǎn)化成Verilog HDL描述的具體方法。同時(shí),詳細(xì)介紹了有限狀態(tài)機(jī)理論,分析了在利用有限狀態(tài)機(jī)進(jìn)行設(shè)計(jì)時(shí)應(yīng)該遵循的準(zhǔn)則,并給出了一個(gè)具體的轉(zhuǎn)化實(shí)例和最終的仿真結(jié)果。從仿真結(jié)果可以看出此方法是可行的。
關(guān)鍵詞: 有限狀態(tài)機(jī)(FSM);Verilog HDL;硬件設(shè)計(jì);C程序
0 引言
近年來(lái),電子系統(tǒng)的模塊化設(shè)計(jì)思想越來(lái)越成熟,在一些實(shí)際的電子系統(tǒng)設(shè)計(jì)過(guò)程中,通常將整個(gè)系統(tǒng)分成軟件和硬件兩個(gè)系統(tǒng)分別進(jìn)行設(shè)計(jì),然后再進(jìn)行整合,而一些比較成熟的綜合開(kāi)發(fā)工具使得軟件和硬件的設(shè)計(jì)流程更加統(tǒng)一。在硬件設(shè)計(jì)過(guò)程中主要使用可編程邏輯器件(PLD),形成電路網(wǎng)表結(jié)構(gòu),實(shí)現(xiàn)具體的邏輯,這樣的配置可以實(shí)現(xiàn)用于軟件用途的硬件[1]。
但是,軟件設(shè)計(jì)的思想和硬件設(shè)計(jì)的思想是截然不同的。軟件設(shè)計(jì)過(guò)程中首先是通過(guò)具體的算法描述實(shí)際的問(wèn)題,再通過(guò)一些具體的編程語(yǔ)言去編寫程序,然后通過(guò)相應(yīng)的編譯器編譯連接,生成機(jī)器可以識(shí)別的二進(jìn)制代碼,最后這些代碼在具體的微處理器上執(zhí)行[2]。而對(duì)于硬件的設(shè)計(jì)則是通過(guò)一些比較成熟的綜合工具將HDL編寫的代碼綜合成實(shí)際的電路網(wǎng)表結(jié)構(gòu),最終形成具體的電路結(jié)構(gòu)。圖1和圖2分別表示了兩者設(shè)計(jì)思想之間的區(qū)別。
因此,如何實(shí)現(xiàn)C程序和Verilog HDL之間的轉(zhuǎn)化就尤為重要。下文將重點(diǎn)論述如何借助于有限狀態(tài)機(jī),將C程序轉(zhuǎn)化為Verilog HDL,并給出了其理論依據(jù)和具體的實(shí)現(xiàn)步驟。
1 有限狀態(tài)機(jī)理論
有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM)是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型,狀態(tài)機(jī)用來(lái)描述發(fā)生有先后順序或者有邏輯規(guī)律的事情。狀態(tài)機(jī)是對(duì)一些具有邏輯順序或具有時(shí)序規(guī)律的事件進(jìn)行描述的一種方法。
利用有限狀態(tài)機(jī)進(jìn)行設(shè)計(jì)有以下幾個(gè)優(yōu)點(diǎn):綜合器易于進(jìn)行優(yōu)化;較容易構(gòu)成性能良好的時(shí)序邏輯模塊;整個(gè)結(jié)構(gòu)模式簡(jiǎn)單,層次分明,易讀易懂,而且容易進(jìn)行排錯(cuò);運(yùn)行模式類似于CPU的運(yùn)行模式,可以進(jìn)行順序控制;系統(tǒng)的可靠性高,運(yùn)行狀態(tài)穩(wěn)定。
有限狀態(tài)機(jī)設(shè)計(jì)的重點(diǎn)在于狀態(tài)的劃分、過(guò)程的描述方式和狀態(tài)的編碼方式。在狀態(tài)的劃分過(guò)程中要明確每個(gè)狀態(tài)的輸入輸出和狀態(tài)之間的轉(zhuǎn)移條件。
有限狀態(tài)機(jī)的過(guò)程描述方式可分為單過(guò)程描述、雙過(guò)程描述和三過(guò)程描述。在實(shí)際的有限狀態(tài)機(jī)設(shè)計(jì)時(shí)更多的是采用雙過(guò)程和三過(guò)程進(jìn)行描述。雙過(guò)程的描述有利于綜合器優(yōu)化代碼,也便于閱讀和維護(hù),缺點(diǎn)是組合邏輯的輸出可能會(huì)產(chǎn)生毛刺[3];三過(guò)程的描述與雙過(guò)程描述相比,雖然代碼的結(jié)構(gòu)較復(fù)雜,但是沒(méi)有毛刺的輸出,而且有利于綜合;單過(guò)程的描述會(huì)使得代碼相對(duì)比較冗長(zhǎng),難以修改和調(diào)試,不利于代碼的長(zhǎng)期性維護(hù),不利于附加約束,優(yōu)化綜合效果差,會(huì)導(dǎo)致邏輯速度變慢,資源消耗增多,一般情況下不采用這種過(guò)程描述方式[4-5]。
通常對(duì)于FPGA器件來(lái)說(shuō),采用一位熱碼編碼可以有效提高電路的速度和可靠性,也有利于提高器件資源的利用率。在實(shí)際的設(shè)計(jì)過(guò)程中,更多的是采用One-Hot編碼方式進(jìn)行編碼[6]。
2 理論依據(jù)和具體實(shí)現(xiàn)步驟
C語(yǔ)言作為一種面向過(guò)程的程序設(shè)計(jì)語(yǔ)言,在程序設(shè)計(jì)的過(guò)程中首先要分析出解決問(wèn)題所需要的步驟,然后用函數(shù)把這些步驟一步一步地實(shí)現(xiàn),在使用時(shí)逐步去調(diào)用這些函數(shù),從而解決這些問(wèn)題[7]。有限狀態(tài)機(jī)正是將一個(gè)Verilog HDL程序中要表述的問(wèn)題劃分成不同的狀態(tài)進(jìn)行解決,通過(guò)狀態(tài)的不斷轉(zhuǎn)換從而實(shí)現(xiàn)分步解決問(wèn)題的目的,這與C程序的語(yǔ)句執(zhí)行方式是相同的。因此,可以借助于有限狀態(tài)機(jī),用Verilog HDL去實(shí)現(xiàn)C程序。下面是將C程序轉(zhuǎn)化為Verilog HDL進(jìn)行描述的具體步驟:
(1)對(duì)于一個(gè)完整的C程序,先用算法流程圖將其整個(gè)程序流程詳細(xì)表述出來(lái);
(2)根據(jù)程序的實(shí)際要求,將整個(gè)算法流程分成若干個(gè)狀態(tài),確定好每個(gè)狀態(tài)的輸入輸出和狀態(tài)之間的轉(zhuǎn)換條件,用狀態(tài)轉(zhuǎn)移圖描述整個(gè)算法流程圖;
?。?)用Verilog HDL描述其狀態(tài)轉(zhuǎn)移圖,然后進(jìn)行綜合,最后進(jìn)行仿真驗(yàn)證;
?。?)在劃分狀態(tài)時(shí)應(yīng)注意相同狀態(tài)的合并,減少不必要的狀態(tài),簡(jiǎn)化程序。
可以根據(jù)下面的基本單元模塊用狀態(tài)轉(zhuǎn)移圖描述算法流程圖。圖3所示的順序語(yǔ)句、選擇語(yǔ)句和循環(huán)語(yǔ)句是構(gòu)成一個(gè)C算法流程圖的基本單元,圖4是其基本單元的狀態(tài)轉(zhuǎn)移圖。
3 設(shè)計(jì)舉例及其C程序表示
下面講述一個(gè)利用C語(yǔ)言編寫的、以51單片機(jī)作為微處理器實(shí)現(xiàn)的一個(gè)汽車尾燈控制程序,已知汽車左右兩側(cè)各有4個(gè)尾燈。要求:(1)當(dāng)汽車正常行駛時(shí)所有的燈全滅;(2)剎車時(shí)所有的燈全亮;(3)左拐彎時(shí),只有左側(cè)四個(gè)燈閃爍;(4)右拐彎時(shí),只有右側(cè)的四個(gè)燈閃爍。先畫出整個(gè)程序的算法流程圖如圖5所示,其中S1用來(lái)檢測(cè)剎車信號(hào),S2用來(lái)檢測(cè)左拐彎信號(hào),S3用來(lái)檢測(cè)右拐彎信號(hào)。
如下是用偽代碼表示的為51單片機(jī)編寫的C程序:
#include<reg52.h>//頭文件
/*用開(kāi)關(guān)S1產(chǎn)生剎車信號(hào),開(kāi)關(guān)S2產(chǎn)生左拐彎信號(hào),開(kāi)關(guān)S3產(chǎn)生右拐彎信號(hào)*/
sbit S1=P2^0;//開(kāi)關(guān)S1按下表示產(chǎn)生剎車信號(hào)
sbit S2=P2^2;//開(kāi)關(guān)S2按下表示產(chǎn)生左拐彎信號(hào)
sbit S3=P2^4;//開(kāi)關(guān)S3按下表示產(chǎn)生右拐彎信號(hào)
void keyscan();//按鍵信號(hào)檢測(cè)
void main()
{
while(1)//循環(huán)檢測(cè)
{
keyscan();//不斷掃描按鍵,檢測(cè)是否有信號(hào)產(chǎn)生
switch(k)//判斷檢測(cè)到的信號(hào)類型
{
/*P1口的低四位表示左側(cè)的四個(gè)燈,高四位表示右側(cè)的四個(gè)燈,低電平點(diǎn)亮*/
case1:P1=0x00;break;//剎車信號(hào),所有燈全亮
case2:P1=0xF0;break;//左拐彎信號(hào),左側(cè)燈閃爍
case3:P1=0x0F;break;//右拐彎信號(hào),右側(cè)燈閃爍
default:P1=0xFF;break;//正常行駛,所有燈全滅
}}}
4 Verilog HDL描述及其仿真
下面用Verilog HDL來(lái)描述上述C程序。首先根據(jù)圖5的算法流程圖畫出狀態(tài)轉(zhuǎn)移圖,如圖6所示。將其整個(gè)算法流程分成S0~S5共6個(gè)狀態(tài),其中S0為初始狀態(tài),檢測(cè)信號(hào)的產(chǎn)生;S1狀態(tài)用來(lái)處理剎車信號(hào);S2、S3狀態(tài)用來(lái)處理左拐彎信號(hào);S4、S5用來(lái)處理右拐彎信號(hào)。
用Verilog HDL描述圖6的狀態(tài)轉(zhuǎn)移圖,其完整代碼如下所示:
module ex(clk,qout,a,b,c);
/*輸入信號(hào)a,b,c為高電平時(shí)分別表示剎車信號(hào),左拐彎信號(hào)和右拐彎信號(hào)*/
input clk,a,b,c;
/*輸出信號(hào)qout的低四位表示左側(cè)的四個(gè)燈,高四位表示右側(cè)的四個(gè)燈,其中低電平有效*/
output reg[7:0]qout;
reg[4:0]current_state,next_state;
/*采用One-Hot編碼方式進(jìn)行編碼*/
parameter s0=5′b00000,s1=5′b00001,
s2=5′b00010,s3=5′b00100,
s4=5′b01000,s5=5′b10000;
always@(posedge clk)
current_state<=next_state;
always @(posedge clk)
begin
case(current_state)
s0:begin if(a)next_state<=s1;else if(b)
next_state<=s2;else if(c)
next_state<=s4;
end
s1:next_state<=s0;s2:next_state<=s3;
s3:next_state<=s0;s4:next_state<=s5;
s5:next_state<=s0;default:next_state<=s0;
endcase
end
always@(current_state)
begin
case(current_state)
s0:qout<=8′b11111111;
s1:qout<=8′b00000000;
s2:qout<=8′b11110000;
s3:qout<=8′b11111111;
s4:qout<=8′b11111111;
s5:qout<=8′b00001111;
default:qout<=8′bzzzzzzzz;
endcase
end
endmodule
圖7為波形仿真圖,從圖中可以看出:(1)當(dāng)a為高電平時(shí),產(chǎn)生剎車信號(hào),qout信號(hào)在S1狀態(tài)輸出低電平;(2)當(dāng)b為高電平時(shí),產(chǎn)生左拐彎信號(hào),qout信號(hào)的低4位在S2、S3狀態(tài)分別輸出低電平和高電平,產(chǎn)生閃爍信號(hào);(3)當(dāng)c為高電平時(shí),產(chǎn)生右拐彎信號(hào),qout信號(hào)的高4位在S4、S5狀態(tài)分別輸出低電平和高電平,產(chǎn)生閃爍信號(hào);(4)從(1)~(3)可以看出其仿真結(jié)果是正確的,符合程序的基本要求,文中的方法是可行的;(5)用三過(guò)程進(jìn)行描述時(shí),無(wú)毛刺的輸出,而且容易進(jìn)行綜合,采用One-Hot編碼方式可以提高電路的速度和可靠性,同時(shí)也可以提高器件資源的利用率。
5 結(jié)論
通過(guò)上文的表述,借助于有限狀態(tài)機(jī),可以參考文中的方法實(shí)現(xiàn)用Verilog HDL描述C程序,從而可以通過(guò)實(shí)際的電路結(jié)構(gòu)來(lái)實(shí)現(xiàn)軟件程序的功能,這種方法也可以實(shí)現(xiàn)Verilog HDL程序和C程序之間的相互轉(zhuǎn)換。同時(shí),文中也歸納出在利用有限狀態(tài)機(jī)進(jìn)行設(shè)計(jì)時(shí)應(yīng)該遵循的原則。
參考文獻(xiàn)
[1] 楊海鋼,孫嘉斌,王慰.FPGA器件設(shè)計(jì)技術(shù)發(fā)展綜述[J].電子與信息學(xué)報(bào),2010,32(3):714-723.
[2] 范華,秦茂玲,張俊.透視C程序設(shè)計(jì)語(yǔ)言[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008,16(6):64-66.
[3] 王春旭,周曉平,王黎黎.基于FPGA的Verilog HDL語(yǔ)言設(shè)計(jì)優(yōu)化[J].電子元器件應(yīng)用,2009,10(11):45-47.
[4] 魏芳,劉志軍,王立華.基于Verilog HDL的可綜合有限狀態(tài)機(jī)設(shè)計(jì)[J].電子工程師,2006,32(6):8-10.
[5] 劉小平,何云斌,董懷國(guó).基于Verilog HDL的有限狀態(tài)機(jī)設(shè)計(jì)與描述[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(4):958-960.
[6] 龔書濤,呂國(guó)強(qiáng),彭良清.在FPGA中狀態(tài)機(jī)的編碼方式[J].電子工程師,2005,31(11):51-52.
[7] 丁亞濤.C語(yǔ)言程序設(shè)計(jì)(第二版)[M].北京:高等教育出版社,2006.