第7章 基于EDA的時(shí)序電路設(shè)計(jì)、綜合及驗(yàn)證(7.1-7.5)_第1頁(yè)
第7章 基于EDA的時(shí)序電路設(shè)計(jì)、綜合及驗(yàn)證(7.1-7.5)_第2頁(yè)
第7章 基于EDA的時(shí)序電路設(shè)計(jì)、綜合及驗(yàn)證(7.1-7.5)_第3頁(yè)
第7章 基于EDA的時(shí)序電路設(shè)計(jì)、綜合及驗(yàn)證(7.1-7.5)_第4頁(yè)
第7章 基于EDA的時(shí)序電路設(shè)計(jì)、綜合及驗(yàn)證(7.1-7.5)_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 基于EDA的時(shí)序電路設(shè)計(jì)、綜合及驗(yàn)證學(xué)習(xí)基礎(chǔ):(1) 第3章介紹了時(shí)序邏輯電路的基礎(chǔ)知識(shí)。學(xué)習(xí)本章前,應(yīng)先掌握第3章的知識(shí)。(2) 第4章介紹了Verilog HDL的基本語(yǔ)法及簡(jiǎn)單設(shè)計(jì)的建模方法。(3) 5.55.7的綜合實(shí)例,介紹了EDA工具Libero IDE的使用。本章所有綜合和驗(yàn)證均基于Libero IDE環(huán)境實(shí)現(xiàn)。閱讀指南:l 本章講述內(nèi)容對(duì)應(yīng)第3章的知識(shí),把相應(yīng)功能通過(guò)Verilog HDL語(yǔ)言進(jìn)行實(shí)現(xiàn)。l 本章多處對(duì)同一個(gè)設(shè)計(jì)提供了多種設(shè)計(jì)思路和實(shí)現(xiàn)方法,并不是所有都是最優(yōu)的方法,只是方便對(duì)比和學(xué)習(xí)。讀者可根據(jù)情況選擇合適的方法。l 7.4、7.6、7.7中討論了第3章

2、中沒有涉及的理論知識(shí)和多個(gè)綜合例子,這些知識(shí)和例子綜合性強(qiáng),較難理解,但卻是數(shù)字系統(tǒng)實(shí)際開發(fā)中非常重要和實(shí)用的內(nèi)容,對(duì)于想進(jìn)入數(shù)字系統(tǒng)設(shè)計(jì)實(shí)踐階段的讀者來(lái)說(shuō)很有實(shí)際意義。7.1 鎖存器7.1.1 基本RS鎖存器(一)1使用Verilog進(jìn)行描述module rs_1(R,S,Q,Qn); input R,S; output Q,Qn;/ Qn表示,而不是時(shí)序電路中的現(xiàn)態(tài)。 reg Q; assign Qn=Q; always (R or S)/ 通過(guò)case語(yǔ)句,按真值表方式寫出程序邏輯。 case(R,S) 2b01:Q=1; 2b10:Q=0; 2b11:Q=1bx; endcaseend

3、module讀者在一開始看這種程序時(shí)很容易產(chǎn)生疑問:觸發(fā)器是存放數(shù)字電路中基本二進(jìn)制信號(hào)的單元電路,也就是寄存器變量Q的值是需要使用觸發(fā)器來(lái)存放,而觸發(fā)器是由鎖存器所構(gòu)成,用觸發(fā)器存放的Q來(lái)實(shí)現(xiàn)一個(gè)鎖存器顯然是不合理的。這就需要讀者理解在Verilog HDL中,采用行為風(fēng)格編寫代碼,是為了讓程序編寫者可用更趨向行為的方式更方便的編寫代碼,而不需考慮具體的物理細(xì)節(jié)。雖然在程序中指定要使用一個(gè)寄存器變量Q,但在使用EDA工具進(jìn)行綜合的時(shí)候,是不會(huì)也不可能用觸發(fā)器來(lái)實(shí)現(xiàn)鎖存器的,通過(guò)綜合結(jié)果可看出。2綜合結(jié)果第7章的工藝視圖不一定要給學(xué)生講,各位老師自行處理3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns

4、/1nsmodule testbench (); reg r,s; wire q,qn; rs_1 test_rs(r,s,q,qn); initial begin r=0;s=0; #10 s=1; #10 r=1; #10 s=0; #10 r=0; #10; endendmodule 4功能驗(yàn)證綜合前仿真綜合后仿真波形說(shuō)明:(1) 綜合前仿真(功能仿真)的結(jié)果中,在010ns和2030ns之間,q和qn都是x態(tài)。010ns之間產(chǎn)生的x態(tài)是因?yàn)閞和s的值為0,q保持原態(tài);2030ns之間產(chǎn)生的x態(tài)是因?yàn)閞和s的值為1,代碼中規(guī)定了處理為x態(tài)。(2) 綜合后仿真的結(jié)果中,2030ns之間q和

5、qn并不是x態(tài)(都為0),具體狀態(tài)視20ns時(shí)r、s、q的值而定。7.1.2 基本RS鎖存器(二)1使用Verilog進(jìn)行描述module rs_2(R,S,Q,Qn); input R,S; output Q,Qn; nor (Q,R,Qn); nor (Qn,S,Q);endmodule2綜合結(jié)果測(cè)試平臺(tái)與設(shè)計(jì)一相同。3功能驗(yàn)證波形分析:對(duì)比設(shè)計(jì)一和設(shè)計(jì)二的波形,可發(fā)現(xiàn)在設(shè)計(jì)一中,當(dāng)r,s為1時(shí),Q和Qn均為x,而在設(shè)計(jì)二中Q和Qn均為0。由于對(duì)RS鎖存器來(lái)說(shuō),R,S同為1是不允許的,故可忽略之。7.1.3 門控D鎖存器1使用Verilog進(jìn)行描述module latch_1_a(Clk,

6、D,Q); input Clk,D; output Q; reg Q; always (D or Clk)if (Clk) Q=D;endmodule程序說(shuō)明:(1)當(dāng)Clk為高電平時(shí),輸出Q的數(shù)值會(huì)隨D輸入的數(shù)據(jù)更新,而當(dāng)Clk為低電平時(shí)將保持其高電平時(shí)鎖入的數(shù)據(jù)。(2)Clk由0變?yōu)?時(shí),滿足if語(yǔ)句的條件,語(yǔ)句“Q=D”被執(zhí)行,將D的數(shù)值賦值給Q;Clk由1變?yōu)?時(shí)(無(wú)論D是否變化),都將執(zhí)行if語(yǔ)句,但此時(shí)Clk=0,語(yǔ)句Q=D不被執(zhí)行,于是Q保持原值不變。(3)如果敏感信號(hào)D發(fā)生變化,但Clk為0,Q保持原值不變;如果敏感信號(hào)D發(fā)生變化,且Clk為1,則執(zhí)行語(yǔ)句Q=D。2綜合結(jié)果3測(cè)

7、試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testbench_latch; reg clk,D;wire Q; initial begin clk=0; #50 clk=1; #100 clk=0; #100 clk=1; endinitial begin D=0; repeat(20) #20 D=$random; endlatch_1_a testbench_latch(clk,D,Q); endmodule4功能驗(yàn)證以下設(shè)計(jì)使用數(shù)據(jù)流風(fēng)格,設(shè)計(jì)思路、綜合結(jié)果、測(cè)試平臺(tái)、功能驗(yàn)證結(jié)果都相同。module latch_1_b(Clk,D,Q); input Clk,D; o

8、utput Q; assign Q=Clk?D:Q;endmodule課本沒有7.1.4 帶清零D鎖存器(一)1使用Verilog進(jìn)行描述module latch_1_c(Clk,D,Q,Rst); input Clk,D,Rst; output Q; reg Q; always (D or Clk or Rst)if (!Rst) Q=0; / 語(yǔ)句1else if (Clk) Q=D;endmodule程序說(shuō)明:(1) 程序采用具有時(shí)序語(yǔ)句特色的進(jìn)程語(yǔ)句,其中數(shù)據(jù)信號(hào)D、時(shí)鐘信號(hào)Clk和清0(復(fù)位)信號(hào)Rst都被列于敏感信號(hào)表中,實(shí)現(xiàn)了Clk的電平觸發(fā)特性和Rst的異步特性。(2) 異步清

