《數(shù)字邏輯與EDA設(shè)計》課件-第7章_第1頁
《數(shù)字邏輯與EDA設(shè)計》課件-第7章_第2頁
《數(shù)字邏輯與EDA設(shè)計》課件-第7章_第3頁
《數(shù)字邏輯與EDA設(shè)計》課件-第7章_第4頁
《數(shù)字邏輯與EDA設(shè)計》課件-第7章_第5頁
已閱讀5頁,還剩353頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7章基于EDA的時序電路

設(shè)計、綜合及驗證

7.1鎖存器7.2觸發(fā)器7.3寄存器7.4寄存器傳輸7.5計數(shù)器7.6有限狀態(tài)機(jī)7.7時序邏輯電路的綜合性設(shè)計實例學(xué)習(xí)基礎(chǔ):

第3章介紹了時序邏輯電路的基礎(chǔ)知識。在學(xué)習(xí)本章前,應(yīng)先掌握第3章的知識。

第4章介紹了VerilogHDL的基本語法及簡單設(shè)計的建模方法。

5.5~5.7節(jié)的綜合實例,介紹了EDA工具LiberoIDE的使用方法。本章所有綜合和驗證均基于LiberoIDE環(huán)境實現(xiàn)。閱讀指南:

本章講述內(nèi)容對應(yīng)第3章的知識,把相應(yīng)功能通過VerilogHDL語言進(jìn)行實現(xiàn)。對每個電路設(shè)計的基礎(chǔ)知識和理解請參考第3章。

本章多處對同一個設(shè)計提供了多種設(shè)計思路和實現(xiàn)方法,并不是所有都是最優(yōu)的方法,只是方便對比和學(xué)習(xí)。讀者可根據(jù)情況選擇合適的方法。

7.4節(jié)、7.6節(jié)、7.7節(jié)中討論了第3章中沒有涉及的理論知識和多個綜合例子,這些知識和例子綜合性強(qiáng),較難理解,但卻是數(shù)字系統(tǒng)實際開發(fā)中非常重要和實用的內(nèi)容,對于想進(jìn)入數(shù)字系統(tǒng)設(shè)計實踐階段的讀者來說很有實際意義。

7.1鎖存器

7.1.1基本RS鎖存器(一)

1.使用Verilog進(jìn)行描述

modulers_1(R,S,Q,Qn);

inputR,S;

outputQ,Qn; //Qn表示,而不是時序電路中的現(xiàn)態(tài)Qn。

regQ;

assignQn=~Q;regQ;

assignQn=~Q;

always@(RorS)

//通過case語句,按真值表方式寫出程序邏輯。

case({R,S})

2'b01:Q=1;

2'b10:Q=0;

2'b11:Q=1'bx;

endcase

endmodule讀者在一開始看到這種程序時很容易產(chǎn)生疑問:觸發(fā)器是存放數(shù)字電路中基本二進(jìn)制信號的單元電路,也就是寄存器變量Q的值是需要使用觸發(fā)器來存放,而觸發(fā)器是由鎖存器所構(gòu)成的,用觸發(fā)器存放的Q來實現(xiàn)一個鎖存器顯然是不合理的。

這就需要讀者理解在VerilogHDL中,采用行為風(fēng)格編寫代碼,是為了讓程序編寫者可用更趨向行為的方式更方便地編寫代碼,而不需考慮具體的物理細(xì)節(jié)。雖然在程序中指定要使用一個寄存器變量Q,但在使用EDA工具進(jìn)行綜合的時候,是不會也不可能用觸發(fā)器來實現(xiàn)鎖存器的,這通過綜合結(jié)果可看出。

2.綜合結(jié)果

綜合結(jié)果如圖7-1和圖7-2所示。圖7-1RTL視圖圖7-2工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench();

regr,s;

wireq,qn;

rs_1test_rs(r,s,q,qn);

initial

begin

r=0;s=0;

#10s=1;

#10r=1;

#10s=0;

#10r=0;

#10;

end

endmodule

4.功能驗證

仿真結(jié)果如圖7-3和圖7-4所示。

波形說明:

(1)綜合前仿真(功能仿真)的結(jié)果中,在0~10ns和20~30ns之間,q和qn都是x態(tài)。0~10ns之間產(chǎn)生的x態(tài)是因為r和s的值為0,q保持原態(tài);20~30ns之間產(chǎn)生的x態(tài)是因為r和s的值為1,代碼中規(guī)定了處理為x態(tài)。

(2)綜合后仿真的結(jié)果中,20~30ns之間q和qn并不是x態(tài)(都為0),具體狀態(tài)視20ns時r、s、q的值而定(讀者可通過電路自行推算出來)。圖7-3綜合前仿真圖7-4綜合后仿真7.1.2基本RS鎖存器(二)

1.使用Verilog進(jìn)行描述

modulers_2(R,S,Q,Qn);

inputR,S;

outputQ,Qn;

nor(Q,R,Qn);

nor(Qn,S,Q);

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-5和圖7-6所示。圖7-5RTL視圖圖7-6工藝視圖

3.功能驗證

測試平臺與設(shè)計(一)相同。仿真結(jié)果如圖7-7所示。

波形分析:對比設(shè)計(一)和設(shè)計(二)的波形,可發(fā)現(xiàn)在設(shè)計(一)中,當(dāng)r、s為1時,Q和Qn均為x;而在設(shè)計(二)中Q和Qn均為0。由于對RS鎖存器來說,R、S同為1是不允許的,故可忽略之。圖7-7功能仿真結(jié)果7.1.3門控D鎖存器

1.使用Verilog進(jìn)行描述

modulelatch_1_a(Clk,D,Q);

inputClk,D;

outputQ;

regQ;

always@(DorClk)

if(Clk)Q<=D;

endmodule程序說明:

(1)當(dāng)Clk為高電平時,輸出Q的數(shù)值會隨D輸入的數(shù)據(jù)更新;而當(dāng)Clk為低電平時,將保持其高電平時鎖入的數(shù)據(jù)。

