版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上設(shè)計練習(xí)進(jìn)階前言:在前面九章學(xué)習(xí)的基礎(chǔ)上, 通過本章十個階段的練習(xí),一定能逐步掌握Verilog HDL設(shè)計的要點。我們可以先理解樣板模塊中每一條語句的作用,然后對樣板模塊進(jìn)行綜合前和綜合后仿真,再獨立完成每一階段規(guī)定的練習(xí)。當(dāng)十個階段的練習(xí)做完后,便可以開始設(shè)計一些簡單的邏輯電路和系統(tǒng)。很快我們就能過渡到設(shè)計相當(dāng)復(fù)雜的數(shù)字邏輯系統(tǒng)。當(dāng)然,復(fù)雜的數(shù)字邏輯系統(tǒng)的設(shè)計和驗證,不但需要系統(tǒng)結(jié)構(gòu)的知識和經(jīng)驗的積累,還需要了解更多的語法現(xiàn)象和掌握高級的Verilog HDL系統(tǒng)任務(wù),以及與C語言模塊接口的方法(即PLI),這些已超出的本書的范圍。有興趣的同學(xué)可以閱讀Verilo
2、g語法參考資料和有關(guān)文獻(xiàn),自己學(xué)習(xí),我們將在下一本書中介紹Verilog較高級的用法。練習(xí)一簡單的組合邏輯設(shè)計 目的: 掌握基本組合邏輯電路的實現(xiàn)方法。 這是一個可綜合的數(shù)據(jù)比較器,很容易看出它的功能是比較數(shù)據(jù)a與數(shù)據(jù)b,如果兩個數(shù)據(jù)相同,則給出結(jié)果1,否則給出結(jié)果0。在Verilog HDL中,描述組合邏輯時常使用assign結(jié)構(gòu)。注意equal=(a=b)?1:0,這是一種在組合邏輯實現(xiàn)分支判斷時常使用的格式。模塊源代碼:/- compare.v -module compare(equal,a,b);input a,b;output equal; assign equal=(a=b)?1:
3、0; /a等于b時,equal輸出為1;a不等于b時, /equal輸出為0。endmodule 測試模塊用于檢測模塊設(shè)計得正確與否,它給出模塊的輸入信號,觀察模塊的內(nèi)部信號和輸出信號,如果發(fā)現(xiàn)結(jié)果與預(yù)期的有所偏差,則要對設(shè)計模塊進(jìn)行修改。 測試模塊源代碼:timescale 1ns/1ns /定義時間單位。include "./compare.v" /包含模塊文件。在有的仿真調(diào)試環(huán)境中并不需要此語句。 /而需要從調(diào)試環(huán)境的菜單中鍵入有關(guān)模塊文件的路徑和名稱module comparetest; reg a,b; wire equal; initial /initial常用
4、于仿真時信號的給出。 begin a=0; b=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è)計一個字節(jié)(8位)比較器。要求:比較兩個字節(jié)的大小,如a7:0大于 b7:0輸出高電平,否則輸出低電平,改寫測試模型,使其能進(jìn)行比較全面的測試 。練習(xí)二. 簡單時序邏輯電路的設(shè)計目的:掌握基本時序邏輯電路的實現(xiàn)。 在Verilog HD
5、L中,相對于組合邏輯電路,時序邏輯電路也有規(guī)定的表述方式。在可綜合的Verilog HDL模型,我們通常使用always塊和 (posedge clk)或 (negedge clk)的結(jié)構(gòu)來表述時序邏輯。下面是一個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) begin if(!reset) clk_out=0; else clk_out=clk_out; endendmo
6、dule在always塊中,被賦值的信號都必須定義為reg型,這是由時序邏輯電路的特點所決定的。對于reg型數(shù)據(jù),如果未對它進(jìn)行賦值,仿真工具會認(rèn)為它是不定態(tài)。為了能正確地觀察到仿真結(jié)果,在可綜合風(fēng)格的模塊中我們通常定義一個復(fù)位信號reset,當(dāng)reset為低電平時,對電路中的寄存器進(jìn)行復(fù)位。測試模塊的源代碼:/- clk_Top.v -timescale 1ns/100psdefine clk_cycle 50module clk_Top.vreg clk,reset;wire clk_out;always #clk_cycle clk = clk;initial begin clk = 0
7、; 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,要求輸出與上例的輸出正好反相。編寫測試模塊,給出仿真波形。練習(xí)三. 利用條件語句實現(xiàn)較復(fù)雜的時序邏輯電路目的:掌握條件語句在Verilog HDL中的使用。與常用的高級程序語言一樣,為了描述較為復(fù)雜的時序關(guān)系,Verilog HDL提供了條件語句供分支判斷時使用。在可綜合風(fēng)
8、格的Verilog HDL模型中常用的條件語句有ifelse和caseendcase兩種結(jié)構(gòu),用法和C程序語言中類似。兩者相較,ifelse用于不很復(fù)雜的分支關(guān)系,實際編寫可綜合風(fēng)格的模塊、特別是用狀態(tài)機(jī)構(gòu)成的模塊時,更常用的是caseendcase風(fēng)格的代碼。這一節(jié)我們給的是有關(guān)ifelse的范例,有關(guān)caseendcase結(jié)構(gòu)的代碼已后會經(jīng)常用到。下面給出的范例也是一個可綜合風(fēng)格的分頻器,是將10M的時鐘分頻為500K的時鐘?;驹砼c1/2分頻器是一樣的,但是需要定義一個計數(shù)器,以便準(zhǔn)確獲得1/20分頻模塊源代碼:/ - fdivision.v -module fdivision(RES
9、ET,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(j=19) /對計數(shù)器進(jìn)行判斷,以確定F500K信號是否反轉(zhuǎn)。 begin j <= 0; F500K <= F500K; end else j <= j+1; endendmodule測試模塊源代碼:/- fdivision_Top.v -timescale 1ns/
10、100psdefine clk_cycle 50module division_Top; reg F10M_clk,RESET;wire F500K_clk;always #clk_cycle F10M_clk = F10M_clk; initial begin RESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop; endfdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk);endmodule仿真波形:練習(xí):利用10M的時鐘,設(shè)計一個單周期形狀如下的周期波
11、形。T0 10s 20s 20s練習(xí)四. 設(shè)計時序邏輯時采用阻塞賦值與非阻塞賦值的區(qū)別目的:1.明確掌握阻塞賦值與非阻塞賦值的概念和區(qū)別; 2.了解阻塞賦值的使用情況。阻塞賦值與非阻塞賦值,在教材中我們已經(jīng)了解了它們之間在語法上的區(qū)別以及綜合后所得到的電路結(jié)構(gòu)上的區(qū)別。在always塊中,阻塞賦值可以理解為賦值語句是順序執(zhí)行的,而非阻塞賦值可以理解為賦值語句是并發(fā)執(zhí)行的。實際的時序邏輯設(shè)計中,一般的情況下非阻塞賦值語句被更多地使用,有時為了在同一周期實現(xiàn)相互關(guān)聯(lián)的操作,也使用了阻塞賦值語句。(注意:在實現(xiàn)組合邏輯的assign結(jié)構(gòu)中,無一例外地都必須采用阻塞賦值語句。下例通過分別采用阻塞賦值語
12、句和非阻塞賦值語句的兩個看上去非常相似的兩個模塊blocking.v和non_blocking.v來闡明兩者之間的區(qū)別。模塊源代碼:/ - blocking.v -module blocking(clk,a,b,c); 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); end endmodule/- non_blocking.v -m
13、odule 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) begin b <= a; c <= b; $display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c); end endmodule測試模塊源代碼:/- compareTop.v -timescale 1ns/100psinclude "./blocking.v"include &qu
14、ot;./non_blocking.v"module compareTop; wire 3:0 b1,c1,b2,c2; reg 3:0 a; reg clk; initial begin clk = 0; 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; $
15、display("_"); # 100 a = 4'h2; $display("_"); # 100 $display("_"); $stop; end non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);endmodule仿真波形(部分):思考:在blocking模塊中按如下寫法,仿真與綜合的結(jié)果會有什么樣的變化?作出仿真 波形,分析綜合結(jié)果。 1 always (posedge clk) begin c = b; b = a; end
16、2. always (posedge clk) b=a;always (posedge clk) c=b;練習(xí)五. 用always塊實現(xiàn)較復(fù)雜的組合邏輯電路目的: 1.掌握用always實現(xiàn)組合邏輯電路的方法; 2.了解assign與always兩種組合邏輯電路實現(xiàn)方法之間的區(qū)別。 僅使用assign結(jié)構(gòu)來實現(xiàn)組合邏輯電路,在設(shè)計中會發(fā)現(xiàn)很多地方會顯得冗長且效率低下。而適當(dāng)?shù)夭捎胊lways來設(shè)計組合邏輯,往往會更具實效。已進(jìn)行的范例和練習(xí)中,我們僅在實現(xiàn)時序邏輯電路時使用always塊。從現(xiàn)在開始,我們對它的看法要稍稍改變。下面是一個簡單的指令譯碼電路的設(shè)計示例。該電路通過對指令的判斷,對輸
17、入數(shù)據(jù)執(zhí)行相應(yīng)的操作,包括加、減、與、或和求反,并且無論是指令作用的數(shù)據(jù)還是指令本身發(fā)生變化,結(jié)果都要作出及時的反應(yīng)。顯然,這是一個較為復(fù)雜的組合邏輯電路,如果采用assign語句,表達(dá)起來非常復(fù)雜。示例中使用了電平敏感的always塊,所謂電平敏感的觸發(fā)條件是指在后的括號內(nèi)電平列表中的任何一個電平發(fā)生變化,(與時序邏輯不同,它在后的括號內(nèi)沒有沿敏感關(guān)鍵詞,如posedge 或negedge)就能觸發(fā)always塊的動作,并且運用了case結(jié)構(gòu)來進(jìn)行分支判斷,不但設(shè)計思想得到直觀的體現(xiàn),而且代碼看起來非常整齊、便于理解。/- alu.v -define plus 3'd0define
18、minus 3'd1define band 3'd2define bor 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: ou
19、t = a|b; /求或。 unegate: out=a; /求反。 default: out=8'hx;/未收到指令時,輸出任意態(tài)。 endcaseendendmodule 同一組合邏輯電路分別用always塊和連續(xù)賦值語句assign描述時,代碼的形式大相徑庭,但是在always中適當(dāng)運用default(在case結(jié)構(gòu)中)和else(在ifelse結(jié)構(gòu)中),通常可以綜合為純組合邏輯,盡管被賦值的變量一定要定義為reg型。不過,如果不使用default或else對缺省項進(jìn)行說明,則易生成意想不到的鎖存器,這一點一定要加以注意。指令譯碼器的測試模塊源代碼:/- alu_Top.v -t
20、imescale 1ns/1nsinclude "./alu.v"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; /Giv
21、e a radom number. b=$random%256; /Give a radom number. opcode=opcode+1; end #100 $stop; end alu alu1(out,opcode,a,b);endmodule仿真波形(部分): 練習(xí):運用always塊設(shè)計一個八路數(shù)據(jù)選擇器。要求:每路輸入數(shù)據(jù)與輸出數(shù)據(jù)均為4位2進(jìn)制數(shù),當(dāng)選擇開關(guān)(至少3位)或輸入數(shù)據(jù)發(fā)生變化時,輸出數(shù)據(jù)也相應(yīng)地變化。練習(xí)六. 在Verilog HDL中使用函數(shù)目的:掌握函數(shù)在模塊設(shè)計中的使用。與一般的程序設(shè)計語言一樣,Veirlog HDL也可使用函數(shù)以適應(yīng)對不同變量采取同一運算的
22、操作。Veirlog HDL函數(shù)在綜合時被理解成具有獨立運算功能的電路,每調(diào)用一次函數(shù)相當(dāng)于改變這部分電路的輸入以得到相應(yīng)的計算結(jié)果。下例是函數(shù)調(diào)用的一個簡單示范,采用同步時鐘觸發(fā)運算的執(zhí)行,每個clk時鐘周期都會執(zhí)行一次運算。并且在測試模塊中,通過調(diào)用系統(tǒng)任務(wù)$display在時鐘的下降沿顯示每次計算的結(jié)果。 模塊源代碼:module tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) /clk的上沿觸發(fā)同步運算。b
23、egin if(!reset) /reset為低時復(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 endfunc
24、tion endmodule測試模塊源代碼: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=clk; try
25、funct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset);endmodule 上例中函數(shù)factorial(n)實際上就是階乘運算。必須提醒大家注意的是,在實際的設(shè)計中,我們不希望設(shè)計中的運算過于復(fù)雜,以免在綜合后帶來不可預(yù)測的后果。經(jīng)常的情況是,我們把復(fù)雜的運算分成幾個步驟,分別在不同的時鐘周期完成。 仿真波形(部分):練習(xí):設(shè)計一個帶控制端的邏輯運算電路,分別完成正整數(shù)的平方、立方和階乘的運算。編寫測試模塊,并給出仿真波形。練習(xí)七. 在Verilog HDL中使用任務(wù)(task)目的:掌握任務(wù)在結(jié)構(gòu)化Verilog HDL設(shè)計
26、中的應(yīng)用。僅有函數(shù)并不能完全滿足Veirlog HDL中的運算需求。當(dāng)我們希望能夠?qū)⒁恍┬盘栠M(jìn)行運算并輸出多個結(jié)果時,采用函數(shù)結(jié)構(gòu)就顯得非常不方便,而任務(wù)結(jié)構(gòu)在這方面的優(yōu)勢則十分突出。任務(wù)本身并不返回計算值,但是它通過類似C語言中形參與實參的數(shù)據(jù)交換,非??旖莸貙崿F(xiàn)運算結(jié)果的調(diào)用。此外,我們還常常利用任務(wù)來幫助我們實現(xiàn)結(jié)構(gòu)化的模塊設(shè)計,將批量的操作以任務(wù)的形式獨立出來,這樣設(shè)計的目的通常一眼看過去就很明了。下面是一個利用task和電平敏感的always塊設(shè)計比較后重組信號的組合邏輯的實例??梢钥吹?,利用task非常方便地實現(xiàn)了數(shù)據(jù)之間的交換,如果要用函數(shù)實現(xiàn)相同的功能是非常復(fù)雜的;另外,tas
27、k也避免了直接用一般語句來描述所引起的不易理解和綜合時產(chǎ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,vc); /va 與vc互換。 sort2(vb,vd); /vb 與vd互換。 sort2(va,vb); /va 與vb互換。 s
28、ort2(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中的變量定義與模塊中的變量定義不盡相同,它們并不受輸入輸出類型的限制。如此例,x與y對于task sort2來說雖然是inout型,但實際上它們對應(yīng)的是always塊中變量,
29、都是reg型變量。測試模塊源代碼: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 #100 $stop; sort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(
30、rc),.rd(rd); endmodule 仿真波形(部分):練習(xí):設(shè)計一個模塊,通過任務(wù)完成3個8位2進(jìn)制輸入數(shù)據(jù)的冒泡排序。要求:時鐘觸發(fā)任務(wù)的執(zhí)行,每個時鐘周期完成一次數(shù)據(jù)交換的操作。練習(xí)八. 利用有限狀態(tài)機(jī)進(jìn)行復(fù)雜時序邏輯的設(shè)計目的:掌握利用有限狀態(tài)機(jī)實現(xiàn)復(fù)雜時序邏輯的方法;在數(shù)字電路中我們已經(jīng)學(xué)習(xí)過通過建立有限狀態(tài)機(jī)來進(jìn)行數(shù)字邏輯的設(shè)計,而在Verilog HDL硬件描述語言中,這種設(shè)計方法得到進(jìn)一步的發(fā)展。通過Verilog HDL提供的語句,我們可以直觀地設(shè)計出適合更為復(fù)雜的時序邏輯的電路。關(guān)于有限狀態(tài)機(jī)的設(shè)計方法在教材中已經(jīng)作了較為詳細(xì)的闡述,在此就不贅述了。下例是一個簡單的
31、狀態(tài)機(jī)設(shè)計,功能是檢測一個5位二進(jìn)制序列“10010”??紤]到序列重疊的可能,有限狀態(tài)機(jī)共提供8個狀態(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 IDLE='d0, A='d1, B='d2, C='d3, D='d4, E='d5, F='d6, G='d7; assign z = ( state=E &&
32、amp; x=0 )? 1 : 0; /當(dāng)x=0時,狀態(tài)已變?yōu)镋, /狀態(tài)為D時,x仍為1。因此 /輸出為1的條件為( state=E && x=0 )。always (posedge clk) if(!rst) begin state <= IDLE; end else casex(state) IDLE : if(x=1) begin state <= A; end A: if(x=0) begin state <= B; end B: if(x=0) begin state <= C; end else begin state <= F; e
33、nd 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 state <= A; end F: if(x=1) begin state <= A; end else begin state <= B; end G: if(x=1) begin state <= F; e
34、nd default:state=IDLE; /缺省狀態(tài)為初始狀態(tài)。 endcaseendmodule測試模塊源代碼:/- seqdet.v -timescale 1ns/1nsinclude "./seqdet.v"module seqdet_Top; reg clk,rst; reg23:0 data; wire2:0 state; wire z,x; assign x=data23; always #10 clk = clk; always (posedge clk) data=data22:0,data23; initial begin clk=0; rst=1;
35、#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è)計一個串行數(shù)據(jù)檢測器。要求是:連續(xù)4個或4個以上的1時輸出為1,其他輸入情況下為0。編寫測試模塊并給出仿真波形。練習(xí)九.利用狀態(tài)機(jī)的嵌套實現(xiàn)層次結(jié)構(gòu)化設(shè)計目的:.運用主狀態(tài)機(jī)與子狀態(tài)機(jī)產(chǎn)生層次化的邏輯設(shè)計;.在結(jié)構(gòu)化設(shè)計中靈活使用任務(wù)(task)結(jié)構(gòu)。在上一節(jié),我們學(xué)習(xí)了如何使用狀態(tài)機(jī)的實例。實際上,單個有限狀態(tài)機(jī)控制整個邏輯電路的運轉(zhuǎn)在實際設(shè)計中是不
36、多見,往往是狀態(tài)機(jī)套用狀態(tài)機(jī),從而形成樹狀的控制核心。這一點也與我們提倡的層次化、結(jié)構(gòu)化的自頂而下的設(shè)計方法相符,下面我們就將提供一個這樣的示例以供大家學(xué)習(xí)。該例是一個簡化的EPROM的串行寫入器。事實上,它是一個EPROM讀寫器設(shè)計中實現(xiàn)寫功能的部分經(jīng)刪節(jié)得到的,去除了EPROM的啟動、結(jié)束和EPROM控制字的寫入等功能,只具備這樣一個雛形。工作的步驟是:.地址的串行寫入;.數(shù)據(jù)的串行寫入;3.給信號源應(yīng)答,信號源給出下一個操作對象;.結(jié)束寫操作。通過移位令并行數(shù)據(jù)得以一位一位輸出。模塊源代碼:module writing(reset,clk,address,data,sda,ack); i
37、nput reset,clk; input7:0 data,address; output sda,ack;/sda負(fù)責(zé)串行數(shù)據(jù)輸出; /ack是一個對象操作完畢后,模塊給出的應(yīng)答信號。 reg link_write;/link_write 決定何時輸出。 reg3: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; /用以判斷是否處理完一個操作對象。 reg ack; parameter idle=0,addr_write=1,data_write=2
38、,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 (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(
39、state) idle: begin link_write <= 0; state <= idle; finish_F <= 0; sh8out_state<=idle; ack<= 0; sh8out_buf<=address; state <= addr_write; end addr_write: /地址的輸入。 begin if(finish_F=0) begin shift8_out; end else begin sh8out_state <= idle; sh8out_buf <= data; state <= data
40、_write; finish_F <= 0; end end data_write: /數(shù)據(jù)的寫入。 begin if(finish_F=0) begin shift8_out; end else begin link_write <= 0; state <= stop_ack; finish_F <= 0; ack <= 1; end end stop_ack: /完成應(yīng)答。 begin ack <= 0; state <= idle; end endcase end task shift8_out; /串行寫入。 begin case(sh8out
41、_state) idle: begin link_write <= 1; sh8out_state <= bit0; end bit0: begin link_write <= 1; sh8out_state <= bit1; sh8out_buf <= 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<=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑模板研發(fā)與技術(shù)支持合同4篇
- 臨時工勞動合同范本(2024版)
- 中醫(yī)承師合同模板
- 2025版外貿(mào)鞋子購銷合同模板:品牌設(shè)計合作協(xié)議3篇
- 2025年度汽車維修行業(yè)深度合作框架協(xié)議
- 二零二五年度解除租賃合同及約定租賃物租賃期限變更協(xié)議
- 二零二五年度洗車行業(yè)培訓(xùn)與認(rèn)證協(xié)議
- 2025年度市政基礎(chǔ)設(shè)施竣工驗收合同
- 二零二五年度勞動合同解除員工離職賠償金支付協(xié)議
- 二零二五年度水利工程測繪數(shù)據(jù)保密協(xié)議書
- 2024年中國醫(yī)藥研發(fā)藍(lán)皮書
- 廣東省佛山市 2023-2024學(xué)年五年級(上)期末數(shù)學(xué)試卷
- 臺兒莊介紹課件
- 疥瘡病人的護(hù)理
- 人工智能算法與實踐-第16章 LSTM神經(jīng)網(wǎng)絡(luò)
- 17個崗位安全操作規(guī)程手冊
- 2025年山東省濟(jì)南市第一中學(xué)高三下學(xué)期期末統(tǒng)一考試物理試題含解析
- 中學(xué)安全辦2024-2025學(xué)年工作計劃
- 網(wǎng)絡(luò)安全保障服務(wù)方案(網(wǎng)絡(luò)安全運維、重保服務(wù))
- 現(xiàn)代科學(xué)技術(shù)概論智慧樹知到期末考試答案章節(jié)答案2024年成都師范學(xué)院
- 軟件模塊化設(shè)計與開發(fā)標(biāo)準(zhǔn)與規(guī)范
評論
0/150
提交評論