9、0實(shí)現(xiàn)的效果,就是當(dāng)Rst一旦變成0,就馬上對(duì)輸出進(jìn)行清0,而不需要理會(huì)時(shí)鐘、輸入數(shù)據(jù)等的狀態(tài)。也就是Rst是優(yōu)先級(jí)最高的控制信號(hào),在代碼(語(yǔ)句1)中,通過(guò)“ifelse if”語(yǔ)句來(lái)實(shí)現(xiàn)優(yōu)先級(jí)控制。2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testbench_latch; reg clk,D,rst; wire Q; initial begin clk=0; #50 clk=1; #70 clk=0; #80 clk=1; end initial begin D=0; repeat(20) #20 D=$random; end initial begin rs

10、t=0; #60 rst=1; #80 rst=0; #40 rst=1; endlatch_1_c testbench_latch(clk,D,Q,rst); endmodule4功能驗(yàn)證7.1.5 帶清零D鎖存器(二)module latch_1_d(Clk,D,Q,Rst); input Clk,D,Rst; output Q; assign Q=(!Rst)?0:(Clk?D:Q); endmodule程序采用連續(xù)賦值語(yǔ)句,使用了條件操作符的嵌套。實(shí)現(xiàn)思路與設(shè)計(jì)(一)相同。 綜合結(jié)果與設(shè)計(jì)(一)基本相同,只有元件名稱稍有不同。測(cè)試平臺(tái)、功能驗(yàn)證結(jié)果與設(shè)計(jì)(一)相同。7.2 觸發(fā)器D觸發(fā)

11、器是最簡(jiǎn)單、最常用且最具代表性的時(shí)序電路,它是數(shù)字系統(tǒng)設(shè)計(jì)中最基本的底層時(shí)序單元,JK和T觸發(fā)器都由D觸發(fā)器構(gòu)建而來(lái)。7.2.1 D觸發(fā)器1使用Verilog進(jìn)行描述module d_ff_1(D,Clk,Q); input D,Clk;output Q;reg Q;always (posedge Clk)Q=D;endmodule程序說(shuō)明:(1)當(dāng)Clk的上升沿到達(dá)時(shí),立即將D送往輸出Q;若沒有Clk的上升沿到達(dá),Q的值保持不變;(2)該D觸發(fā)器的設(shè)計(jì)與門控D鎖存器設(shè)計(jì)非常類似,僅僅是由電平敏感變成了上升沿敏感。2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module tes

12、tbench; reg D,Clk; wire Q; initial Clk=0;書本中合并至下一個(gè)initial parameter clock_period=20; always #(clock_period/2) Clk=Clk; initial begin D=0; repeat(20) #20 D=$random; end d_ff_1 testbench_d(D,Clk,Q); initial #300 $finish;endmodule4功能驗(yàn)證7.2.2 D觸發(fā)器(異步清零邊沿觸發(fā))1使用Verilog進(jìn)行描述module d_ff_2(D,Clk,Q,Rst,En); inp

13、ut D,Clk,Rst,En; output Q; reg Q; always (posedge Clk or negedge Rst) begin if (!Rst) Q=0; else if (En) Q=D; endendmodule程序說(shuō)明:(1)所謂“異步”是指獨(dú)立于時(shí)鐘控制的復(fù)位控制端,即在任何時(shí)刻,只要Rst=0,D觸發(fā)器的輸出端即刻被清0,與時(shí)鐘狀態(tài)無(wú)關(guān);而時(shí)鐘使能端En的功能是:只有當(dāng)En=1時(shí),時(shí)鐘上升沿才有效。(2)無(wú)論Clk是否有跳變,只要Rst的下降沿到達(dá),即執(zhí)行Q =0,此后如果Rst一直保持為0,則無(wú)論是否有Clk的邊沿跳變信號(hào),Q均輸出0;如果Rst一直為1,