(2)?Clk由0變?yōu)?時,滿足if語句的條件,語句“Q<=D”被執(zhí)行,將D的數(shù)值賦給Q;Clk由1變?yōu)?時(無論D是否變化),都將執(zhí)行if語句,但此時Clk=0,語句Q<=D不被執(zhí)行,于是Q保持原值不變。

(3)如果敏感信號D發(fā)生變化,但Clk為0,則Q保持原值不變;如果敏感信號D發(fā)生變化,且Clk為1,則執(zhí)行語句Q<=D。

2.綜合結(jié)果

綜合結(jié)果如圖7-8和圖7-9所示。圖7-8RTL視圖圖7-9工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench_latch;

regclk,D;

wireQ;

initial

begin

clk=0;

#50clk=1;

#100clk=0;

#100clk=1;

end

initial

begin

D=0;

repeat(20)

#20D=$random;

end

latch_1_atestbench_latch(clk,D,Q);

endmodule

4.功能驗證

仿真結(jié)果如圖7-10所示。圖7-10功能仿真結(jié)果7.1.4帶清零D鎖存器(一)

1.使用Verilog進(jìn)行描述

modulelatch_1_c(Clk,D,Q,Rst);

inputClk,D,Rst;

outputQ;

regQ;

always@(DorClkorRst)

if(!Rst)Q<=0; //語句1

elseif(Clk)Q<=D;

endmodule程序說明:

(1)程序采用具有時序語句特色的進(jìn)程語句,其中數(shù)據(jù)信號D、時鐘信號Clk和清0(復(fù)位)信號Rst都被列于敏感信號表中,實現(xiàn)了Clk的電平觸發(fā)特性和Rst的異步特性。

(2)異步清0實現(xiàn)的效果,就是當(dāng)Rst一旦變成0,就馬上對輸出進(jìn)行清0,而不需要理會時鐘、輸入數(shù)據(jù)等的狀態(tài)。也就是Rst是優(yōu)先級最高的控制信號,在代碼(語句1)中,可通過“if…elseif…”語句來實現(xiàn)優(yōu)先級控制。

2.綜合結(jié)果

綜合結(jié)果如圖7-11和圖7-12所示。圖7-11RTL視圖圖7-12工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench_latch;

regclk,D,rst;

wireQ;

initial

begin

clk=0;

#50clk=1;

#70clk=0;

#80clk=1;

endinitial

begin

D=0;

repeat(20)

#20D=$random;

end

initial

begin

rst=0;

#60rst=1;

#80rst=0;

#40rst=1;

end

latch_1_ctestbench_latch(clk,D,Q,rst);

endmodule

4.功能驗證

仿真結(jié)果如圖7-13所示。圖7-13功能仿真結(jié)果7.1.5帶清零D鎖存器(二)

modulelatch_1_d(Clk,D,Q,Rst);

inputClk,D,Rst;

outputQ;

assignQ=(!Rst)?0:(Clk?D:Q);

endmodule

程序采用連續(xù)賦值語句,使用了條件操作符的嵌套,實現(xiàn)思路與設(shè)計(一)相同。綜合結(jié)果與設(shè)計(一)基本相同,只有元件名稱稍有不同。測試平臺、功能驗證結(jié)果與設(shè)計(一)相同。

7.2觸發(fā)器

D觸發(fā)器是最簡單、最常用且最具代表性的時序電路,它是數(shù)字系統(tǒng)設(shè)計中最基本的底層時序單元,JK和T觸發(fā)器都由D觸發(fā)器構(gòu)建而來。7.2.1D觸發(fā)器

1.使用Verilog進(jìn)行描述

moduled_ff_1(D,Clk,Q);

inputD,Clk;

outputQ;

regQ;

always@(posedgeClk)

Q<=D;

endmodule程序說明:

(1)當(dāng)Clk的上升沿到達(dá)時,立即將D送往輸出Q;若沒有Clk的上升沿到達(dá),則Q的值保持不變。

(2)該D觸發(fā)器的設(shè)計與門控D鎖存器設(shè)計非常類似,僅僅是由電平敏感變成了上升沿敏感。

2.綜合結(jié)果

綜合結(jié)果如圖7-14和圖7-15所示。圖7-14RTL視圖圖7-15工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench;

regD,Clk;

wireQ;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;

initial

begin

D=0;Clk=0;

repeat(20)

#20D=$random;

end

initial

#300$finish;

d_ff_1testbench_d(D,Clk,Q);

endmodule

4.功能驗證

仿真結(jié)果如圖7-16所示。圖7-16功能仿真結(jié)果7.2.2D觸發(fā)器(異步清零邊沿觸發(fā))

1.使用Verilog進(jìn)行描述

moduled_ff_2(D,Clk,Q,Rst,En);

inputD,Clk,Rst,En;

outputQ;

regQ;

always@(posedgeClkornegedgeRst)

begin

if(!Rst)Q<=0;

elseif(En)Q<=D;

end

endmodule程序說明:

(1)所謂“異步”是指獨立于時鐘控制的復(fù)位控制端,即在任何時刻,只要Rst=0,D觸發(fā)器的輸出端即刻被清0,與時鐘狀態(tài)無關(guān);而時鐘使能端En的功能是,只有當(dāng)En=1時,時鐘上升沿才有效。

(2)無論Clk是否有跳變,只要Rst的下降沿到達(dá),即執(zhí)行Q<=0,此后如果Rst一直保持為0,則無論是否有Clk的邊沿跳變信號,Q均輸出0;如果Rst一直為1,且Clk有上升沿到達(dá),則會執(zhí)行賦值操作Q<=D,從而更新Q值。

2.綜合結(jié)果

綜合結(jié)果如圖7-17和圖7-18所示。圖7-17RTL視圖圖7-18工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench;

regD,Rst,Clk,En;

wireQ;

d_ff_2testbench_dff(D,Clk,Q,Rst,En);

