




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(一)練習(xí)一簡(jiǎn)單的組合邏輯設(shè)計(jì) 目的:掌握基本組合邏輯電路的實(shí)現(xiàn)方法。 這是一個(gè)可綜合的數(shù)據(jù)比較器,很容易看出它的功能是比較數(shù)據(jù)a與數(shù)據(jù)b,如果兩個(gè)數(shù)據(jù)相同,則給出結(jié)果1,否則給出結(jié)果0。在Verilog HDL中,描述組合邏輯時(shí)常使用assign結(jié)構(gòu)。注意equal=(a=b)?1:0,這是一種在組合邏輯實(shí)現(xiàn)分支判斷時(shí)常使用的格式。模塊源代碼:/- compare.v -module compare(equal,a,b);input a,b;output equal; assign equal=(a=b)?1:0; /a等于b時(shí),equal輸出為1;a不等于
2、b時(shí), /equal輸出為0。endmodule 測(cè)試模塊用于檢測(cè)模塊設(shè)計(jì)得正確與否,它給出模塊的輸入信號(hào),觀察模塊的內(nèi)部信號(hào)和輸出信號(hào),如果發(fā)現(xiàn)結(jié)果與預(yù)期的有所偏差,則要對(duì)設(shè)計(jì)模塊進(jìn)行修改。 測(cè)試模塊源代碼:timescale 1ns/1ns /定義時(shí)間單位。include "./compare.v" /包含模塊文件。在有的仿真調(diào)試環(huán)境中并不需要此語(yǔ)句。 /而需要從調(diào)試環(huán)境的菜單中鍵入有關(guān)模塊文件的路徑和名稱module comparetest; reg a,b; wire equal; initial /initial常用于仿真時(shí)信號(hào)的給出。 begin a=0; b=
3、0; #100 a=0; b=1; #100 a=1; b=1; #100 a=1; b=0; #100 $stop; /系統(tǒng)任務(wù),暫停仿真以便觀察仿真波形。 end compare compare1(.equal(equal),.a(a),.b(b); /調(diào)用模塊。 endmodule 仿真波形(部分):練習(xí):設(shè)計(jì)一個(gè)字節(jié)(8位)比較器。要求:比較兩個(gè)字節(jié)的大小,如a7:0大于 b7:0輸出高電平,否則輸出低電平,改寫(xiě)測(cè)試模型,使其能進(jìn)行比較全面的測(cè)試。Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(二)練習(xí)二、簡(jiǎn)單時(shí)序邏輯電路的設(shè)計(jì)目的:掌握基本時(shí)序邏輯電路的實(shí)現(xiàn) </></>
4、</></> </></></> 在Verilog HDL中,相對(duì)于組合邏輯電路,時(shí)序邏輯電路也有規(guī)定的表述方式。在可綜合的Verilog HDL模型,我們通常使用always塊和 (posedge clk)或 (negedge clk)的結(jié)構(gòu)來(lái)表述時(shí)序邏輯。下面是一個(gè)1/2分頻器的可綜合模型。 / half_clk.v:module half_clk(reset,clk_in,clk_out);input clk_in,reset;output clk_out;reg clk_out;always (posedge clk_in)
5、begin if(!reset) clk_out=0; else clk_out=clk_out; endendmodule 在always塊中,被賦值的信號(hào)都必須定義為reg型,這是由時(shí)序邏輯電路的特點(diǎn)所決定的。對(duì)于reg型數(shù)據(jù),如果未對(duì)它進(jìn)行賦值,仿真工具會(huì)認(rèn)為它是不定態(tài)。為了能正確地觀察到仿真結(jié)果,在可綜合風(fēng)格的模塊中我們通常定義一個(gè)復(fù)位信號(hào)reset,當(dāng)reset為低電平時(shí),對(duì)電路中的寄存器進(jìn)行復(fù)位。 測(cè)試模塊的源代碼:/- clk_Top.v -timescale 1ns/100psdefine clk_cycle 50module clk_Top.vreg clk,reset;wi
6、re clk_out;always #clk_cycle clk = clk;initial begin clk = 0; reset = 1; #100 reset = 0; #100 reset = 1;#10000 $stop; endhalf_clk half_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out);endmodule仿真波形: </></></>練習(xí):依然作clk_in的二分頻clk_out,要求輸出與上例的輸出正好反相。編寫(xiě)測(cè)試模塊,給出仿真波形Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(三)&l
7、t;/></></></>練習(xí)三. 利用條件語(yǔ)句實(shí)現(xiàn)較復(fù)雜的時(shí)序邏輯電路目的:掌握條件語(yǔ)句在Verilog HDL中的使用。 與常用的高級(jí)程序語(yǔ)言一樣,為了描述較為復(fù)雜的時(shí)序關(guān)系,Verilog HDL提供了條件語(yǔ)句供分支判斷時(shí)使用。在可綜合風(fēng)格的Verilog HDL模型中常用的條件語(yǔ)句有ifelse和caseendcase兩種結(jié)構(gòu),用法和C程序語(yǔ)言中類似。兩者相較,ifelse用于不很復(fù)雜的分支關(guān)系,實(shí)際編寫(xiě)可綜合風(fēng)格的模塊、特別是用狀態(tài)機(jī)構(gòu)成的模塊時(shí),更常用的是caseendcase風(fēng)格的代碼。這一節(jié)我們給的是有關(guān)ifelse的范例,有關(guān)case
8、endcase結(jié)構(gòu)的代碼已后會(huì)經(jīng)常用到。 下面給出的范例也是一個(gè)可綜合風(fēng)格的分頻器,是將10M的時(shí)鐘分頻為500K的時(shí)鐘。基本原理與1/2分頻器是一樣的,但是需要定義一個(gè)計(jì)數(shù)器,以便準(zhǔn)確獲得1/20分頻 模塊源代碼:/ - fdivision.v -module fdivision(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg 7:0j; always (posedge F10M) if(!RESET) /低電平復(fù)位。 begin F500K <= 0; j <= 0; end else begin if
9、(j=19) /對(duì)計(jì)數(shù)器進(jìn)行判斷,以確定F500K信號(hào)是否反轉(zhuǎn)。 begin j <= 0; F500K <= F500K; end else j <= j+1; endendmodule 測(cè)試模塊源代碼:/- fdivision_Top.v -timescale 1ns/100psdefine clk_cycle 50module division_Top;reg F10M_clk,RESET;wire F500K_clk;always #clk_cycle F10M_clk = F10M_clk;initial beginRESET=1;F10M=0;#100 RESET
10、=0;#100 RESET=1;#10000 $stop; endfdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk);endmodule 仿真波形: 練習(xí):利用10M的時(shí)鐘,設(shè)計(jì)一個(gè)單周期形狀如下的周期波形。 Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(四)</></></></>練習(xí)四. 設(shè)計(jì)時(shí)序邏輯時(shí)采用阻塞賦值與非阻塞賦值的區(qū)別目的:1.明確掌握阻塞賦值與非阻塞賦值的概念和區(qū)別; 2.了解阻塞賦值的使用情況。 阻塞賦值與非阻塞賦值,在教材中我們已經(jīng)了解了它們之間在
11、語(yǔ)法上的區(qū)別以及綜合后所得到的電路結(jié)構(gòu)上的區(qū)別。在always塊中,阻塞賦值可以理解為賦值語(yǔ)句是順序執(zhí)行的,而非阻塞賦值可以理解為賦值語(yǔ)句是并發(fā)執(zhí)行的。實(shí)際的時(shí)序邏輯設(shè)計(jì)中,一般的情況下非阻塞賦值語(yǔ)句被更多地使用,有時(shí)為了在同一周期實(shí)現(xiàn)相互關(guān)聯(lián)的操作,也使用了阻塞賦值語(yǔ)句。(注意:在實(shí)現(xiàn)組合邏輯的assign結(jié)構(gòu)中,無(wú)一例外地都必須采用阻塞賦值語(yǔ)句。 下例通過(guò)分別采用阻塞賦值語(yǔ)句和非阻塞賦值語(yǔ)句的兩個(gè)看上去非常相似的兩個(gè)模塊blocking.v和non_blocking.v來(lái)闡明兩者之間的區(qū)別。 模塊源代碼:/ - blocking.v -module blocking(clk,a,b,c);
12、 output 3:0 b,c; input 3:0 a; input clk; reg 3:0 b,c; always (posedge clk) begin b = a; c = b; $display("Blocking: a = %d, b = %d, c = %d.",a,b,c); endendmodule /- non_blocking.v -module non_blocking(clk,a,b,c); output 3:0 b,c; input 3:0 a; input clk; reg 3:0 b,c; always (posedge clk) begi
13、n b <= a; c <= b; $display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c); endendmodule 測(cè)試模塊源代碼:/- compareTop.v - timescale 1ns/100psinclude "./blocking.v"include "./non_blocking.v"module compareTop; wire 3:0 b1,c1,b2,c2; reg 3:0 a; reg clk; initial begin clk = 0;
14、 forever #50 clk = clk; end initial begin a = 4'h3; $display("_"); # 100 a = 4'h7; $display("_"); # 100 a = 4'hf; $display("_"); # 100 a = 4'ha; $display("_"); # 100 a = 4'h2; $display("_"); # 100 $display("_"); $stop; e
15、nd non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);endmodule 仿真波形(部分): 思考:在blocking模塊中按如下寫(xiě)法,仿真與綜合的結(jié)果會(huì)有什么樣的變化?作出仿真 波形,分析綜合結(jié)果。 1 always (posedge clk) begin c = b; b = a; end 2. always (posedge clk) b=a; always (posedge clk) c=b; Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(五)</></></><
16、;/>練習(xí)五. 用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路目的: 1.掌握用always實(shí)現(xiàn)組合邏輯電路的方法; 2.了解assign與always兩種組合邏輯電路實(shí)現(xiàn)方法之間的區(qū)別。 僅使用assign結(jié)構(gòu)來(lái)實(shí)現(xiàn)組合邏輯電路,在設(shè)計(jì)中會(huì)發(fā)現(xiàn)很多地方會(huì)顯得冗長(zhǎng)且效率低下。而適當(dāng)?shù)夭捎胊lways來(lái)設(shè)計(jì)組合邏輯,往往會(huì)更具實(shí)效。已進(jìn)行的范例和練習(xí)中,我們僅在實(shí)現(xiàn)時(shí)序邏輯電路時(shí)使用always塊。從現(xiàn)在開(kāi)始,我們對(duì)它的看法要稍稍改變。 下面是一個(gè)簡(jiǎn)單的指令譯碼電路的設(shè)計(jì)示例。該電路通過(guò)對(duì)指令的判斷,對(duì)輸入數(shù)據(jù)執(zhí)行相應(yīng)的操作,包括加、減、與、或和求反,并且無(wú)論是指令作用的數(shù)據(jù)還是指令本身發(fā)生變化
17、,結(jié)果都要作出及時(shí)的反應(yīng)。顯然,這是一個(gè)較為復(fù)雜的組合邏輯電路,如果采用assign語(yǔ)句,表達(dá)起來(lái)非常復(fù)雜。示例中使用了電平敏感的always塊,所謂電平敏感的觸發(fā)條件是指在后的括號(hào)內(nèi)電平列表中的任何一個(gè)電平發(fā)生變化,(與時(shí)序邏輯不同,它在后的括號(hào)內(nèi)沒(méi)有沿敏感關(guān)鍵詞,如posedge 或negedge)就能觸發(fā)always塊的動(dòng)作,并且運(yùn)用了case結(jié)構(gòu)來(lái)進(jìn)行分支判斷,不但設(shè)計(jì)思想得到直觀的體現(xiàn),而且代碼看起來(lái)非常整齊、便于理解。 /- alu.v -define plus 3'd0define minus 3'd1define band 3'd2define bor
18、3'd3define unegate 3'd4module alu(out,opcode,a,b);output7:0 out;reg7:0 out;input2:0 opcode;input7:0 a,b; /操作數(shù)。 always(opcode or a or b) /電平敏感的always塊begin case(opcode) plus: out = a+b; /加操作。 minus: out = a-b; /減操作。 band: out = a&b; /求與。 bor: out = a|b; /求或。 unegate: out=a; /求反。 default:
19、out=8'hx;/未收到指令時(shí),輸出任意態(tài)。 endcaseendendmodule 同一組合邏輯電路分別用always塊和連續(xù)賦值語(yǔ)句assign描述時(shí),代碼的形式大相徑庭,但是在always中適當(dāng)運(yùn)用default(在case結(jié)構(gòu)中)和else(在ifelse結(jié)構(gòu)中),通??梢跃C合為純組合邏輯,盡管被賦值的變量一定要定義為reg型。不過(guò),如果不使用default或else對(duì)缺省項(xiàng)進(jìn)行說(shuō)明,則易生成意想不到的鎖存器,這一點(diǎn)一定要加以注意。 指令譯碼器的測(cè)試模塊源代碼:/- alu_Top.v -timescale 1ns/1nsinclude "./alu.v"
20、module alutest; wire7:0 out; reg7:0 a,b; reg2:0 opcode; parameter times=5; initial begin a=$random%256; /Give a radom number blongs to 0,255 . b=$random%256; /Give a radom number blongs to 0,255. opcode=3'h0; repeat(times) begin #100 a=$random%256; /Give a radom number. b=$random%256; /Give a ra
21、dom number. opcode=opcode+1; end #100 $stop; end alu alu1(out,opcode,a,b);endmodule 仿真波形(部分): 練習(xí):運(yùn)用always塊設(shè)計(jì)一個(gè)八路數(shù)據(jù)選擇器。要求:每路輸入數(shù)據(jù)與輸出數(shù)據(jù)均為4位2進(jìn)制數(shù),當(dāng)選擇開(kāi)關(guān)(至少3位)或輸入數(shù)據(jù)發(fā)生變化時(shí),輸出數(shù)據(jù)也相應(yīng)地變化。Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(六)</></></>練習(xí)六. 在Verilog HDL中使用函數(shù)目的:掌握函數(shù)在模塊設(shè)計(jì)中的使用。 與一般的程序設(shè)計(jì)語(yǔ)言一樣,Veirlog HDL也可使用函數(shù)以適應(yīng)對(duì)不同變量采
22、取同一運(yùn)算的操作。Veirlog HDL函數(shù)在綜合時(shí)被理解成具有獨(dú)立運(yùn)算功能的電路,每調(diào)用一次函數(shù)相當(dāng)于改變這部分電路的輸入以得到相應(yīng)的計(jì)算結(jié)果。 下例是函數(shù)調(diào)用的一個(gè)簡(jiǎn)單示范,采用同步時(shí)鐘觸發(fā)運(yùn)算的執(zhí)行,每個(gè)clk時(shí)鐘周期都會(huì)執(zhí)行一次運(yùn)算。并且在測(cè)試模塊中,通過(guò)調(diào)用系統(tǒng)任務(wù)$display在時(shí)鐘的下降沿顯示每次計(jì)算的結(jié)果。 模塊源代碼:module tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) /clk的上沿觸
23、發(fā)同步運(yùn)算。begin if(!reset) /reset為低時(shí)復(fù)位。 result<=0; else begin result <= n * factorial(n)/(n*2)+1); end end function 31:0 factorial; /函數(shù)定義。 input 3:0 operand; reg 3:0 index; begin factorial = operand ? 1 : 0; for(index = 2; index <= operand; index = index + 1) factorial = index * factorial; end
24、endfunctionendmodule 測(cè)試模塊源代碼:include "./step6.v"timescale 1ns/100psdefine clk_cycle 50module tryfuctTop;reg3:0 n,i;reg reset,clk;wire31:0 result;initial begin n=0; reset=1; clk=0; #100 reset=0; #100 reset=1; for(i=0;i<=15;i=i+1) begin #200 n=i; end #100 $stop; endalways #clk_cycle clk=c
25、lk;tryfunct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset);endmodule 上例中函數(shù)factorial(n)實(shí)際上就是階乘運(yùn)算。必須提醒大家注意的是,在實(shí)際的設(shè)計(jì)中,我們不希望設(shè)計(jì)中的運(yùn)算過(guò)于復(fù)雜,以免在綜合后帶來(lái)不可預(yù)測(cè)的后果。經(jīng)常的情況是,我們把復(fù)雜的運(yùn)算分成幾個(gè)步驟,分別在不同的時(shí)鐘周期完成。 仿真波形(部分): 練習(xí):設(shè)計(jì)一個(gè)帶控制端的邏輯運(yùn)算電路,分別完成正整數(shù)的平方、立方和階乘的運(yùn)算。編寫(xiě)測(cè)試模塊,并給出仿真波形。Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(七)</></></&g
26、t;</>練習(xí)七. 在Verilog HDL中使用任務(wù)(task)目的:掌握任務(wù)在結(jié)構(gòu)化Verilog HDL設(shè)計(jì)中的應(yīng)用。 僅有函數(shù)并不能完全滿足Veirlog HDL中的運(yùn)算需求。當(dāng)我們希望能夠?qū)⒁恍┬盘?hào)進(jìn)行運(yùn)算并輸出多個(gè)結(jié)果時(shí),采用函數(shù)結(jié)構(gòu)就顯得非常不方便,而任務(wù)結(jié)構(gòu)在這方面的優(yōu)勢(shì)則十分突出。任務(wù)本身并不返回計(jì)算值,但是它通過(guò)類似C語(yǔ)言中形參與實(shí)參的數(shù)據(jù)交換,非??旖莸貙?shí)現(xiàn)運(yùn)算結(jié)果的調(diào)用。此外,我們還常常利用任務(wù)來(lái)幫助我們實(shí)現(xiàn)結(jié)構(gòu)化的模塊設(shè)計(jì),將批量的操作以任務(wù)的形式獨(dú)立出來(lái),這樣設(shè)計(jì)的目的通常一眼看過(guò)去就很明了。 下面是一個(gè)利用task和電平敏感的always塊設(shè)計(jì)比較后重
27、組信號(hào)的組合邏輯的實(shí)例??梢钥吹?,利用task非常方便地實(shí)現(xiàn)了數(shù)據(jù)之間的交換,如果要用函數(shù)實(shí)現(xiàn)相同的功能是非常復(fù)雜的;另外,task也避免了直接用一般語(yǔ)句來(lái)描述所引起的不易理解和綜合時(shí)產(chǎn)生冗余邏輯等問(wèn)題。 模塊源代碼:/- sort4.v -module sort4(ra,rb,rc,rd,a,b,c,d); output3:0 ra,rb,rc,rd; input3:0 a,b,c,d; reg3:0 ra,rb,rc,rd; reg3:0 va,vb,vc,vd; always (a or b or c or d) begin va,vb,vc,vd=a,b,c,d; sort2(va,v
28、c); /va 與vc互換。 sort2(vb,vd); /vb 與vd互換。 sort2(va,vb); /va 與vb互換。 sort2(vc,vd); /vc 與vd互換。 sort2(vb,vc); /vb 與vc互換。 ra,rb,rc,rd=va,vb,vc,vd; end task sort2; inout3:0 x,y; reg3:0 tmp; if(x>y) begin tmp=x; /x與y變量的內(nèi)容互換,要求順序執(zhí)行,所以采用阻塞賦值方式。 x=y; y=tmp; end endtaskendmodule 值得注意的是task中的變量定義與模塊中的變量定義不盡相同,
29、它們并不受輸入輸出類型的限制。如此例,x與y對(duì)于task sort2來(lái)說(shuō)雖然是inout型,但實(shí)際上它們對(duì)應(yīng)的是always塊中變量,都是reg型變量。 測(cè)試模塊源代碼:timescale 1ns/100psinclude "sort4.v"module task_Top; reg3:0 a,b,c,d; wire3:0 ra,rb,rc,rd; initial begin a=0;b=0;c=0;d=0;repeat(5)begin #100 a =$random%15; b =$random%15; c =$random%15; d =$random%15;end #1
30、00 $stop;sort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd);endmodule 仿真波形(部分): 練習(xí):設(shè)計(jì)一個(gè)模塊,通過(guò)任務(wù)完成3個(gè)8位2進(jìn)制輸入數(shù)據(jù)的冒泡排序。要求:時(shí)鐘觸發(fā)任務(wù)的執(zhí)行,每個(gè)時(shí)鐘周期完成一次數(shù)據(jù)交換的操作。Verilog HDL設(shè)計(jì)練習(xí)進(jìn)階(八)</></></>練習(xí)八. 利用有限狀態(tài)機(jī)進(jìn)行復(fù)雜時(shí)序邏輯的設(shè)計(jì)目的:掌握利用有限狀態(tài)機(jī)實(shí)現(xiàn)復(fù)雜時(shí)序邏輯的方法; 在數(shù)字電路中我們已經(jīng)學(xué)習(xí)過(guò)通過(guò)建立有限狀態(tài)機(jī)來(lái)進(jìn)行數(shù)字邏輯的設(shè)計(jì),而在Verilog
31、 HDL硬件描述語(yǔ)言中,這種設(shè)計(jì)方法得到進(jìn)一步的發(fā)展。通過(guò)Verilog HDL提供的語(yǔ)句,我們可以直觀地設(shè)計(jì)出適合更為復(fù)雜的時(shí)序邏輯的電路。關(guān)于有限狀態(tài)機(jī)的設(shè)計(jì)方法在教材中已經(jīng)作了較為詳細(xì)的闡述,在此就不贅述了。 下例是一個(gè)簡(jiǎn)單的狀態(tài)機(jī)設(shè)計(jì),功能是檢測(cè)一個(gè)5位二進(jìn)制序列“10010”??紤]到序列重疊的可能,有限狀態(tài)機(jī)共提供8個(gè)狀態(tài)(包括初始狀態(tài)IDLE)。 模塊源代碼:seqdet.vmodule seqdet(x,z,clk,rst,state);input x,clk,rst;output z;output2:0 state;reg2:0 state;wire z; parameter
32、IDLE='d0, A='d1, B='d2, C='d3, D='d4, E='d5, F='d6, G='d7; assign z = ( state=E && x=0 )? 1 : 0; /當(dāng)x=0時(shí),狀態(tài)已變?yōu)镋, /狀態(tài)為D時(shí),x仍為1。因此 /輸出為1的條件為( state=E && x=0 )。always (posedge clk) if(!rst) begin state <= IDLE; end else casex(state) IDLE : if(x=1) begin
33、state <= A; end A: if(x=0) begin state <= B; end B: if(x=0) begin state <= C; end else begin state <= F; end C: if(x=1) begin state <= D; end else begin state <= G; end D: if(x=0) begin state <= E; end else begin state <= A; end E: if(x=0) begin state <= C; end else begin
34、state <= A; end F: if(x=1) begin state <= A; end else begin state <= B; end G: if(x=1) begin state <= F; end default:state=IDLE; /缺省狀態(tài)為初始狀態(tài)。 endcaseendmodule 測(cè)試模塊源代碼:/- seqdet.v -timescale 1ns/1nsinclude "./seqdet.v"module seqdet_Top; reg clk,rst; reg23:0 data; wire2:0 state; w
35、ire z,x; assign x=data23; always #10 clk = clk; always (posedge clk) data=data22:0,data23; initial begin clk=0; rst=1; #2 rst=0; #30 rst=1; data ='b1100_1001_0000_1001_0100; #500 $stop; end seqdet m(x,z,clk,rst,state);endmodule 仿真波形: 練習(xí):設(shè)計(jì)一個(gè)串行數(shù)據(jù)檢測(cè)器。要求是:連續(xù)4個(gè)或4個(gè)以上的1時(shí)輸出為1,其他輸入情況下為0。編寫(xiě)測(cè)試模塊并給出仿真波形。Ve
36、rilog HDL設(shè)計(jì)練習(xí)進(jìn)階(九)</></></>練習(xí)九.利用狀態(tài)機(jī)的嵌套實(shí)現(xiàn)層次結(jié)構(gòu)化設(shè)計(jì)目的:.運(yùn)用主狀態(tài)機(jī)與子狀態(tài)機(jī)產(chǎn)生層次化的邏輯設(shè)計(jì); .在結(jié)構(gòu)化設(shè)計(jì)中靈活使用任務(wù)(task)結(jié)構(gòu)。 在上一節(jié),我們學(xué)習(xí)了如何使用狀態(tài)機(jī)的實(shí)例。實(shí)際上,單個(gè)有限狀態(tài)機(jī)控制整個(gè)邏輯電路的運(yùn)轉(zhuǎn)在實(shí)際設(shè)計(jì)中是不多見(jiàn),往往是狀態(tài)機(jī)套用狀態(tài)機(jī),從而形成樹(shù)狀的控制核心。這一點(diǎn)也與我們提倡的層次化、結(jié)構(gòu)化的自頂而下的設(shè)計(jì)方法相符,下面我們就將提供一個(gè)這樣的示例以供大家學(xué)習(xí)。 該例是一個(gè)簡(jiǎn)化的EPROM的串行寫(xiě)入器。事實(shí)上,它是一個(gè)EPROM讀寫(xiě)器設(shè)計(jì)中實(shí)現(xiàn)寫(xiě)功能的部分經(jīng)刪節(jié)得到
37、的,去除了EPROM的啟動(dòng)、結(jié)束和EPROM控制字的寫(xiě)入等功能,只具備這樣一個(gè)雛形。工作的步驟是:.地址的串行寫(xiě)入;.數(shù)據(jù)的串行寫(xiě)入;3.給信號(hào)源應(yīng)答,信號(hào)源給出下一個(gè)操作對(duì)象;.結(jié)束寫(xiě)操作。通過(guò)移位令并行數(shù)據(jù)得以一位一位輸出。 模塊源代碼:module writing(reset,clk,address,data,sda,ack); input reset,clk; input7:0 data,address; output sda,ack;/sda負(fù)責(zé)串行數(shù)據(jù)輸出; /ack是一個(gè)對(duì)象操作完畢后,模塊給出的應(yīng)答信號(hào)。 reg link_write;/link_write 決定何時(shí)輸出。 r
38、eg3:0 state;/主狀態(tài)機(jī)的狀態(tài)字。 reg4:0 sh8out_state;/從狀態(tài)機(jī)的狀態(tài)字。 reg7:0 sh8out_buf; /輸入數(shù)據(jù)緩沖。 reg finish_F; /用以判斷是否處理完一個(gè)操作對(duì)象。 reg ack; parameter idle=0,addr_write=1,data_write=2,stop_ack=3; parameter bit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8; assign sda = link_write? sh8out_buf7 : 1'bz; always
39、 (posedge clk) begin if(!reset) /復(fù)位。 begin link_write<= 0; state <= idle; finish_F <= 0; sh8out_state<=idle; ack<= 0; sh8out_buf<=0; end else case(state) idle: begin link_write <= 0; state <= idle; finish_F <= 0; sh8out_state<=idle; ack<= 0; sh8out_buf<=address; s
40、tate <= addr_write; end addr_write: /地址的輸入。 begin if(finish_F=0) begin shift8_out; end else begin sh8out_state <= idle; sh8out_buf <= data; state <= data_write; finish_F <= 0; end end data_write: /數(shù)據(jù)的寫(xiě)入。 begin if(finish_F=0) begin shift8_out; end else begin link_write <= 0; state &
41、lt;= stop_ack; finish_F <= 0; ack <= 1; end end stop_ack: /完成應(yīng)答。 begin ack <= 0; state <= idle; end endcase end task shift8_out; /串行寫(xiě)入。 begin case(sh8out_state) idle: begin link_write <= 1; sh8out_state <= bit0; end bit0: begin link_write <= 1; sh8out_state <= bit1; sh8out_bu
42、f <= sh8out_buf<<1; end bit1: begin sh8out_state<=bit2; sh8out_buf<=sh8out_buf<<1; end bit2: begin sh8out_state<=bit3; sh8out_buf<=sh8out_buf<<1; end bit3: begin sh8out_state<=bit4; sh8out_buf<=sh8out_buf<<1; end bit4: begin sh8out_state<=bit5; sh8out_buf<=sh8out_buf<<1; end bi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)用制氧機(jī)安裝合同范本
- 代購(gòu)車子合同范本
- 單位綠化施工合同范本
- 鄉(xiāng)下老屋轉(zhuǎn)讓合同范本
- 南京勞動(dòng)合同范本2008
- 雙包單包合同范例
- 修理公司轉(zhuǎn)讓合同范本
- 劇組小演員合同范本
- 我國(guó)大麥進(jìn)口效率及潛力研究
- 九年級(jí)學(xué)生數(shù)學(xué)應(yīng)用意識(shí)的現(xiàn)狀調(diào)查研究
- 2025年安全員C證(專職安全員)考試題庫(kù)
- 地理-天一大聯(lián)考2025屆高三四省聯(lián)考(陜晉青寧)試題和解析
- 醫(yī)療衛(wèi)生系統(tǒng)招聘考試(中醫(yī)學(xué)專業(yè)知識(shí))題庫(kù)及答案
- 貴州省貴陽(yáng)市2024-2025學(xué)年九年級(jí)上學(xué)期期末語(yǔ)文試題(含答案)
- 小巴掌童話課件
- 教科版六年級(jí)科學(xué)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)教案
- 部編版小學(xué)五年級(jí)下冊(cè)《道德與法治》全冊(cè)教案含教學(xué)計(jì)劃
- 2024年青島遠(yuǎn)洋船員職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2024建筑施工安全生產(chǎn)隱患識(shí)別圖合集
- 2025年江蘇南京技師學(xué)院招聘工作人員19人高頻重點(diǎn)提升(共500題)附帶答案詳解
評(píng)論
0/150
提交評(píng)論