Verilog HDL(Hardware Description Language)是在用途最廣泛的C語(yǔ)言的基礎(chǔ)上發(fā)展起來(lái)的一種硬件描述語(yǔ)言,具有靈活性高、易學(xué)易用等特點(diǎn)。Verilog HDL可以在較短的時(shí)間內(nèi)學(xué)習(xí)和掌握,目前已經(jīng)在FPGA開(kāi)發(fā)/IC設(shè)計(jì)領(lǐng)域占據(jù)絕對(duì)的領(lǐng)導(dǎo)地位。
簡(jiǎn)單的編程案例
為快速入門(mén)Verilog語(yǔ)言,先從簡(jiǎn)單的編程案例開(kāi)始。以LED流水燈程序?yàn)槔齺?lái)給大家展示Verilog的程序框架,代碼如下所示。
module led(
input sys_clk , //系統(tǒng)時(shí)鐘
input sys_rst_n, //系統(tǒng)復(fù)位,低電平有效
output reg [3:0] led //4位LED燈
);
//parameter define
parameter WIDTH = 25 ;
parameter COUNT_MAX = 25_000_000; //板載50M時(shí)鐘=20ns,0.5s/20ns=25000000,需要25bit
//位寬
//reg define
reg [WIDTH-1:0] counter ;
reg [1:0] led_ctrl_cnt;
//wire define
wire counter_en ;
//***********************************************************************************
//** main code
//***********************************************************************************
//計(jì)數(shù)到最大值時(shí)產(chǎn)生高電平使能信號(hào)
assign counter_en = (counter == (COUNT_MAX - 1'b1)) ? 1'b1 : 1'b0;?
//用于產(chǎn)生0.5秒使能信號(hào)的計(jì)數(shù)器
always @(posedge sys_clk)?
begin
if (sys_rst_n == 1'b0)
counter <= 1'b0;
else if (counter_en)
counter <= 1'b0;
else
counter <= counter + 1'b1;
end
//led流水控制計(jì)數(shù)器
always @(posedge sys_clk)?
begin
if (sys_rst_n == 1'b0)
led_ctrl_cnt <= 2'b0;
else if (counter_en)
led_ctrl_cnt <= led_ctrl_cnt + 2'b1;
end
//通過(guò)控制IO口的高低電平實(shí)現(xiàn)發(fā)光二極管的亮滅
always @(posedge sys_clk)?
begin
if (sys_rst_n == 1'b0)
led <= 4'b0;
else begin
case (led_ctrl_cnt)?
2'd0 : led <= 4'b0001;
2'd1 : led <= 4'b0010;
2'd2 : led <= 4'b0100;
2'd3 : led <= 4'b1000;
default : led <= 4'b1111;
endcase
end
end
endmodule?
需要注意的幾個(gè)點(diǎn):
注釋?zhuān)簝煞N方式,一種是以“/*”符號(hào)開(kāi)始,“*/”結(jié)束,在兩個(gè)符號(hào)之間的語(yǔ)句都是注釋語(yǔ)句,因此可擴(kuò)展到多行。另一種是以//開(kāi)頭的語(yǔ)句,它表示以//開(kāi)始到本行結(jié)束都屬于注釋語(yǔ)句。
模塊定義:以module開(kāi)始,endmodule結(jié)束;
端口定義:input ?output
數(shù)據(jù)類(lèi)型的定義:reg 、wire、parameter
assign語(yǔ)句:條件成立選擇1,否則選擇0
always語(yǔ)句:語(yǔ)句中的posedge代表在時(shí)鐘上升沿進(jìn)行信號(hào)觸發(fā)。begin/end代表語(yǔ)句的開(kāi)始和結(jié)束。
If-else語(yǔ)句:和C語(yǔ)言是比較類(lèi)似的。
Case語(yǔ)句:需要一個(gè)case關(guān)鍵字開(kāi)始,endcase關(guān)鍵字結(jié)束,default作為默認(rèn)分支,和C語(yǔ)言也是類(lèi)似的。
問(wèn)號(hào)語(yǔ)句:與if-else類(lèi)似。
Verilog的常用語(yǔ)法
Verilog的數(shù)字進(jìn)制格式?
Verilog數(shù)字進(jìn)制格式包括二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制,一般常用的為二進(jìn)制、十進(jìn)制和十六進(jìn)制。
二進(jìn)制表示如下:4’b0101表示4位二進(jìn)制數(shù)字0101;
十進(jìn)制表示如下:4’d2表示4位十進(jìn)制數(shù)字2(二進(jìn)制0010);
十六進(jìn)制表示如下:4’ha表示4位十六進(jìn)制數(shù)字a(二進(jìn)制1010),十六進(jìn)制的計(jì)數(shù)方式為0,1,2,…,9,a,b,c,d,e,f,最大計(jì)數(shù)為f(f:十進(jìn)制表示為15)。
當(dāng)代碼中沒(méi)有指定數(shù)字的位寬與進(jìn)制時(shí),默認(rèn)為32位的十進(jìn)制,比如100,實(shí)際上表示的值為32’d100
Verilog的數(shù)據(jù)類(lèi)型?
在Verilog語(yǔ)法中,主要有三大類(lèi)數(shù)據(jù)類(lèi)型,即寄存器類(lèi)型、線網(wǎng)類(lèi)型和參數(shù)類(lèi)型。從名稱(chēng)中,我們可以看出,真正在數(shù)字電路中起作用的數(shù)據(jù)類(lèi)型應(yīng)該是寄存器類(lèi)型和線網(wǎng)類(lèi)型。
寄存器類(lèi)型
寄存器類(lèi)型表示一個(gè)抽象的數(shù)據(jù)存儲(chǔ)單元,它只能在always語(yǔ)句和initial語(yǔ)句中被賦值,并且它的值從一個(gè)賦值到另一個(gè)賦值過(guò)程中被保存下來(lái)。如果該過(guò)程語(yǔ)句描述的是時(shí)序邏輯,即always語(yǔ)句帶有時(shí)鐘信號(hào),則該寄存器變量對(duì)應(yīng)為寄存器;如果該過(guò)程語(yǔ)句描述的是組合邏輯,即always語(yǔ)句不帶有時(shí)鐘信號(hào),則該寄存器變量對(duì)應(yīng)為硬件連線;
寄存器類(lèi)型的缺省值是x(未知狀態(tài))。
寄存器數(shù)據(jù)類(lèi)型有很多種,如reg、integer、real等,其中最常用的就是reg類(lèi)型,它的使用方法如下:
? ? ? ? ? ? //reg define
? ? ? ? ? ? reg [31:0] delay_cnt;? ?//延時(shí)計(jì)數(shù)器
? ? ? ? ? ? reg key_flag ;? ? ? ? ?//按鍵標(biāo)志
線網(wǎng)類(lèi)型
線網(wǎng)表示Verilog結(jié)構(gòu)化元件間的物理連線。它的值由驅(qū)動(dòng)元件的值決定,例如連續(xù)賦值或門(mén)的輸出。如果沒(méi)有驅(qū)動(dòng)元件連接到線網(wǎng),線網(wǎng)的缺省值為z(高阻態(tài))。線網(wǎng)類(lèi)型同寄存器類(lèi)型一樣也是有很多種,如tri和wire等,其中最常用的就是wire類(lèi)型,它的使用方法如下:
? ? ? ? //wire define
? ? ? ? wire data_en;? ? ? ?//數(shù)據(jù)使能信號(hào)
? ? ? ? wire [7:0] data ;? ?//數(shù)據(jù)
參數(shù)類(lèi)型
參數(shù)類(lèi)型其實(shí)就是一個(gè)常量,常被用于定義狀態(tài)機(jī)的狀態(tài)、數(shù)據(jù)位寬和延遲大小等,由于它可以在編譯時(shí)修改參數(shù)的值,因此它又常被用于一些參數(shù)可調(diào)的模塊中,使用戶(hù)在實(shí)例化模塊時(shí),可以根據(jù)需要配置參數(shù)。在定義參數(shù)時(shí),我們可以一次定義多個(gè)參數(shù),參數(shù)與參數(shù)之間需要用逗號(hào)隔開(kāi)。這里我們需要注意的是參數(shù)的定義是局部的,只在當(dāng)前模塊中有效。它的使用方法如下:
? ? ? ? ? ? //parameter define
? ? ? ? ? ? parameter DATA_WIDTH = 8; //數(shù)據(jù)位寬為8位
Verilog的運(yùn)算符
大家看完了Verilog的數(shù)據(jù)類(lèi)型,我們?cè)賮?lái)介紹下Verilog的運(yùn)算符。Verilog中的運(yùn)算符按照功能可以分為下述類(lèi)型:1、算術(shù)運(yùn)算符、 2、關(guān)系運(yùn)算符、3、邏輯運(yùn)算符、 4、條件運(yùn)算符、 5、位運(yùn)算符、 6、移位運(yùn)算符、 7、拼接運(yùn)算符。下面我們分別對(duì)這些運(yùn)算符進(jìn)行介紹。
算術(shù)運(yùn)算符
算術(shù)運(yùn)算符,簡(jiǎn)單來(lái)說(shuō),就是數(shù)學(xué)運(yùn)算里面的加減乘除,數(shù)字邏輯處理有時(shí)候也需要進(jìn)行數(shù)字運(yùn)算,所以需要算術(shù)運(yùn)算符。常用的算術(shù)運(yùn)算符主要包括加減乘除和模除(模除運(yùn)算也叫取余運(yùn)算)如表 所示:
需要注意的是,Verilog實(shí)現(xiàn)除法與模除比較浪費(fèi)組合邏輯資源,尤其是除法。一般2的指數(shù)次冪的乘除法使用移位運(yùn)算來(lái)完成運(yùn)算,詳情可以看移位運(yùn)算符章節(jié)。非2的指數(shù)次冪的乘除法一般是調(diào)用現(xiàn)成的IP,QUARTUS/ISE等工具軟件會(huì)有提供,不過(guò)這些工具軟件提供的IP也是由最底層的組合邏輯(與或非門(mén)等)搭建而成的。
關(guān)系運(yùn)算符
關(guān)系運(yùn)算符主要是用來(lái)做一些條件判斷用的,在進(jìn)行關(guān)系運(yùn)算符時(shí),如果聲明的關(guān)系是假的,則返回值是0,如果聲明的關(guān)系是真的,則返回值是1;所有的關(guān)系運(yùn)算符有著相同的優(yōu)先級(jí)別,關(guān)系運(yùn)算符的優(yōu)先級(jí)別低于算術(shù)運(yùn)算符的優(yōu)先級(jí)別如表所示。
邏輯運(yùn)算符
邏輯運(yùn)算符是連接多個(gè)關(guān)系表達(dá)式用的,可實(shí)現(xiàn)更加復(fù)雜的判斷,一般不單獨(dú)使用,都需要配合具體語(yǔ)句來(lái)實(shí)現(xiàn)完整的意思。
條件運(yùn)算符
條件操作符一般來(lái)構(gòu)建從兩個(gè)輸入中選擇一個(gè)作為輸出的條件選擇結(jié)構(gòu),功能等同于always中的if-else語(yǔ)句。
如果a為真,則表達(dá)式的值為b,反之為c
位運(yùn)算符
位運(yùn)算符是一類(lèi)最基本的運(yùn)算符,可以認(rèn)為它們直接對(duì)應(yīng)數(shù)字邏輯中的與、或、非門(mén)等邏輯門(mén)。位運(yùn)算符的與、或、非與邏輯運(yùn)算符邏輯與、邏輯或、邏輯非使用時(shí)候容易混淆,邏輯運(yùn)算符一般用在條件判斷上,位運(yùn)算符一般用在信號(hào)賦值上。
移位運(yùn)算符
移位運(yùn)算符包括左移位運(yùn)算符和右移位運(yùn)算符,這兩種移位運(yùn)算符都用0來(lái)填補(bǔ)移出的空位。
假設(shè)a有8bit數(shù)據(jù)位寬,那么a<<2,表示a左移2bit,a還是8bit數(shù)據(jù)位寬,a的最高2bit數(shù)據(jù)被移位丟棄了,最低2bit數(shù)據(jù)固定補(bǔ)0。如果a是3(二進(jìn)制:00000011),那么3左移2bit,3<<2,就是12(二進(jìn)制:00001100)。一般使用左移位運(yùn)算代替乘法,右移位運(yùn)算代替除法,但是這種也只能表示2的指數(shù)次冪的乘除法。
拼接運(yùn)算符
Verilog中有一個(gè)特殊的運(yùn)算符是C語(yǔ)言中沒(méi)有的,就是位拼接運(yùn)算符。用這個(gè)運(yùn)算符可以把兩個(gè)或多個(gè)信號(hào)的某些位拼接起來(lái)進(jìn)行運(yùn)算操作。
將a與b拼接起來(lái),作為一個(gè)新的信號(hào)
運(yùn)算符的優(yōu)先級(jí)
介紹完了這么多運(yùn)算符,大家可能會(huì)想到究竟哪個(gè)運(yùn)算符高,哪個(gè)運(yùn)算符低。為了便于大家查看這些運(yùn)算符的優(yōu)先級(jí),我們將它們制作成了表格。
具體還可以參考這個(gè)表格,是我在培訓(xùn)中完善的表格,不過(guò)實(shí)際應(yīng)用中,為避免優(yōu)先級(jí)錯(cuò)誤,可多加括號(hào):
Verilog的常用關(guān)鍵字
關(guān)鍵字
注意只有小寫(xiě)的關(guān)鍵字才是保留字。例如,標(biāo)識(shí)符always(這是個(gè)關(guān)鍵詞)與標(biāo)識(shí)符ALWAYS(非關(guān)鍵詞)是不同的。?
Verilog的高級(jí)知識(shí)點(diǎn)
阻塞賦值和非阻塞賦值
在Verilog中有兩種類(lèi)型的賦值語(yǔ)句:阻塞賦值語(yǔ)句(“=”)和非阻塞賦值語(yǔ)句(“<=”)。正確地使用這兩種賦值語(yǔ)句對(duì)于Verilog的設(shè)計(jì)和仿真非常重要。
Verilog語(yǔ)言中講的阻塞賦值與非阻塞賦值,但從字面意思來(lái)看,阻塞就是執(zhí)行的時(shí)候在某個(gè)地方卡住了,等這個(gè)操作執(zhí)行完在繼續(xù)執(zhí)行下面的語(yǔ)句,而非阻塞就是不管執(zhí)行完沒(méi)有,我不管執(zhí)行的結(jié)果是什么,反正我繼續(xù)下面的事情。而Verilog中的阻塞賦值與非阻塞賦值正好也是這個(gè)意思,通過(guò)執(zhí)行一個(gè)例子,就可以簡(jiǎn)單地明白了:
1、阻塞賦值可以理解為語(yǔ)句的順序執(zhí)行,因此語(yǔ)句的執(zhí)行順序很重要;
2、非阻塞賦值可以理解為語(yǔ)句的并行執(zhí)行,所以語(yǔ)句的執(zhí)行不考慮順序;
3、在assign的結(jié)構(gòu)中,必須使用的是阻塞賦值。
也就是說(shuō):
? ? ? 阻塞:在本語(yǔ)句中“右式計(jì)算”和“左式更新”完全完成之后,才開(kāi)始執(zhí)行下一條語(yǔ)句;
? ? ? 非阻塞:當(dāng)前語(yǔ)句的執(zhí)行不會(huì)阻塞下一語(yǔ)句的執(zhí)行。
阻塞語(yǔ)句的時(shí)序:(串行)
非阻塞語(yǔ)句的時(shí)序(并行)
阻塞語(yǔ)句的使用
(1)在時(shí)序邏輯電路中一般使用非阻塞賦值。
? ? ?非阻塞賦值在塊結(jié)束后才完成賦值操作,此賦值方式可以避免在仿真出現(xiàn)冒險(xiǎn)和競(jìng)爭(zhēng)現(xiàn)象。
(2)在組合邏輯電路中一般使用阻塞賦值。
? ? ?使用阻塞方式對(duì)一個(gè)變量進(jìn)行賦值時(shí),此變量的值在在賦值語(yǔ)句執(zhí)行完后就立即改變。
(3)在assign語(yǔ)句中必須使用阻塞賦值語(yǔ)句。
assign和always區(qū)別?
assign語(yǔ)句和always語(yǔ)句是Verilog中的兩個(gè)基本語(yǔ)句,這兩個(gè)都是經(jīng)常使用的語(yǔ)句。
assign語(yǔ)句使用時(shí)不能帶時(shí)鐘。always語(yǔ)句可以帶時(shí)鐘,也可以不帶時(shí)鐘。在always不帶時(shí)鐘時(shí),邏輯功能和assign完全一致,都是只產(chǎn)生組合邏輯。比較簡(jiǎn)單的組合邏輯推薦使用assign語(yǔ)句,比較復(fù)雜的組合邏輯推薦使用always語(yǔ)句。示例如下:
什么是latch?
latch是指鎖存器,是一種對(duì)脈沖電平敏感的存儲(chǔ)單元電路。鎖存器和寄存器都是基本存儲(chǔ)單元。
鎖存器是電平觸發(fā)的存儲(chǔ)器,是組合邏輯產(chǎn)生的。
寄存器是邊沿觸發(fā)的存儲(chǔ)器,是在時(shí)序電路中使用,由時(shí)鐘觸發(fā)產(chǎn)生的。
latch的主要危害的是會(huì)產(chǎn)生毛刺(glitch),這種毛刺對(duì)下一級(jí)電路是很危險(xiǎn)的。并且其隱蔽性很強(qiáng),不易查出。因此,在設(shè)計(jì)中,應(yīng)盡量避免latch的使用。
出現(xiàn)latch的原因:代碼里面出現(xiàn)latch的兩個(gè)原因是在組合邏輯中,if或者case語(yǔ)句不完整的描述,比如if缺少else分支,case缺少default分支,導(dǎo)致代碼在綜合過(guò)程中出現(xiàn)了latch。
解決辦法就是if必須帶else分支,case必須帶default分支。
大家需要注意下,只有不帶時(shí)鐘的always語(yǔ)句if或者case語(yǔ)句不完整才會(huì)產(chǎn)生latch,帶時(shí)鐘的語(yǔ)句if或者case語(yǔ)句不完整描述不會(huì)產(chǎn)生latch。下面為缺少else分支的帶時(shí)鐘的always語(yǔ)句和不帶時(shí)鐘的always語(yǔ)句,通過(guò)實(shí)際產(chǎn)生的電路圖可以看到第二個(gè)是有一個(gè)latch的,第一個(gè)仍然是普通的帶有時(shí)鐘的寄存器。
狀態(tài)機(jī)
Verilog是硬件描述語(yǔ)言,硬件電路是并行執(zhí)行的,當(dāng)需要按照流程或者步驟來(lái)完成某個(gè)功能時(shí),代碼中通常會(huì)使用很多個(gè)if嵌套語(yǔ)句來(lái)實(shí)現(xiàn),這樣就增加了代碼的復(fù)雜度,以及降低了代碼的可讀性,這個(gè)時(shí)候就可以使用狀態(tài)機(jī)來(lái)編寫(xiě)代碼。狀態(tài)機(jī)相當(dāng)于一個(gè)控制器,它將一項(xiàng)功能的完成分解為若干步,每一步對(duì)應(yīng)于二進(jìn)制的一個(gè)狀態(tài),通過(guò)預(yù)先設(shè)計(jì)的順序在各狀態(tài)之間進(jìn)行轉(zhuǎn)換,狀態(tài)轉(zhuǎn)換的過(guò)程就是實(shí)現(xiàn)邏輯功能的過(guò)程。
狀態(tài)機(jī),全稱(chēng)是有限狀態(tài)機(jī)(Finite State Machine,縮寫(xiě)為FSM),是一種在有限個(gè)狀態(tài)之間按一定規(guī)律轉(zhuǎn)換的時(shí)序電路,可以認(rèn)為是組合邏輯和時(shí)序邏輯的一種組合。狀態(tài)機(jī)通過(guò)控制各個(gè)狀態(tài)的跳轉(zhuǎn)來(lái)控制流程,使得整個(gè)代碼看上去更加清晰易懂,在控制復(fù)雜流程的時(shí)候,狀態(tài)機(jī)優(yōu)勢(shì)明顯,因此基本上都會(huì)用到狀態(tài)機(jī),如SDRAM控制器等。
根據(jù)狀態(tài)機(jī)的輸出是否與輸入條件相關(guān),可將狀態(tài)機(jī)分為兩大類(lèi),即摩爾(Moore)型狀態(tài)機(jī)和米勒(Mealy)型狀態(tài)機(jī)。
? Mealy狀態(tài)機(jī):組合邏輯的輸出不僅取決于當(dāng)前狀態(tài),還取決于輸入狀態(tài)。
Moore狀態(tài)機(jī):組合邏輯的輸出只取決于當(dāng)前狀態(tài)。
三段式狀態(tài)機(jī)
根據(jù)狀態(tài)機(jī)的實(shí)際寫(xiě)法,狀態(tài)機(jī)還可以分為一段式、二段式和三段式狀態(tài)機(jī)。
一段式:整個(gè)狀態(tài)機(jī)寫(xiě)到一個(gè)always模塊里面,在該模塊中既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入和輸出。不推薦采用這種狀態(tài)機(jī),因?yàn)閺拇a風(fēng)格方面來(lái)講,一般都會(huì)要求把組合邏輯和時(shí)序邏輯分開(kāi);從代碼維護(hù)和升級(jí)來(lái)說(shuō),組合邏輯和時(shí)序邏輯混合在一起不利于代碼維護(hù)和修改,也不利于約束。
二段式:用兩個(gè)always模塊來(lái)描述狀態(tài)機(jī),其中一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;另一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律以及輸出。不同于一段式狀態(tài)機(jī)的是,它需要定義兩個(gè)狀態(tài),現(xiàn)態(tài)和次態(tài),然后通過(guò)現(xiàn)態(tài)和次態(tài)的轉(zhuǎn)換來(lái)實(shí)現(xiàn)時(shí)序邏輯。
三段式:在兩個(gè)always模塊描述方法基礎(chǔ)上,使用三個(gè)always模塊,一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,一個(gè)always采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律,另一個(gè)always模塊描述狀態(tài)輸出(可以用組合電路輸出,也可以時(shí)序電路輸出)
推薦使用三段式狀態(tài)機(jī)
實(shí)際應(yīng)用中三段式狀態(tài)機(jī)使用最多,因?yàn)槿问綘顟B(tài)機(jī)將組合邏輯和時(shí)序分開(kāi),有利于綜合器分析優(yōu)化以及程序的維護(hù);
并且三段式狀態(tài)機(jī)將狀態(tài)轉(zhuǎn)移與狀態(tài)輸出分開(kāi),使代碼看上去更加清晰易懂,提高了代碼的可讀性,推薦大家使用三段式狀態(tài)機(jī),本文也著重講解三段式。
三段式狀態(tài)機(jī)的基本格式是:
第一個(gè)always語(yǔ)句實(shí)現(xiàn)同步狀態(tài)跳轉(zhuǎn);
第二個(gè)always語(yǔ)句采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件;
第三個(gè)always語(yǔ)句描述狀態(tài)輸出(可以用組合電路輸出,也可以時(shí)序電路輸出)。
在開(kāi)始編寫(xiě)狀態(tài)機(jī)代碼之前,一般先畫(huà)出狀態(tài)跳轉(zhuǎn)圖,這樣在編寫(xiě)代碼時(shí)思路會(huì)比較清晰,下面以一個(gè)7分頻為例(對(duì)于分頻等較簡(jiǎn)單的功能,可以不使用狀態(tài)機(jī),這里只是演示狀態(tài)機(jī)編寫(xiě)的方法),狀態(tài)跳轉(zhuǎn)圖如下圖所示。
這里是使用獨(dú)熱碼的方式來(lái)定義狀態(tài)機(jī),每個(gè)狀態(tài)只有一位為1,當(dāng)然也可以直接定義成十進(jìn)制的0,1,2……7。
因?yàn)槲覀兌x成獨(dú)熱碼的方式,每一個(gè)狀態(tài)的位寬為7位,接下來(lái)還需要定義兩個(gè)7位的寄存器,一個(gè)用來(lái)表示當(dāng)前狀態(tài),另一個(gè)用來(lái)表示下一個(gè)狀態(tài);
parameter S0 = 7'b0000001; //獨(dú)熱碼定義方式
parameter S1 = 7'b0000010;
parameter S2 = 7'b0000100;
parameter S3 = 7'b0001000;
parameter S4 = 7'b0010000;
parameter S5 = 7'b0100000;
parameter S6 = 7'b1000000;
reg [6:0] curr_st ; //當(dāng)前狀態(tài)
reg [6:0] nextst ; //下一個(gè)狀態(tài)
接下來(lái)就可以使用三個(gè)always語(yǔ)句來(lái)開(kāi)始編寫(xiě)狀態(tài)機(jī)的代碼,第一個(gè)always采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;
第二個(gè)always采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件;
第三個(gè)always是描述狀態(tài)輸出;
? ? ??
評(píng)論