initial

Clk=0;

#400$finish;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;initial

begin

D=0;

repeat(20)

#20D=$random;

end

initial

begin

Rst=0;

repeat(20)

#20Rst=$random;

end

initial

begin

En=0;

repeat(20)

#20En=$random;

end

endmodule

4.功能驗證

仿真結(jié)果如圖7-19所示。圖7-19功能仿真結(jié)果7.2.3D觸發(fā)器(同步清零邊沿觸發(fā))

moduled_ff_3(D,Clk,Q,Rst);

inputD,Clk,Rst;

outputQ;

regQ;

always@(posedgeClk)

if(Rst==1)Q=0;

elseif(Rst==0)Q=D;

endmodule

程序說明:所謂“同步”是指某控制信號只有在時鐘信號有效時才起作用。信號敏感表列表中只放了對Clk上升沿的敏感表述,即此過程中的所有其它輸入信號都相對于時鐘Clk而同步。7.2.4JK觸發(fā)器

1.使用Verilog進(jìn)行描述

JK觸發(fā)器比RS觸發(fā)器增加了翻轉(zhuǎn)功能,以下設(shè)計與RS觸發(fā)器類似。

modulejk_ff(J,K,Clk,Q,Qn);

inputJ,K,Clk;

outputQ,Qn;

regQ;

assignQn=~Q;

always@(posedgeClk)

case({J,K})

2'b00:Q<=Q;

2‘b01:Q<=1’b0;

2‘b10:Q<=1’b1;

2‘b11:Q<=~Q;

default:Q<=1’bx;

endcase

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-20和圖7-21所示。圖7-20RTL視圖圖7-21工藝視圖

3.測試平臺設(shè)計

測試平臺的設(shè)計與RS觸發(fā)器的方法一致,只需把R,S改成J,K,修改對接模塊名稱即可。