14、且Clk有上升沿到達(dá),則會(huì)執(zhí)行賦值操作Q=D,從而更新Q值。2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testbench; reg D,Rst,Clk,En;wire Q; d_ff_2 testbench_dff(D,Clk,Q,Rst,En); initial Clk=0; #400 $finish; parameter clock_period=20; always #(clock_period/2) Clk=Clk; initial begin D=0; repeat(20) #20 D=$random; end initial begin Rst=0;

15、 repeat(20) #20 Rst=$random; end initial begin En=0; repeat(20) #20 En=$random; endendmodule 4功能驗(yàn)證7.2.3 D觸發(fā)器(同步清零邊沿觸發(fā))module d_ff_3(D,Clk,Q,Rst); input D,Clk,Rst;output Q;reg Q;always (posedge Clk)if (Rst=1) Q=0;else if (Rst=0) Q=D;endmodule程序說(shuō)明:所謂“同步”是指某控制信號(hào)只有在時(shí)鐘信號(hào)有效時(shí)才起作用。信號(hào)敏感表列表中只放了對(duì)Clk上升沿的敏感表述,即此

16、過(guò)程中的所有其它輸入信號(hào)都相對(duì)于時(shí)鐘Clk而同步。7.2.4 JK觸發(fā)器1使用Verilog進(jìn)行描述JK觸發(fā)器比RS觸發(fā)器增加了翻轉(zhuǎn)功能,以下設(shè)計(jì)與RS觸發(fā)器類似。module jk_ff(J,K,Clk,Q,Qn); input J,K,Clk; output Q,Qn; reg Q; assign Qn=Q; always (posedge Clk) case(J,K) 2b00:Q=Q; 2b01:Q=1b0; 2b10:Q=1b1; 2b11:Q=Q; default:Q=1bx; endcaseendmodule2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)測(cè)試平臺(tái)的設(shè)計(jì)與RS觸發(fā)器的方法一致,只需把R,

17、S改成J,K,修改對(duì)接模塊名稱即可。timescale 1ns/1ns module testbench; reg j,k,Clk; wire Q,Qn; initial Clk=0; parameter clock_period=20; always #(clock_period/2) Clk=Clk; initial begin j=0; repeat(20) #20 j=$random; end initial begin k=0; repeat(20) #20 k=$random; end initial #300 $finish; jk_ff testbench_jk(j,k,Clk

18、,Q,Qn); endmodule4功能驗(yàn)證7.2.5 RS觸發(fā)器1使用Verilog進(jìn)行描述以下設(shè)計(jì)是在RS鎖存器設(shè)計(jì)(一)的基礎(chǔ)上,加入上升沿控制而寫成。加入了時(shí)鐘信號(hào)Clk,改變了敏感事件為Clk上升沿觸發(fā)。module rs_ff(R,S,Clk,Q,Qn); input R,S,Clk;output Q,Qn;reg Q;assign Qn=Q;always (posedge Clk) case(R,S) 2b01:Q=1; 2b10:Q=0; 2b11:Q=1bx; endcaseendmodule2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testb

19、ench; reg R,S,Clk; wire Q,Qn; initial Clk=0;parameter clock_period=20; always #(clock_period/2) Clk=Clk; initial begin R=0; repeat(20)/ 語(yǔ)句1 #20 R=$random; endinitial begin S=0; repeat(20) / 語(yǔ)句2 #20 S=$random; endrs_ff testbench_rs(R,S,Clk,Q,Qn); initial #300 $finish; / 語(yǔ)句3endmodule程序說(shuō)明:語(yǔ)句1和語(yǔ)句2要求生成20

20、個(gè)隨機(jī)的R和S,共需要400個(gè)單位時(shí)間,但語(yǔ)句3卻要求在單位時(shí)間300時(shí)結(jié)束,那么程序會(huì)按哪一個(gè)要求進(jìn)行呢?答案可從以下的功能驗(yàn)證波形中看到,程序會(huì)在單位時(shí)間300時(shí)結(jié)束。4功能驗(yàn)證綜合前仿真綜合后仿真波形分析:從波形圖上看,綜合前和綜合后的Q輸出結(jié)果不一樣,綜合前仿真的Q輸出有很多的x態(tài)。該現(xiàn)象與RS鎖存器設(shè)計(jì)一中出現(xiàn)的現(xiàn)象是同一原因,請(qǐng)參考前面(RS鎖存器設(shè)計(jì)一)的說(shuō)明。7.2.6 T觸發(fā)器(異步清零)1使用Verilog進(jìn)行描述module t_ff(T,Clk,Rst,Q,Qn); input T,Clk,Rst;output Q,Qn;reg Q;assign Qn=Q;always