`timescale1ns/1ns

moduletestbench;

regj,k,Clk;

wireQ,Qn;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;initial

begin

j=0;Clk=0;

repeat(20)

#20j=$random;

end

initial

begin

k=0;

repeat(20)

#20k=$random;

end

initial

#300$finish;

jk_fftestbench_jk(j,k,Clk,Q,Qn);

endmodule

4.功能驗證

仿真結(jié)果如圖7-22所示。圖7-22功能仿真結(jié)果7.2.5RS觸發(fā)器

1.使用Verilog進(jìn)行描述

以下設(shè)計是在RS鎖存器設(shè)計(一)的基礎(chǔ)上,加入上升沿控制而寫成的。加入了時鐘信號Clk,改變了敏感事件為Clk上升沿觸發(fā)。

modulers_ff(R,S,Clk,Q,Qn);

inputR,S,Clk;

outputQ,Qn;

regQ;

assignQn=~Q;

always@(posedgeClk)

case({R,S})

2‘b01:Q<=1;

2’b10:Q<=0;

2‘b11:Q<=1’bx;

endcase

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-23和圖7-24所示。圖7-23RTL視圖圖7-24工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench;

regR,S,Clk;

wireQ,Qn;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;

initial

begin

R=0;Clk=0;

repeat(20) //語句1

#20R=$random;

endinitial

begin

S=0;

repeat(20) //語句2

#20S=$random;

end

rs_fftestbench_rs(R,S,Clk,Q,Qn);

initial

#300$finish; //語句3

endmodule程序說明:語句1和語句2要求生成20個隨機(jī)的R和S,共需400個單位時間,但語句3卻要求在單位時間300時結(jié)束,那么程序會按哪一個要求進(jìn)行呢?答案可從以下的功能驗證波形中看到,程序會在單位時間300時結(jié)束。

4.功能驗證

仿真結(jié)果如圖7-25和圖7-26所示。

波形分析:從波形圖上看,綜合前和綜合后的Q輸出結(jié)果不一樣,綜合前仿真的Q輸出有很多的x態(tài)。該現(xiàn)象與RS鎖存器設(shè)計(一)中出現(xiàn)的現(xiàn)象是同一原因,請參考前面(RS鎖存器設(shè)計一)的說明。圖7-25綜合前仿真結(jié)果圖7-26綜合后仿真結(jié)果7.2.6T觸發(fā)器(異步清零)

1.使用Verilog進(jìn)行描述

modulet_ff(T,Clk,Rst,Q,Qn);

inputT,Clk,Rst;

outputQ,Qn;

regQ;

assignQn=~Q;

always@(posedgeClkorposedgeRst)

if(Rst)Q<=0;

elseif(T)Q<=~Q;

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-27和圖7-28所示。圖7-27RTL視圖圖7-28工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench_t;

regT,Clk,Rst;

wireQ,Qn;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;

initial

begin

Rst=0;Clk=0;

#30Rst=1;

#30Rst=0;#30Rst=1;

#30Rst=0;

end

initial

begin

T=0;

repeat(20)

#20T=$random;

end

t_fftestbench_t(T,Clk,Rst,Q,Qn);

initial

#400$finish;

endmodule

4.功能驗證

仿真結(jié)果如圖7-29所示。

波形分析:假設(shè)Rst一直不產(chǎn)生上升沿變化,那么會發(fā)生什么事情呢?如果Rst不產(chǎn)生上升沿變化,則程序代碼不被執(zhí)行,無論T和Clk如何變化,Q和Qn將一直保持x值。故一般應(yīng)進(jìn)行數(shù)據(jù)的初始化處理。圖7-29功能仿真結(jié)果

7.3寄存器

7.3.1基本寄存器

以下討論由4位D觸發(fā)器構(gòu)成的4位寄存器。對于基本寄存器,數(shù)據(jù)或代碼只能并行送入寄存器中,需要時也只能并行輸出。

1.使用Verilog進(jìn)行描述

modulereg4_1(Clr,Clk,D,Q);

output[3:0]Q;

input[3:0]D;

inputClk,Clr;

reg[3:0]Q;

always@(posedgeClkornegedgeClr)

begin

if(!Clr)Q<=0;

elseQ<=D;

end

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-30和圖7-31所示。圖7-30RTL視圖圖7-31工藝視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench;

regClr,Clk;

reg[3:0]D;

wire[3:0]Q;

parameterclock_period=20;

always#(clock_period/2)

Clk=~Clk;

initial

begin

D=0;Clk=0;

repeat(20)

#20D=$random;

end

initial

begin

Clr=0;

repeat(20)

#20Clr=$random;

end

initial

#400$finish;

reg4_1test_reg(Clr,Clk,D,Q);

endmodule

4.功能驗證

仿真結(jié)果如圖7-32所示。

說明:圖中Q的輸出有些地方為空白,是由于位置不夠顯示,放大波形即可看到具體的值。圖7-32功能仿真結(jié)果7.3.2基本寄存器(異步清零異步置1)

1.使用Verilog進(jìn)行描述

以下的設(shè)計具有異步清零端(Aclr)和異步置1端(Aset),異步清零的優(yōu)先級比異步置1高。

modulereg4_2(Data,Aclr,Aset,Clock,Q);

input[3:0]Data;

inputAclr,Aset,Clock;

output[3:0]Q;

reg[3:0]Q;

always@(posedgeClockornegedgeAclrorposedgeAset)

if(!Aclr)

Q<=4‘b0000;

elseif(Aset)

Q<=4’b1111;

elseQ<=Data;

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-33所示。

篇幅所限,在此不列出工藝視圖,請讀者自行綜合并與其它設(shè)計進(jìn)行對比分析。圖7-33RTL視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench;

reg[3:0]Data;

regAclr,Aset,Clock;

wire[3:0]Q;

initial

Clock=0;

parameterclock_period=20;

always#(clock_period/2)Clock=~Clock;initial

begin

Data=0;

repeat(20)

#20Data=$random;

end

initial

begin

Aclr=0;

repeat(20)

#20Aclr=$random;

endinitial

begin

Aset=0;

#200Aset=1;

end

initial

#300$finish;

reg4_2test_reg(Data,Aclr,Aset,Clock,Q);

endmodule程序說明:由于加入了多個控制信號,故測試平臺中對控制信號的狀態(tài)進(jìn)行合理搭配也是很重要的,否則可能會出現(xiàn)某些控制信號組合情況未被測試的情況。因此在測試平臺編寫過程中應(yīng)不斷根據(jù)實際情況進(jìn)行調(diào)整。

4.功能驗證

仿真結(jié)果如圖7-34所示。圖7-34功能仿真結(jié)果7.3.3移位寄存器(并入并出單向左移)

1.使用Verilog進(jìn)行描述

moduleshift_reg_pipo(Data,Enable,Shiften,Shiftin,Aclr,Clock,Q);

input[3:0]Data; //4位并行輸入數(shù)據(jù)

inputAclr; //異步清0端

inputEnable; //置數(shù)使能端

inputShiften; //移位使能控制

inputShiftin; //串行輸入端

inputClock; //時鐘信號,上升沿控制

output[3:0]Q; //并行輸出端

reg[3:0]Qaux; //臨時變量always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Enable)

Qaux=Data;

elseif(Shiften)

Qaux={Qaux[2:0],Shiftin};

//通過連接運(yùn)算符實現(xiàn)左移輸入

end

assignQ=Qaux;

endmodule程序說明:

(1)?Aclr(異步清0端)的優(yōu)先級最高,一旦Aclr變?yōu)榈碗娖剑瑒t輸出馬上清0。

(2)?Enable(并行輸入使能控制端)的優(yōu)先級比Shiften(移位使能控制端)高,當(dāng)Aclr不為1時,時鐘上升沿到來,只要Enable為1,輸出Q得到并行輸入Data的值。

(3)當(dāng)Aclr和Enable不為1時,時鐘上升沿到來,如果Shiften為1,則實現(xiàn)右移輸入操作,左移輸入Shiftin的數(shù)據(jù)(串行輸入)。

2.綜合結(jié)果

綜合結(jié)果如圖7-35所示。圖7-35RTL視圖7.3.4移位寄存器(并入串出單向左移)

1.使用Verilog進(jìn)行描述

moduleshift_reg_piso(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);

input[1:0]Data;

inputAclr;

inputEnable;

inputShiften;

inputShiftin;

inputClock;

outputShiftout;

reg[1:0]Qaux;

always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Enable)

Qaux=Data;

elseif(Shiften)

Qaux={Qaux[0],Shiftin}; //語句1

end

assignShiftout=Qaux[1]; //語句2

endmodule程序說明:

(1)程序?qū)崿F(xiàn)2位移位寄存器,串行輸出左向移位。

(2)程序邏輯與7.7.3節(jié)的一致,只是在最后輸出的時候,7.3.3節(jié)的設(shè)計是并行輸出整個結(jié)果,而本設(shè)計是輸出最高位,達(dá)到串行輸出的結(jié)果。

(3)如果要改為右移,語句1應(yīng)改為“Qaux={Shiftin,Qaux[1};”,并且語句2改為輸出最低位Qaux[0]。

2.綜合結(jié)果

綜合結(jié)果如圖7-36所示。圖7-36RTL視圖

3.測試平臺設(shè)計(1)

`timescale1ns/1ns

moduletestbench;

reg[1:0]Data;

regAclr,Enable,Shiften,Shiftin,Clock;

wireShiftout;

parameterclock_period=20;

always#(clock_period/2)Clock=~Clock;

initial

begin

Data=0;

repeat(20)

#20Data=$random;

endinitial

begin

Clock=0; //時鐘信號的初始化,可放在任一個initial過程中

Aclr=0;

#40Aclr=1;

#100Aclr=0;

end

initial

begin

Enable=0;

#100Enable=1;

#100Enable=0;

endinitial

begin

Shiften=0;

repeat(20)

#20Shiften=$random;

end

initial

begin

Shiftin=0;

repeat(10)

#40Shiftin=$random;

end

initial

#400$finish;

shift_reg_pisotestbench_piso(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);

endmodule

4.功能驗證(1)

仿真結(jié)果如圖7-37所示。

為了查看效果更完整,要把Qaux也輸出顯示到Wave窗口中,需要在“sim”窗口中選擇“testbench_piso”實例,然后在“objects”窗口中找到Qaux變量,把該變量設(shè)置在Wave窗口中顯示。如果不把Qaux加入到波形中,光從Shiftout是很難看出其移位過程的。

從圖中可看出,在時鐘控制下(上升沿):

清零端Aclr為1時,輸出為0;

Aclr為0,Enable(置數(shù)使能端)為1時,輸出Data的最高位;

Aclr為0,Enable為0,Shiften(移位使能端)為1時,根據(jù)Shiftin的輸入進(jìn)行左移位。圖7-37功能仿真結(jié)果

5.測試平臺設(shè)計(2)

在測試平臺設(shè)計(1)中,對于每一個控制信號,要么指定變化的時間,要么周期性用隨機(jī)數(shù)生成,這樣可以產(chǎn)生不同的測試信號組合。但這樣的設(shè)計很容易產(chǎn)生一些無意義的狀態(tài)組合和有些組合情況未能列出。

在測試平臺設(shè)計(2)中,Aclr和Clock的信號單獨產(chǎn)生;另外3個控制和輸入信號(Enable,Shiften,Shiftin)則通過循環(huán)方法,生成所有可能出現(xiàn)的組合情況;Data輸入則隨機(jī)產(chǎn)生。`timescale1ns/1ns

moduletestbench2;

reg[1:0]Data;

regAclr,Enable,Shiften,Shiftin,Clock;

wireShiftout;

reg[2:0]CtrlVec;

integerI;

parameterperiod=20;

always

#(period/2)Clock=~Clock;initial

begin

Clock=0;

Aclr=0;

#160Aclr=1;

end

initial

begin

Data=0;

repeat(12)

#20Data=$random;

endinitial

begin

for(I=0;I<=11;I=I+1)

begin

CtrlVec=I;

{Enable,Shiften,Shiftin}=CtrlVec;

#20;

end

end

initial

#240$finish;

shift_reg_pisotestbench_piso2(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);

endmodule程序說明:

(1)?I的循環(huán)只需要8次即可列舉出Enable、Shiften、Shiftin三個控制信號的8種狀態(tài)組合,但為了測試Aclr為0時的結(jié)果,增加了4次循環(huán)(I等于8~11時)。

(2)?Enable、Shiften、Shiftin的組合情況從000~111變化后,又重新從000開始,因為當(dāng)I為8(即‘b1000)時,Enable、Shiften、Shiftin分別獲得了低位的0,而最高位的1沒有被任何變量獲得,這是一個常用技巧。

6.功能驗證(2)

仿真結(jié)果如圖7-38所示。圖7-38功能仿真結(jié)果波形說明:

(1)該波形所顯示的變量是“testbench_piso2”實例中的變量,操作方法是:選擇“sim”窗口中“testbench_piso”實例,然后在“objects”窗口中,設(shè)置在Wave窗口中顯示相應(yīng)

變量。

(2)從Shiftout的波形來看,產(chǎn)生了很少的輸出,并且很難從Shiftout的波形看出移位、并行輸入的變化過程。

(3)具體的移位和并行輸入的結(jié)果,要從Qaux波形上才能看出:Qaux第1、2次的變化,是移位操作得到的結(jié)果;第3、4次的值,是并行輸入得到的結(jié)果;第5次的值,是異步清0的結(jié)果。7.3.5移位寄存器(串入并出單向左移)

1.使用Verilog進(jìn)行描述

moduleshift_reg_sipo(Shiften,Shiftin,Aclr,Clock,Q);

inputShiften,Shiftin,Aclr,Clock;

output[3:0]Q;

reg[3:0]Qaux;

always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Shiften)

Qaux={Qaux[2:0],Shiftin};

end

assignQ=Qaux;

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-39所示。圖7-39RTL視圖7.3.6移位寄存器(串入串出單向移位)

1.使用Verilog進(jìn)行描述

moduleshift_reg_siso(Shiften,Shiftin,Aclr,Clock,Shiftout);

inputShiften,Shiftin,Aclr,Clock;

outputShiftout;

reg[3:0]Qaux;

always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Shiften)

Qaux={Qaux[2:0],Shiftin};

end

assignShiftout=Qaux[3];

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-40所示。圖7-40RTL視圖

7.4寄?存?器?傳?輸

寄存器傳輸(RegisterTransferLevel,RTL)是數(shù)字邏輯電路的一種設(shè)計方法。利用寄存器傳輸設(shè)計時,必須詳細(xì)說明數(shù)據(jù)在不同寄存器之間處理及傳輸?shù)倪^程,一般使用中等規(guī)模的功能模塊作為基本單元。

7.4.1基本概念

寄存器存儲數(shù)據(jù)的運(yùn)動及完成的處理稱為寄存器傳輸操作(RegisterTransferOperation),又稱為微操作(microoperation)。

對于n位寄存器,下標(biāo)從0到n-1。小端(Littleendian):0位在最右端,n-1位在最左端。

大端(Bigendian):0位在最左端,n-1位在最右端。

最常用的寄存器圖示方法如圖7-41所示。

以“←”表示從一個寄存器到另一個寄存器的數(shù)據(jù)傳輸。例如R2←R1,表示將寄存器R1的內(nèi)容傳至寄存器R2,其中,R2表示目標(biāo)寄存器,R1表示源寄存器。

所有的寄存器傳輸操作都可以用相應(yīng)的硬件來實現(xiàn)。如K1:R2←R1,表示若K1=1,則R2←R1,對應(yīng)的電路和波形如圖7-42所示。圖7-41常用寄存器圖7-42寄存器傳輸操作7.4.2微操作的種類

有以下4種微操作:

(1)傳輸:從一個寄存器到另一個寄存器傳輸數(shù)據(jù)。

(2)算術(shù)運(yùn)算:寄存器存儲數(shù)據(jù)的算術(shù)運(yùn)算。

(3)邏輯運(yùn)算:寄存器存儲數(shù)據(jù)的位運(yùn)算。

(4)移位:寄存器存儲數(shù)據(jù)的移位。7.4.3單寄存器微操作

所有微操作的結(jié)果均只涉及一個目標(biāo)寄存器,且該寄存器又作為源寄存器使用。由于寄存器與微操作之間的緊密耦合,實現(xiàn)微操作的組合邏輯部分成為寄存器的一部分,稱為專用邏輯(dedicatedlogic)。而使用多目標(biāo)寄存器的情況則稱為共享邏輯(sharedlogic)。

考慮一個寄存器在不同時間從不同的數(shù)據(jù)源接收數(shù)據(jù)的情況:

K1:R0←R1,K1#K2:R0←R2

表示根據(jù)K1、K2的值選擇將寄存器R1或R2的內(nèi)容傳至目標(biāo)寄存器R0,可以利用數(shù)據(jù)選擇器實現(xiàn),其結(jié)構(gòu)如圖7-43所示。圖7-43結(jié)構(gòu)圖圖7-44所示為該電路的邏輯細(xì)節(jié)。圖7-44邏輯細(xì)節(jié)7.5計數(shù)器

7.5.1計數(shù)器(四位二進(jìn)制加法)

1.使用Verilog進(jìn)行描述

modulecnt4_1(qout,reset,clk);

output[3:0]qout;

inputclk,reset;

reg[3:0]qout;

always@(posedgeclk)

begin

if(reset)qout<=0;

else qout<=qout+1;

end

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-45所示。圖7-45RTL視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

modulecoun4_testbench;

regclk,reset;

wire[3:0]out;

parameterDELY=20;

always#(DELY/2)clk=~clk;

cnt4_1test_count(out,reset,clk);

initial

begin

clk=0;reset=0;

#(DELY*2) reset=1;

#DELY reset=0;

#(DELY*18)$finish;

end

endmodule

4.功能驗證

仿真結(jié)果如圖7-46所示。

從波形圖可看出:

(1)由于測試平臺一開始沒有給out賦值,故在沒有reset上升沿信號來臨前,out的值一直為x,沒有進(jìn)行計數(shù)。

(2)?reset為1時,qout被清零。

(3)輸出qout為4位向量,當(dāng)計數(shù)到4'b1111(即15)后,再計數(shù)的話會產(chǎn)生高位溢出,重新變?yōu)?'b0000。圖7-46功能仿真結(jié)果7.5.2計數(shù)器(帶置數(shù))

1.使用Verilog進(jìn)行描述

modulecnt4_2(clock,q,aclr,sload,data);

inputclock,aclr,sload;

output[3:0]q;

input[3:0]data;

reg[3:0]qaux;

always@(posedgeclockorposedgeaclr)

begin

if(aclr)

qaux<=4‘b0000;

elseif(sload)

qaux<=data;

elseqaux<=qaux+1;

end

assignq=qaux;

endmodule

2.綜合結(jié)果

綜合結(jié)果如圖7-47所示。圖7-47RTL視圖

3.測試平臺設(shè)計

`timescale1ns/1ns