21、 (posedge Clk or posedge Rst) if(Rst) Q=0; else if(T) Q=Q;endmodule2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testbench_t; reg T,Clk,Rst;wire Q,Qn; parameter clock_period=20;initial Clk=0;always #(clock_period/2) Clk=Clk; initial begin Rst=0; #30 Rst=1; #30 Rst=0; #30 Rst=1; #30 Rst=0; endinitial begin T=

22、0; repeat(20) #20 T=$random; endt_ff testbench_t(T,Clk,Rst,Q,Qn); initial #400 $finish;endmodule4功能驗(yàn)證波形分析:假設(shè)Rst一直不產(chǎn)生上升沿變化,那么會(huì)發(fā)生什么事情呢?如果Rst不產(chǎn)生上升沿變化,則程序代碼不被執(zhí)行,無(wú)論T和Clk如何變化,Q和Qn將一直保持x值。故一般應(yīng)進(jìn)行數(shù)據(jù)的初始化處理。7.3 寄存器7.3.1 基本寄存器以下討論由4位D觸發(fā)器構(gòu)成的4位寄存器。對(duì)于基本寄存器,數(shù)據(jù)或代碼只能并行送入寄存器中,需要時(shí)也只能并行輸出。1使用Verilog進(jìn)行描述module reg4_1(Clr

23、,Clk,D,Q);output 3:0Q;input 3:0 D;input Clk,Clr;reg3:0 Q;always(posedge Clk or negedge Clr) begin if(!Clr) Q=0; else Q=D;endendmodule2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testbench; reg Clr,Clk;reg3:0 D; wire3:0 Q; initial Clk=0; parameter clock_period=20; always #(clock_period/2) Clk=Clk;initial beg

24、in D=0; repeat(20) #20 D=$random; endinitial begin Clr =0; repeat(20) #20 Clr =$random; endreg4_1 test_reg(Clr,Clk, D, Q); initial #400 $finish;endmodule 4功能驗(yàn)證說(shuō)明:圖中Q的輸出有些地方為空白,是由于不夠位置顯示,放大波形即可看到具體的值。7.3.2 基本寄存器(異步清零異步置1)1使用Verilog進(jìn)行描述以下的設(shè)計(jì)具有異步清零端(Aclr)和異步置1端(Aset),異步清零的優(yōu)先級(jí)比異步置1高。module reg4_2 (Data,

25、 Aclr, Aset, Clock, Q); input 3:0 Data; input Aclr; input Aset; input Clock; output 3:0 Q; reg 3:0 Q; always (posedge Clock or negedge Aclr or posedge Aset) if (!Aclr) Q = 4b0000; else if (Aset) Q = 4b1111; else Q = Data;endmodule2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1ns module testbench; reg 3:0 Data;reg Aclr,

26、Aset,Clock;wire 3:0 Q; initial Clock=0;parameter clock_period=20;always #(clock_period/2) Clock=Clock;initial begin Data=0;repeat(20) #20 Data=$random; endinitial begin Aclr=0;repeat(20) #20 Aclr=$random; endinitial begin Aset=0; #200 Aset=1; endreg4_2 test_reg(Data, Aclr, Aset, Clock, Q); initial #

27、300 $finish;endmodule程序說(shuō)明:由于加入了多個(gè)控制信號(hào),故測(cè)試平臺(tái)中對(duì)控制信號(hào)的狀態(tài)進(jìn)行合理搭配也是很重要的,否則可能會(huì)出現(xiàn)某些控制信號(hào)組合情況未被測(cè)試的情況。因此在測(cè)試平臺(tái)編寫過(guò)程中應(yīng)不斷的根據(jù)實(shí)際情況進(jìn)行調(diào)整。4功能驗(yàn)證7.3.3 移位寄存器(并入并出單向左移)1使用Verilog進(jìn)行描述module shift_reg_pipo (Data, Enable, Shiften, Shiftin, Aclr, Clock, Q); input 3:0 Data;/ 4位并行輸入數(shù)據(jù) input Aclr;/ 異步清0端 input Enable;/ 置數(shù)使能端 input