moduletestbench;

regclock,sload,aclr;

reg[3:0]data;

wire[3:0]q;

parameterDELY=20;

always#(DELY/2)clock=~clock;

initial

begin

sload=0;clock=0;

repeat(15)

#DELYsload=$random;

endinitial

begin

aclr=0;

#DELYaclr=1;

#60aclr=0;

end

initial

begin

data=0;

repeat(15)

#DELYdata=$random;

end

initial

#300$finish;

cnt4_2test_cnt_42(clock,q,aclr,sload,data);

endmodule

4.功能驗證

仿真結(jié)果如圖7-48所示。圖7-48功能仿真結(jié)果7.5.374HC161設(shè)計

3.4.2節(jié)中討論了4位二進(jìn)制同步計數(shù)器的設(shè)計,以下代碼按照74HC161芯片功能表寫出。

//74HC161.v

moduleHC161(CP,CEP,CET,MRN,PEN,Dn,Qn,TC);

inputCP;

inputCEP,CET;

output[3:0]Qn;

inputMRN,PEN;

input[3:0]Dn;

outputTC;reg[3:0]qaux;

regTC;

always@(posedgeCP) //同步

begin

if(!MRN)

qaux<=4'b0000; //復(fù)位

elseif(!PEN)

qaux<=Dn; //并行輸入

elseif(CEP&CET)

qaux<=qaux+1; //計數(shù)

elseqaux<=qaux; //保持

end

always@(posedgeCP)

begin

if(qaux==4‘b1111) //進(jìn)位輸出

TC=1’b1;

elseTC=1‘b0;

end

assignQn=qaux;

endmodule

在后面章節(jié)的綜合實例中(7.7.1節(jié)),該設(shè)計將作為基本模塊進(jìn)行調(diào)用。在此不列出測試平臺和綜合結(jié)果,讀者可自行設(shè)計和驗證。

7.6有?限?狀?態(tài)?機(jī)

時序邏輯電路的顯著特點是內(nèi)部包含狀態(tài)寄存器,電路在不同的狀態(tài)之間切換。由于狀態(tài)寄存器數(shù)目有限,電路可以達(dá)到的狀態(tài)有限,因此,時序邏輯電路有時稱為有限狀態(tài)機(jī)(FiniteStateMachine,F(xiàn)SM)。