28、 Shiften;/ 移位使能控制 input Shiftin;/ 串行輸入端 input Clock;/ 時(shí)鐘信號(hào),上升沿控制 output 3:0 Q;/ 并行輸出端 reg 3:0 Qaux;/ 臨時(shí)變量 always (posedge Aclr or posedge Clock) begin if (Aclr) Qaux = 0; else if (Enable) Qaux = Data; else if (Shiften) Qaux = Qaux2:0, Shiftin;/ 通過(guò)連接運(yùn)算符實(shí)現(xiàn)左移輸入 end assign Q = Qaux;endmodule程序說(shuō)明:(1) Acl

29、r(異步清0端)的優(yōu)先級(jí)最高,一旦Aclr變?yōu)榈碗娖剑瑒t輸出馬上清0。(2) Enable(并行輸入使能控制端)的優(yōu)先級(jí)比Shiften(移位使能控制端)高,當(dāng)Aclr不為1時(shí),時(shí)鐘上升沿到來(lái),只要Enable為1,輸出Q得到并行輸入Data的值。(3) 當(dāng)Aclr和Enable不為1時(shí),時(shí)鐘上升沿到來(lái),如果Shiften為1,則左移輸入Shiftin的數(shù)據(jù)(串行輸入)。2綜合結(jié)果7.3.4 移位寄存器(并入串出單向左移)1使用Verilog進(jìn)行描述module shift_reg_piso (Data, Enable, Shiften, Shiftin, Aclr, Clock, Shift

30、out); input 1:0 Data; input Aclr; input Enable; input Shiften; input Shiftin; input Clock; output Shiftout; reg 1:0 Qaux; always (posedge Aclr or posedge Clock) begin if (Aclr) Qaux = 0; else if (Enable) Qaux = Data; else if (Shiften) Qaux = Qaux0, Shiftin;/ 語(yǔ)句1 end assign Shiftout = Qaux1;/ 語(yǔ)句2endm

31、odule程序說(shuō)明:(1) 程序?qū)崿F(xiàn)2位移位寄存器,串行輸出左向移位。(2) 程序邏輯與設(shè)計(jì)一的一致,只是在最后輸出的時(shí)候,設(shè)計(jì)一是并行輸出整個(gè)結(jié)果,而設(shè)計(jì)二是輸出最高位,達(dá)到串行輸出的結(jié)果。(3) 如果要改為右移,語(yǔ)句1應(yīng)改為“Qaux = Shiftin, Qaux1;”,并且語(yǔ)句2改為輸出最低位Qaux0。2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)(1)timescale 1ns/1ns module testbench; reg 1:0 Data;reg Aclr,Enable,Shiften,Shiftin,Clock;wire Shiftout; parameter clock_period=20;

32、always #(clock_period/2) Clock=Clock;initial begin Data=0; repeat(20) #20 Data=$random; endinitial begin Clock=0;/ 時(shí)鐘信號(hào)的初始化,可放在任一個(gè)initial過(guò)程中 Aclr=0; #40 Aclr=1; #100 Aclr=0; endinitial begin Enable=0; #100 Enable=1; #100 Enable=0; endinitial begin Shiften=0; repeat(20) #20 Shiften=$random; endinitia

33、l begin Shiftin=0; repeat(10) #40 Shiftin=$random; endshift_reg_piso testbench_piso(Data, Enable, Shiften, Shiftin, Aclr, Clock, Shiftout); initial #400 $finish;endmodule4功能驗(yàn)證(1)為了查看效果更完整,要把Qaux也輸出顯示到Wave窗口中,需要在“sim”窗口中選擇“testbench_piso”實(shí)例,然后在“objects”窗口中找到Qaux變量,把該變量設(shè)置在Wave窗口中顯示。如果不把Qaux加入到波形中,光從Sh

34、iftout是很難看出其移位過(guò)程的。從圖中可看出,在時(shí)鐘控制下(上升沿):l 清零端Aclr為1時(shí),輸出為0;l Aclr為0,Enable(置數(shù)使能端)為1時(shí),輸出Data的最高位;l Aclr為0,Enable為0,Shiften(移位使能端)為1時(shí),根據(jù)Shiftin的輸入進(jìn)行左移位;5測(cè)試平臺(tái)設(shè)計(jì)(2)在測(cè)試平臺(tái)設(shè)計(jì)(1)中,對(duì)于每一個(gè)控制信號(hào),要么指定變化的時(shí)間,要么周期性用隨機(jī)數(shù)生成,這樣可以產(chǎn)生不同的測(cè)試信號(hào)組合。但這樣的設(shè)計(jì)很容易產(chǎn)生一些無(wú)意義的狀態(tài)組合和有些情況未能列出。在測(cè)試平臺(tái)設(shè)計(jì)(2)中,Aclr和Clock的信號(hào)單獨(dú)產(chǎn)生;另外3個(gè)控制和輸入信號(hào)(Enable,Shif

35、ten,Shiftin)則通過(guò)循環(huán)方法,生成所有可能出現(xiàn)的組合情況;Data輸入則隨機(jī)產(chǎn)生。timescale 1ns/1ns module testbench2; reg 1:0 Data;reg Aclr,Enable,Shiften,Shiftin,Clock;wire Shiftout; reg2:0 CtrlVec;integer I;parameter period=20;always #(period/2) Clock=Clock;initial begin Clock=0;Aclr =0; #160 Aclr =1; endinitial begin Data=0; repea

36、t(12) #20 Data=$random; endinitial begin for (I = 0 ; I =11 ; I = I + 1) beginCtrlVec=I;Enable,Shiften,Shiftin= CtrlVec;#20; endendshift_reg_piso testbench_piso2(Data, Enable, Shiften, Shiftin, Aclr, Clock, Shiftout); initial #240 $finish;endmodule程序說(shuō)明:(1) I的循環(huán)只需要8次即可列舉出Enable,Shiften,Shiftin三個(gè)控制信號(hào)的

37、8種狀態(tài)組合,但為了測(cè)試Aclr為0時(shí)的結(jié)果,增加了4次循環(huán)(I等于811時(shí))。(2) Enable,Shiften,Shiftin的組合情況從000111變化后,又重新從000開始,因?yàn)楫?dāng)I為8(即b1000)時(shí),Enable,Shiften,Shiftin分別獲得了低位的0,而最高位的1沒有被任何變量獲得,這是一個(gè)常用技巧。6功能驗(yàn)證(2)波形說(shuō)明:(1) 該波形所顯示的變量是“testbench_piso2”實(shí)例中的變量,操作方法是:選擇“sim”窗口中“testbench_piso”實(shí)例,然后在“objects”窗口中,設(shè)置在Wave窗口中顯示的相應(yīng)變量。(2) 從Shiftout的波

38、形來(lái)看,產(chǎn)生了很少的輸出,并且很難從Shiftout的波形看出移位、并行輸入的變化過(guò)程。(3) 具體的移位和并行輸入的結(jié)果,要從Qaux波形上才能看出:Qaux第1、2次的變化,是移位操作得到的結(jié)果;第3、4次的值,是并行輸入得到的結(jié)果;第5次的值,是異步清0的結(jié)果。7.3.5 移位寄存器(串入并出單向左移)1使用Verilog進(jìn)行描述module shift_reg_sipo (Shiften, Shiftin, Aclr, Clock, Q); input Shiften; input Shiftin; input Aclr; input Clock; output 3:0 Q; reg

39、3:0 Qaux; always (posedge Aclr or posedge Clock) begin if (Aclr) Qaux = 0; else if (Shiften) Qaux = Qaux2:0, Shiftin; end assign Q = Qaux;endmodule2綜合結(jié)果7.3.6 移位寄存器(串入串出單向左移)1使用Verilog進(jìn)行描述module shift_reg_siso (Shiften, Shiftin, Aclr, Clock, Shiftout); input Shiften; input Shiftin; input Aclr; input