FSM是表示實現(xiàn)有限個離散狀態(tài)及其狀態(tài)之間的轉(zhuǎn)移等行為動作的數(shù)學(xué)模型。狀態(tài)機(jī)主要包含狀態(tài)及轉(zhuǎn)移兩方面的內(nèi)容。有限狀態(tài)機(jī)特別適合描述那些發(fā)生有先后順序或者有邏輯規(guī)律的事情,狀態(tài)機(jī)的本質(zhì)就是對具有邏輯順序或時序規(guī)律事件的一種描述方法。有限狀態(tài)機(jī)及其設(shè)計技術(shù)是數(shù)字邏輯電路設(shè)計中的重要組成部分,是實現(xiàn)高效率、高可靠性邏輯控制的重要途徑。大部分?jǐn)?shù)字邏輯電路都可以劃分為控制單元和數(shù)據(jù)單元(存儲單元)兩個組成部分。通常,控制單元的主體是一個狀態(tài)機(jī),它接收外部信號以及數(shù)據(jù)單元產(chǎn)生的狀態(tài)信息,產(chǎn)生控制信號序列。

狀態(tài)機(jī)設(shè)計是時序邏輯電路設(shè)計的一個子集,在數(shù)字邏輯電路設(shè)計的范疇中應(yīng)用面很廣。小到一個簡單的時序邏輯,大到復(fù)雜的微處理器,都適合用狀態(tài)機(jī)方法進(jìn)行描述。由于狀態(tài)機(jī)不僅僅是一種電路描述工具,它更是一種思想方法,而且狀態(tài)機(jī)的HDL表達(dá)方式比較規(guī)范,有章可循,因此很多設(shè)計者習(xí)慣用狀態(tài)機(jī)思想進(jìn)行邏輯設(shè)計,對各種復(fù)雜設(shè)計均套用狀態(tài)機(jī)的設(shè)計理念,從而提高設(shè)計的效率和穩(wěn)定性。7.6.1有限狀態(tài)機(jī)概述

1.基本概念

(1)狀態(tài):用于“記憶”在時鐘邊沿或相應(yīng)脈沖邊沿加載于電路的歷史輸入數(shù)據(jù)的組合情況,也叫狀態(tài)變量。狀態(tài)可以用名稱定義,也可以不用名稱。在邏輯設(shè)計中,使用狀態(tài)劃分邏輯順序和時序規(guī)律。

(2)狀態(tài)轉(zhuǎn)移:當(dāng)發(fā)生指定事件且滿足指定條件時,第一個狀態(tài)中的對象將執(zhí)行某些操作并進(jìn)入第二個狀態(tài),即“觸發(fā)”了轉(zhuǎn)移。將觸發(fā)轉(zhuǎn)移之前的狀態(tài)定義為“源狀態(tài)”(當(dāng)前狀態(tài),current_state),而觸發(fā)轉(zhuǎn)移之后的狀態(tài)定義為“目標(biāo)狀態(tài)”(下一狀態(tài),next_state)。狀態(tài)的轉(zhuǎn)換由時鐘信號驅(qū)動。圖7-49為狀態(tài)轉(zhuǎn)換圖例子。其中indata是轉(zhuǎn)移條件,Q1Q2是輸出信號,箭頭指向為轉(zhuǎn)移方向,S0、S1、S2、S3為狀態(tài)名稱(未作編碼)。狀態(tài)轉(zhuǎn)換表如表7-1所示。

(3)狀態(tài)編碼:狀態(tài)機(jī)的N種狀態(tài)通常需要用某種編碼來表示,即狀態(tài)編碼,又稱為狀態(tài)分配。編碼方式主要包括:

①順序二進(jìn)制碼:使用狀態(tài)向量的位數(shù)最少,但從一個狀態(tài)轉(zhuǎn)移到相鄰狀態(tài)時,可能會有多個位同時發(fā)生變化,易產(chǎn)生毛刺。

②格雷碼:在相鄰狀態(tài)的轉(zhuǎn)換中,每次只有一個比特位發(fā)生變化,消除了產(chǎn)生毛刺的問題,但不適用于有很多狀態(tài)跳轉(zhuǎn)的情況。圖7-49狀態(tài)轉(zhuǎn)換圖表7-1狀態(tài)轉(zhuǎn)換表③獨熱碼:指對任意給定的狀態(tài),狀態(tài)向量中僅有一位“1”,而其余為“0”,所以N狀態(tài)的狀態(tài)機(jī)需要N個觸發(fā)器。

④直接輸出型編碼:將狀態(tài)碼中的某些位直接輸出作為控制信號,要求狀態(tài)機(jī)各狀態(tài)的編碼作特殊的選擇,以適應(yīng)控制信號的要求,該編碼需要根據(jù)輸出變量來定制編碼。

如上表中的S0、S1、S2、S3狀態(tài),可用00、01、10、11(順序二進(jìn)制碼),也可以用00、01、11、10(格雷碼),或0001、0010、0100、1000(獨熱碼)進(jìn)行編碼。

2.狀態(tài)機(jī)的分類

根據(jù)不同的分類標(biāo)準(zhǔn),狀態(tài)機(jī)分為不同的種類:

(1)摩爾型(Moore)狀態(tài)機(jī)和米勒型(Mealy)狀態(tài)機(jī)。

摩爾型狀態(tài)機(jī):利用組合邏輯將當(dāng)前狀態(tài)譯碼轉(zhuǎn)化為輸出,其狀態(tài)只在全局時鐘信號改變時才改變。其最重要的特點就是將輸入與輸出信號隔離,所以輸出穩(wěn)定,能有效消除競爭冒險。如無特殊功能設(shè)計要求,摩爾狀態(tài)機(jī)是設(shè)計首選。

圖7-50中,“狀態(tài)譯碼”部分采用組合邏輯,故稱為“下一狀態(tài)組合邏輯”;“輸出譯碼”部分也采用組合邏輯,故稱為“輸出組合邏輯”。圖7-50摩爾型狀態(tài)機(jī)米勒型狀態(tài)機(jī):其輸出與當(dāng)前狀態(tài)和輸入都有關(guān),且對輸入的響應(yīng)發(fā)生在當(dāng)前時鐘周期,比摩爾型狀態(tài)機(jī)對輸入信號的響應(yīng)要早一個周期。所以輸入信號的噪聲(毛刺)會直接影響輸出信號,即有競爭冒險且不能消除。米勒型狀態(tài)機(jī)如圖7-51所示。圖7-51米勒型狀態(tài)機(jī)

(2)異步狀態(tài)機(jī)和同步狀態(tài)機(jī)。

異步狀態(tài)機(jī)是沒有確定時鐘的狀態(tài)機(jī),其狀態(tài)轉(zhuǎn)移不由唯一的時鐘邊沿觸發(fā),目前多數(shù)綜合工具在對異步狀態(tài)機(jī)進(jìn)行邏輯優(yōu)化時會胡亂地簡化邏輯,使綜合后的異步狀態(tài)機(jī)不能正常工作。因此,應(yīng)盡量不要使用綜合工具來設(shè)計異步狀態(tài)機(jī)。如果一定要設(shè)計異步狀態(tài)機(jī),建議采用原理圖輸入或?qū)嵗玫姆椒?,而不要用VerilogHDL輸入的方法。

為了能綜合出有效的電路,用VerilogHDL描述的狀態(tài)機(jī)應(yīng)明確地由唯一時鐘觸發(fā),稱之為同步狀態(tài)機(jī),它是設(shè)計復(fù)雜時序邏輯電路最有效、最常用的方法之一。

異步狀態(tài)機(jī)實現(xiàn)的功能通常都可以由同步狀態(tài)機(jī)來實現(xiàn)。

(3)單進(jìn)程、雙進(jìn)程和多進(jìn)程狀態(tài)機(jī)。

可以有三種不同的方式實現(xiàn)對狀態(tài)機(jī)的描述:

①三個模塊用一個進(jìn)程實現(xiàn),也就是說三個模塊均在一個always塊內(nèi),這種狀態(tài)機(jī)描述稱為單進(jìn)程有限狀態(tài)機(jī),它既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的寄存和輸出。

②每一個模塊分別用一個進(jìn)程實現(xiàn),也就是說三個模塊對應(yīng)著三個always塊,這種狀態(tài)機(jī)描述稱為三進(jìn)程有限狀態(tài)機(jī)。

③三個模塊對應(yīng)著兩個always塊,“狀態(tài)譯碼”、“輸出譯碼”分配在一個進(jìn)程中,“狀態(tài)寄存器”用另一個進(jìn)程描述。這種狀態(tài)機(jī)描述稱為雙進(jìn)程有限狀態(tài)機(jī)。7.6.2有限狀態(tài)機(jī)的設(shè)計方法

1.有限狀態(tài)機(jī)設(shè)計流程

狀態(tài)機(jī)的設(shè)計流程分為6個步驟,如圖7-52所示。

2.有限狀態(tài)機(jī)的一般結(jié)構(gòu)

一個有限狀態(tài)機(jī)的結(jié)構(gòu)(如圖7-53所示)總是可以被分為三部分。

(1)狀態(tài)譯碼:根據(jù)外部輸入的控制信號及當(dāng)前狀態(tài)(current_state)確定下一狀態(tài)(next_state)的取值,采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律。

(2)狀態(tài)寄存器:采用同步時序描述狀態(tài)轉(zhuǎn)移,負(fù)責(zé)狀態(tài)機(jī)運(yùn)行和在時鐘驅(qū)動下狀態(tài)轉(zhuǎn)換的過程。當(dāng)時鐘信號的有效邊沿到達(dá)時,主控時序過程將代表下一狀態(tài)的信號next_state中的內(nèi)容送入當(dāng)前狀態(tài)的信號current_state中,而信號next_state中的內(nèi)容完全由其它過程根據(jù)實際情況來決定。

(3)輸出譯碼:描述每個狀態(tài)的輸出。圖7-52有限狀態(tài)機(jī)設(shè)計流程圖7-53有限狀態(tài)機(jī)一般結(jié)構(gòu)

3.有限狀態(tài)機(jī)的建模

傳統(tǒng)的數(shù)字邏輯電路設(shè)計利用狀態(tài)轉(zhuǎn)換圖(StateTransmitionGraph,STG)及狀態(tài)轉(zhuǎn)換表進(jìn)行,適用于小型系統(tǒng)的設(shè)計,對于大型系統(tǒng)設(shè)計,狀態(tài)轉(zhuǎn)換圖及狀態(tài)轉(zhuǎn)換表會變得很笨重或不可工作。

有限狀態(tài)機(jī)的行為動作是由觸發(fā)器上的同步時序操作組成的,當(dāng)狀態(tài)機(jī)處于特定狀態(tài)時,狀態(tài)轉(zhuǎn)換圖表示由于引入輸入而產(chǎn)生的轉(zhuǎn)移,但STG無法直接顯示輸入數(shù)據(jù)時狀態(tài)的演變。這就需要引入另一種時序狀態(tài)機(jī)的描述形式——算法狀態(tài)機(jī)圖(ASM,AlgorithmicStateMachine)。

ASM圖是硬件算法的符號表示方法,可以方便地表示數(shù)字系統(tǒng)的順序操作。ASM圖不同于算法流程,它是一種時鐘驅(qū)動的流程圖。ASM圖不僅可以用來描述控制器的控制過程(即控制器的狀態(tài)轉(zhuǎn)換、轉(zhuǎn)換條件以及控制器輸出等),還指明了在被控制的數(shù)據(jù)處理器中應(yīng)該實現(xiàn)的操作,即ASM圖定義了整個數(shù)字系統(tǒng)。

ASM是時序狀態(tài)機(jī)功能的一種抽象,是模擬其行為特性的關(guān)鍵工具,它類似于軟件流程圖,但顯示的是計算動作(如寄存器操作)的時間順序,以及在狀態(tài)機(jī)輸入影響下發(fā)生的時序步驟。ASM描述的是狀態(tài)機(jī)的行為動作,而不是存儲元件所存儲的內(nèi)容。

1)?ASM符號

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論