40、Clock; output Shiftout; reg 3:0 Qaux; always (posedge Aclr or posedge Clock) begin if (Aclr) Qaux = 0; else if (Shiften) Qaux = Qaux2:0, Shiftin; end assign Shiftout = Qaux3;endmodule2綜合結(jié)果7.4 寄存器傳輸寄存器傳輸(Register Transfer Level,RTL)是數(shù)字邏輯電路的一種設(shè)計(jì)方法,利用寄存器傳輸設(shè)計(jì)時(shí),必須詳細(xì)說(shuō)明數(shù)據(jù)在不同寄存器之間處理及傳輸?shù)倪^(guò)程,一般使用中等規(guī)模的功能模塊作為基本單

41、元。7.4.1 基本概念寄存器存儲(chǔ)的數(shù)據(jù)的運(yùn)動(dòng)及完成的處理稱為寄存器傳輸操作(Register Transfer Operation),又稱為微操作(microoperation)。對(duì)于n位寄存器,下標(biāo)從0到n-1。小端(Little endian):0位在最右端,n-1位在最左端。大端(Big endian):0位在最左端,n-1位在最右端。最常用的寄存器圖示方法如圖7-46所示:R7 6 5 4 3 2 1 0R2150(a)寄存器R(c)編號(hào)16位寄存器(b)8位寄存器的單獨(dú)位PC(H)150(d)16位寄存器(分2部分)PC(H)8 7常用寄存器以“”表示從一個(gè)寄存器到另一個(gè)寄存器的數(shù)

42、據(jù)傳輸。例如R2R1,表示將寄存器R1的內(nèi)容傳至寄存器R2,其中,R2表示目標(biāo)寄存器,R1表示源寄存器。所有的寄存器傳輸操作都可以用相應(yīng)的硬件來(lái)實(shí)現(xiàn)。如K1:R2R1,表示若K1=1,則R2R1,對(duì)應(yīng)的電路和波形如圖7-47所示.寄存器傳輸操作7.4.2 微操作種類有以下4種微操作:1、傳輸:從一個(gè)寄存器到另一個(gè)寄存器傳輸數(shù)據(jù);2、算術(shù)運(yùn)算:寄存器存儲(chǔ)數(shù)據(jù)的算術(shù)運(yùn)算;3、邏輯運(yùn)算:寄存器存儲(chǔ)數(shù)據(jù)的位運(yùn)算;4、移位:寄存器存儲(chǔ)數(shù)據(jù)的移位。7.4.3 單寄存器微操作所有微操作的結(jié)果均只涉及一個(gè)目標(biāo)寄存器,且該寄存器又作為源寄存器使用。由于寄存器與微操作之間的緊密耦合,實(shí)現(xiàn)微操作的組合邏輯部分成為寄

43、存器的一部分,稱為專用邏輯(dedicated logic),而使用多目標(biāo)寄存器的情況則稱為共享邏輯(shared logic)??紤]一個(gè)寄存器在不同時(shí)間從不同的數(shù)據(jù)源接收數(shù)據(jù)的情況,K1:R0R1,K1#K2:R0R2表示根據(jù)K1、K2的值選擇將寄存器R1或R2的內(nèi)容傳至目標(biāo)寄存器R0,可以利用數(shù)據(jù)選擇器實(shí)現(xiàn),其結(jié)構(gòu)如圖7-48所示:結(jié)構(gòu)圖如圖所示為該電路的邏輯細(xì)節(jié):邏輯細(xì)節(jié)7.5 計(jì)數(shù)器7.5.1 計(jì)數(shù)器(四位二進(jìn)制加法)1使用Verilog進(jìn)行描述module cnt4_1(qout,reset,clk);output3:0 qout;input clk,reset;reg3:0 qout;always (posedge clk)beginif (reset) qout=0; else qout=qout+1; endendmodule2綜合結(jié)果3測(cè)試平臺(tái)設(shè)計(jì)timescale 1ns/1nsmodule coun4_testbench;reg clk,reset;wire3:0 out;parameter DELY=20;cnt4_1 test_count(out,reset,clk);always #(DELY/2) clk = clk;initialbeginclk =0; reset=0;

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論