EDA技術(shù)及應(yīng)用-Verilog HDL版第6章_第1頁(yè)
EDA技術(shù)及應(yīng)用-Verilog HDL版第6章_第2頁(yè)
EDA技術(shù)及應(yīng)用-Verilog HDL版第6章_第3頁(yè)
EDA技術(shù)及應(yīng)用-Verilog HDL版第6章_第4頁(yè)
EDA技術(shù)及應(yīng)用-Verilog HDL版第6章_第5頁(yè)
已閱讀5頁(yè),還剩330頁(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)介

6.18位加法器的設(shè)計(jì)

6.28位乘法器的設(shè)計(jì)

6.38位除法器的設(shè)計(jì)

6.4可調(diào)信號(hào)發(fā)生器的設(shè)計(jì)

6.5PWM信號(hào)發(fā)生器的設(shè)計(jì)

6.6數(shù)字頻率計(jì)的設(shè)計(jì)

6.7數(shù)字秒表的設(shè)計(jì)

6.8交通燈信號(hào)控制器的設(shè)計(jì)

6.9高速PID控制器的設(shè)計(jì)

6.10FIR濾波器的設(shè)計(jì)

6.11CORDIC算法的應(yīng)用設(shè)計(jì)

6.12鬧鐘系統(tǒng)的設(shè)計(jì)

第6章VerilogHDL設(shè)計(jì)應(yīng)用實(shí)例

1.系統(tǒng)設(shè)計(jì)思路

加法器是數(shù)字系統(tǒng)中的基本邏輯器件,減法器和硬件乘法器都可由加法器來(lái)構(gòu)成。多位加法器的構(gòu)成有兩種方式:并行進(jìn)位和串行進(jìn)位。

并行進(jìn)位方式設(shè)有進(jìn)位產(chǎn)生邏輯,運(yùn)算速度較快;串行進(jìn)位方式是將全加器級(jí)聯(lián)構(gòu)成多位加法器。6.18位加法器的設(shè)計(jì)并行進(jìn)位加法器通常比串行級(jí)聯(lián)加法器占用更多的資源。隨著位數(shù)的增加,相同位數(shù)的并行加法器與串行加法器的資源占用差距也越來(lái)越大。因此,在工程中使用加法器時(shí),要在速度和容量之間尋找平衡點(diǎn)。

實(shí)踐證明,4位二進(jìn)制并行加法器和串行級(jí)聯(lián)加法器占用幾乎相同的資源。這樣,多位加法器由4位二進(jìn)制并行加法器級(jí)聯(lián)構(gòu)成是較好的折中選擇。本設(shè)計(jì)中的8位二進(jìn)制并行加法器即是由兩個(gè)4位二進(jìn)制并行加法器級(jí)聯(lián)而成的,其電路原理圖如圖6.1所示。圖6.18位加法器電路原理圖2.VerilogHDL源程序

1)?4位二進(jìn)制并行加法器的源程序adder4b.v

//4位二進(jìn)制并行加法器adder4b.v

moduleadder4b(a4,b4,c4,s4,co4);

input[3:0]a4,b4;

inputc4;

output[3:0]s4;

outputco4;

assign{co4,s4}=a4+b4+c4;

endmodule2)?8位二進(jìn)制加法器的源程序adder8b.v

//8位二進(jìn)制并行加法器adder8b.v

moduleadder8b(a8,b8,c8,s8,co8);

input[7:0]a8,b8;

inputc8;

output[7:0]s8;

outputco8;

wiresc;

adder4bu1(.a4(a8[3:0]),.b4(b8[3:0]),.c4(c8),.s4(s8[3:0]),.co4(sc));

adder4bu2(.a4(a8[7:4]),.b4(b8[7:4]),.c4(sc),.s4(s8[7:4]),.co4(co8));

endmodule

3.仿真結(jié)果驗(yàn)證

在程序調(diào)試和仿真時(shí),要使用自底向上的方法進(jìn)行,也就是對(duì)于含有多個(gè)模塊的設(shè)計(jì),要先從底層模塊進(jìn)行調(diào)試和仿真,再進(jìn)行更高層次模塊的調(diào)試和仿真,最后進(jìn)行頂層模塊的調(diào)試與仿真。圖6.2和圖6.3分別是使用QuartusⅡ8.0對(duì)adder4b和adder8b進(jìn)行時(shí)序仿真的結(jié)果。從仿真結(jié)果可以看出,從輸入到輸出有一個(gè)時(shí)延,時(shí)間大概為幾個(gè)納秒。同時(shí)要經(jīng)過(guò)一個(gè)大概幾個(gè)納秒的不穩(wěn)定狀態(tài)或過(guò)渡過(guò)程,系統(tǒng)才達(dá)到一個(gè)穩(wěn)定而正確的結(jié)果。經(jīng)過(guò)對(duì)各組輸入與輸出數(shù)據(jù)的分析,確認(rèn)仿真結(jié)果是正確的。圖6.2adder4b的時(shí)序仿真結(jié)果圖6.3adder8b的時(shí)序仿真結(jié)果

4.邏輯綜合分析

圖6.4是使用QuartusⅡ8.0進(jìn)行邏輯綜合后adder8b的RTL視圖,圖6.5是對(duì)adder8b的RTL視圖中的adder4b進(jìn)行展開(kāi)后的視圖。圖6.6是使用QuartusⅡ8.0對(duì)adder8b進(jìn)行邏輯綜合后的資源使用情況。圖6.4adder8b綜合后的RTL視圖圖6.5adder8b的RTL視圖中的adder4b展開(kāi)后的視圖圖6.6adder8b邏輯綜合后的資源使用情況

5.硬件邏輯驗(yàn)證

若使用GW48-CKEDA實(shí)驗(yàn)開(kāi)發(fā)系統(tǒng)進(jìn)行硬件邏輯驗(yàn)證,可選擇實(shí)驗(yàn)電路結(jié)構(gòu)圖NO.1,由5.2節(jié)的實(shí)驗(yàn)電路結(jié)構(gòu)圖NO.1和圖6.1確定引腳的鎖定。如可取實(shí)驗(yàn)電路結(jié)構(gòu)圖的PIO3~PIO0接a8[3:0]、PIO7~PIO4接a8[7:4]、PIO11~PIO8接b8[3:0]、PIO15~PIO12接b8[7:4]、PIO49接c8。此加法器的被加數(shù)a8和加數(shù)b8分別由鍵2與鍵1、鍵4與鍵3輸入,加法器的最低位進(jìn)位c8由鍵8輸入,計(jì)算結(jié)果將分別通過(guò)PIO23~PIO20、PIO19~PIO16輸出,并顯示于數(shù)碼管6(高4位)和數(shù)碼管5(低4位),溢出進(jìn)位由PIO39輸出,當(dāng)有進(jìn)位時(shí),結(jié)果顯示于發(fā)光管D8。

1.系統(tǒng)設(shè)計(jì)思路

一般乘法器采用各種不同的設(shè)計(jì)技巧,綜合后的電路亦有不同的執(zhí)行效能。本節(jié)將介紹移位乘法器、定點(diǎn)乘法器及布斯(booth)乘法器的設(shè)計(jì)。6.28位乘法器的設(shè)計(jì)

1)?8位移位乘法器

不帶符號(hào)的8位乘法器若采用連加方式,則最差情況需要28-1次方能完成計(jì)算;而采用移位式則最多僅需要8次即可完成乘法計(jì)算。移位式8位乘法器計(jì)算流程如下:

(1)輸入8位被乘數(shù)a及乘數(shù)b時(shí),程序會(huì)先判斷輸入值:

●若乘數(shù)及被乘數(shù)有一個(gè)為0,則輸出乘積為0;

●若被乘數(shù)與乘數(shù)中有一個(gè)為1,則輸出乘積為被乘數(shù)或乘數(shù);

●若被乘數(shù)或乘數(shù)皆非0或1,則利用算法求得乘積。先預(yù)設(shè)乘積p為0,位n?=?0,0≤位n<8。

算法求乘積的方法是:利用判斷乘數(shù)中的第n位是否為1的方法進(jìn)行計(jì)算。若為1,則乘積緩存器等于被乘數(shù)左移n位,積數(shù)等于乘積緩存器加積數(shù);若為0,則位n=位n+1。如此判斷8次即可獲得乘積。

(2)當(dāng)乘數(shù)和被乘數(shù)均為8位時(shí),以for循環(huán)執(zhí)行8次即可完成乘法計(jì)算。

2)?8位定點(diǎn)乘法器

一般作乘法運(yùn)算時(shí),均以乘數(shù)的每一位數(shù)乘以被乘數(shù)后,所得部分乘積再與乘數(shù)每一位數(shù)的位置對(duì)齊后相加。經(jīng)過(guò)對(duì)二進(jìn)制乘法運(yùn)算規(guī)律的總結(jié),定點(diǎn)乘法運(yùn)算中進(jìn)行相加的運(yùn)算規(guī)則為:

(1)當(dāng)乘數(shù)的位數(shù)字為1時(shí),可將被乘數(shù)的值放置適當(dāng)?shù)奈恢米鳛椴糠殖朔e。

(2)當(dāng)乘數(shù)的位數(shù)字為0時(shí),可將0放置適當(dāng)?shù)奈恢米鳛椴糠殖朔e。

(3)在硬件中可利用and門(mén)做判斷,如1010×1,乘數(shù)1和每一個(gè)被乘數(shù)的位都作and運(yùn)算,其結(jié)果為1010,只需用and門(mén)就可得到部分乘積。

(4)當(dāng)部分乘積都求得后,再用加法器將上述部分乘積相加完成乘積運(yùn)算。

3)?8位布斯乘法器

布斯(booth)乘法算法,是先將被乘數(shù)的最低位加設(shè)一虛擬位,開(kāi)始時(shí)虛擬位設(shè)為0,并存放于被乘數(shù)中。根據(jù)最低位與虛擬位構(gòu)成的布斯編碼的不同,分別執(zhí)行如下四種運(yùn)算:

(1)?00:不執(zhí)行運(yùn)算,乘積緩存器直接右移1位。

(2)?01:將乘積加上被乘數(shù)后右移1位。

(3)?10:將乘積減去被乘數(shù)后右移1位。

(4)?11:不執(zhí)行運(yùn)算,乘積緩存器直接右移1位。2.?VerilogHDL源程序

1)?8位移位乘法器

//8位移位乘法器mult8s.v

modulemult8s(p,a,b);

input[7:0]a,b; //a為被乘數(shù),b為乘數(shù)

output[15:0]p; //16位乘積

reg[15:0]rp,temp;

reg[7:0]ra,rb;

reg[3:0]rbn;

always@(aorb)

begin

ra=a;rb=b;

if(a==0||b==0) //當(dāng)a=0或b=0時(shí),rp=0

rp=16'b0;

elseif(a==1) //當(dāng)a=1時(shí),rp=rb

rp=rb;

elseif(b==1) //當(dāng)b=1時(shí),rp=ra

rp=ra;

else

begin

rp=15'b0;

for(rbn=0;rbn<8;rbn=rbn+1)

if(rb[rbn]==1'b1)

begin

temp=ra<<rbn; //左移rbn位

rp=rp+temp;

end

end

end

assignp=rp;

endmodule2)

8位定點(diǎn)乘法器

//8位定點(diǎn)乘法器mult8_fp.v

modulemult8_fp(p,a,b);

parameterwidth=8; //設(shè)定數(shù)據(jù)寬度為8位

input[width-1:0]a; //被乘數(shù)

input[width-1:0]b; //乘數(shù)

output[width+width-1:0]p; //乘積

reg[width-1:0]pp; //設(shè)定乘積的暫存器

reg[width-1:0]ps; //設(shè)定和的暫存器

reg[width-1:0]pc; //設(shè)定進(jìn)位的暫存器

reg[width-1:0]ps1,pc1;

reg[width-1:0]ppram[width-1:0]; //設(shè)定乘積的暫存器

reg[width-1:0]psram[width:0]; //設(shè)定和的暫存器

reg[width-1:0]pcram[width:0]; //設(shè)定進(jìn)位的暫存器

reg[width+width-1:0]temp; //設(shè)定乘積的暫存器

integerj,k;

always@(aorb) //讀取乘數(shù)與被乘數(shù)

begin

for(j=0;j<width;j=j+1)

begin

for(k=0;k<width;k=k+1)

pp[k]=a[k]&b[j]; //利用and完成部分乘積

ppram[j]=pp[width-1:0]; //存入乘積緩存器中

pc[j]=0; //將進(jìn)位pc設(shè)定為0

end

pcram[0]=pc[width-1:0];

psram[0]=ppram[0]; //將ppram的列設(shè)定給pp

pp=ppram[0];

temp[0]=pp[0];

for(j=1;j<width;j=j+1)

begin

pp=ppram[j]; //將ppram的列設(shè)定給pp

ps=psram[j-1];

pc=pcram[j-1];

for(k=0;k<width-1;k=k+1)

begin

ps1[k]=pp[k]^pc[k]^ps[k+1];//全加器之和與進(jìn)位運(yùn)算

pc1[k]=pp[k]&pc[k]|pp[k]&ps[k+1]|pc[k]&ps[k+1];//

end

ps1[width-1]=pp[width-1]; //將pp乘積指定給ps1

pc1[width-1]=0;//設(shè)定每列的最后一個(gè)進(jìn)位都為0

temp[j]=ps1[0]; //將每個(gè)ps1(0)設(shè)定給乘積

psram[j]=ps1[width-1:0];//將ps1存到psram數(shù)組中

pcram[j]=pc1[width-1:0];

end

ps=psram[width-1];

pc=pcram[width-1];

pc1[0]=0;

ps1[0]=0;

for(k=1;k<width;k=k+1)

begin

ps1[k]=pc1[k-1]^pc[k-1]^ps[k];//全加器之和與進(jìn)位運(yùn)算

pc1[k]=pc1[k-1]&pc[k-1]|pc1[k-1]&ps[k]|pc[k-1]&ps[k];

end

temp[width+width-1]=pc1[width-1];//將ps1的值設(shè)定給乘積結(jié)果

temp[width+width-2:width]=ps1[width-1:1];

end

assignp=temp[width+width-1:0]; //乘積結(jié)果的輸出

endmodule3)?8位布斯乘法器

//8位布斯乘法器booth.v

modulebooth(a,b,p);

parameterwidth=8; //設(shè)定為8位

input[width-1:0]a,b; //a為被乘數(shù),b為乘數(shù)

output[width+width-1:0]p; //乘積結(jié)果

reg[width+width-1:0]p;

integercnt; //右移次數(shù)

reg[width+width:0]pa,right; //暫存乘數(shù)

always@(aorb)

begin

pa[width+width:0]={16'b0,a,1'b0};//{p,a,1'b0}

for(cnt=0;cnt<width;cnt=cnt+1)

begin

case(pa[1:0]) //pa最后兩位pa[1:0]用于case選擇函數(shù)

2'b10:

begin

//pa=pa-b

pa[width+width:width+1]=pa[width+width:width+1]-b[width-1:0];

rshift(pa,right); //執(zhí)行算術(shù)右移task子程序

end

2'b01:

begin

//pa=pa+b

pa[width+width:width+1]=pa[width+width:width+1]+b[width-1:0];

rshift(pa,right); //執(zhí)行算術(shù)右移task子程序

end

default:

rshift(pa,right); //直接執(zhí)行算術(shù)右移task子程序

endcase

pa=right;

end

p[width+width-1:0]=pa[width+width:1];//將乘積指定給輸出端

end

//右移task子程序

taskrshift;

input[width+width:0]pa; //輸入為pa

output[width+width:0]right; //輸出為right

case(pa[width+width])

//最高位為0的算術(shù)右移

1'b0:right[width+width:0]={1'b0,pa[width+width:1]};

//最高位為1的算術(shù)右移

1'b1:right[width+width:0]={1'b1,pa[width+width:1]};

endcase

endtask

endmodule

3.仿真結(jié)果驗(yàn)證

圖6.7是使用QuartusⅡ8.0對(duì)移位乘法器mult8s進(jìn)行時(shí)序仿真的結(jié)果。當(dāng)輸入a=36、b=12時(shí),乘積輸出p應(yīng)為36×12

=432,實(shí)際仿真輸出為432,因此仿真結(jié)果是正確的。同理可驗(yàn)證其余的仿真結(jié)果也是正確的。定點(diǎn)乘法器mult8_fp和布斯乘法器booth的時(shí)序仿真和結(jié)果分析,請(qǐng)讀者自己完成。圖6.7移位乘法器mult8s的時(shí)序仿真結(jié)果

4.邏輯綜合分析

根據(jù)第6.1節(jié)所述的方法,請(qǐng)讀者自己進(jìn)行邏輯綜合,查看并分析有關(guān)綜合結(jié)果。

5.硬件邏輯驗(yàn)證

若使用GW48-CKEDA實(shí)驗(yàn)開(kāi)發(fā)系統(tǒng)進(jìn)行硬件邏輯驗(yàn)證,可選擇實(shí)驗(yàn)電路結(jié)構(gòu)圖NO.1,由5.2節(jié)的實(shí)驗(yàn)電路結(jié)構(gòu)圖NO.1和對(duì)應(yīng)程序的輸入輸出端口定義確定引腳的鎖定。被乘數(shù)a[7:0]接PIO15~PIO8(由鍵4、鍵3輸入8位二進(jìn)制數(shù)),乘數(shù)b[7:0]接PIO7~PIO0(由鍵2、鍵1輸入8位二進(jìn)制數(shù)),乘積輸出p[15:0]接PIO31~PIO16。

進(jìn)行硬件驗(yàn)證的方法為:鍵4和鍵3分別輸入被乘數(shù)的高4位和低4位(輸入值顯示于數(shù)碼4和數(shù)碼3),鍵2和鍵1分別輸入乘數(shù)的高4位和低4位(輸入值顯示于數(shù)碼2和數(shù)碼1);乘積顯示于數(shù)碼管8~數(shù)碼管5,高位在左。

1.系統(tǒng)設(shè)計(jì)思路

1)8位移位除法器

(1)輸入被除數(shù)a及除數(shù)b時(shí),程序會(huì)先判斷輸入值:

若除數(shù)及被除數(shù)均為0,則此表達(dá)式無(wú)意義,商數(shù)輸出記為0,余數(shù)輸出記為0,因?yàn)橐缥惠敵鰹?,所以商數(shù)無(wú)意義;

若除數(shù)為0且被除數(shù)大于0,則此表達(dá)式溢位輸出,商數(shù)輸出為0,余數(shù)輸出為0,溢位輸出為1;6.38位除法器的設(shè)計(jì)若被除數(shù)及除數(shù)相等,則輸出商數(shù)為1,余數(shù)輸出為0,溢位輸出為0;

若被除數(shù)小于除數(shù),則輸出商數(shù)為0,余位輸出為被除數(shù),溢位輸出為0;

若除數(shù)為1,則輸出商數(shù)為被除數(shù),余數(shù)輸出為0,溢位輸出為0;

若被除數(shù)大于除數(shù),則利用下列算法求出商數(shù)。

預(yù)設(shè)商數(shù)q為0,余數(shù)r為0,位cn=8(為8位除法器)。此算法先判斷位cn是否大于0,若大于0,則余數(shù)左移一位,余數(shù)則等于余數(shù)加上被除數(shù)第cn-1位的值,商數(shù)左移一位。再判斷余數(shù)是否大于或等于除數(shù),若大于或等于除數(shù),商數(shù)則等于商數(shù)加1,余數(shù)等于余數(shù)減除數(shù);若小于除數(shù),則cn=cn-1。再判斷cn是否大于0,如此來(lái)回判斷8次,即可獲得商數(shù)、余數(shù)。

(2)此算法的優(yōu)點(diǎn)是n位除法器僅需判斷n次即可獲得商數(shù)、余數(shù),無(wú)需進(jìn)行龐大的運(yùn)算。

2)?8位重存除法器

已知被除數(shù)a、除數(shù)b,則商數(shù)q及余數(shù)r與a、b的關(guān)系定義為:a=q*b+r。在進(jìn)行除法運(yùn)算時(shí),商數(shù)q中的每一位均可通過(guò)執(zhí)行一連串的減法2ri-b確定。對(duì)于重存除法,在每一步驟中均執(zhí)行ri+1=2ri-b。當(dāng)相減結(jié)果為負(fù)時(shí),必須執(zhí)行重存加法算法,即ri+1=2ri+b。換言之,若對(duì)應(yīng)商數(shù)qi為0,則部分的余數(shù)將由修正值重新存回。其執(zhí)行步驟為:

(1)將被除數(shù)存入緩存器a(亦為商數(shù))中,除數(shù)放在緩存器b中,接著將余數(shù)緩存器r清除為0,然后開(kāi)始作n次除法步驟(n是商數(shù)的位長(zhǎng)度)。

(2)將{r,a}所組成的緩存器向左移一位。

(3)余數(shù)緩存器r減掉除數(shù)緩存器b,并把差值再存回余數(shù)緩存器r。

(4)如果差值是負(fù)的,則被除數(shù)緩存器a最低位設(shè)為0,否則為1。

(5)差值是負(fù)值確定之后,把r加回b以恢復(fù)舊的r值。

3)?8位非重存除法器

已知被除數(shù)a、除數(shù)b,則商數(shù)q及余數(shù)r與a、b的關(guān)系定義為:a=q*b+r。在進(jìn)行除法運(yùn)算時(shí),商數(shù)q中的每一位均可通過(guò)執(zhí)行一連串的減法2ri-b確定。非重存除法算法,是由重存除法算法演變而來(lái)的。對(duì)于非重存除法,在每一步驟中均執(zhí)行ri+1=2ri-b。當(dāng)相減結(jié)果為負(fù)時(shí)(對(duì)應(yīng)商數(shù)qi為0),不做重存操作,而是繼續(xù)左移一位,如此可節(jié)省重存除法中的加法器。非重存除法的執(zhí)行步驟為:

(1)將被除數(shù)存入緩存器a(亦為商數(shù))中,除數(shù)放在緩存器b中,接著將余數(shù)緩存器r清除為0,然后開(kāi)始作n次除法步驟(n是商數(shù)的位長(zhǎng)度)。

(2)將{r,a}所組成的緩存器向左移一位。

(3)檢查余數(shù)緩存器r,若為負(fù)數(shù),則將除數(shù)緩存器b加入余數(shù)緩存器r;若為正值,則由余數(shù)緩存器r減去除數(shù)緩存器b。

(4)如果余數(shù)緩存器r為負(fù)值,則設(shè)a的最低位為0,反之設(shè)為1。

(5)若最后一次的余數(shù)為負(fù),則須將除數(shù)b重新加回余數(shù)r。2.VerilogHDL源程序

1)?8位移位除法器

//8位移位式除法器div8s.v

modulediv8s(q,r,o,a,b);

parameterbitl=8; //數(shù)據(jù)位長(zhǎng)

input[bitl-1:0]a,b; //a為被除數(shù),b為除數(shù)

output[bitl-1:0]q,r; //q為商,r為余數(shù)

outputo; //溢出標(biāo)志

reg[bitl-1:0]rq,rr;

regover;

reg[bitl-1:0]ra,rb;

reg[bitl-1:0]cnt; //位計(jì)數(shù)器

always@(aorb)

begin

over=0;ra=a;rb=b;

if(rb==0) //當(dāng)rb=0時(shí),使rq=0,rr=0

begin

rq=0;rr=0;

if(ra==0) //當(dāng)ra=0時(shí),使over=1

over=1;

else

begin

rq=-1;rr=-1;over=1;

end

end

elseif(ra==rb) //當(dāng)ra=rb時(shí),使rq=1,rr=0

begin

rq=1;rr=0;

end

elseif(ra<rb) //當(dāng)ra<rb時(shí),使rq=0,rr=a

begin

rq=0;rr=ra;

end

elseif(rb==1) //當(dāng)b=1時(shí),使rq=a,rr=0

begin

rq=ra;rr=0;

end

else //當(dāng)a>b時(shí),使rq=0,rr=0

begin

rq=0;rr=0; //初始化rq和rr

for(cnt=bitl-1;cnt>0;cnt=cnt-1)

begin

rr={rr[bitl-2:0],ra[cnt-1]}; rq=rq<<1;

if(rr>=rb) //當(dāng)rr≥rb時(shí),使rq=rq+1,rr=rr-rb

begin

rq=rq+1;rr=rr-rb;

end

end

end

end

assignq=rq;

assignr=rr;

assigno=over;

endmodule2)?8位重存除法器

//8位重存除法器divrd8.v

moduledivrd8(q,r,o,a,b);

parameterwidth=8; //設(shè)定8位

output[width-1:0]q; //商

output[width-1:0]r; //余數(shù)

outputo; //溢出標(biāo)志

input[width-1:0]a; //被除數(shù)

input[width-1:0]b; //除數(shù)

reg[width:0]p;

reg[width-1:0]q,div,r;

integeri;

always@(aorb)

begin

q=a;

div=b;

p={8'h00,1'b0};

for(i=0;i<width;i=i+1)

begin

p={p[width-1:0],q[width-1]};

q={q[width-2:0],1'b0};

p=p+{~{1'b0,div}+1'b1};

case(p[width])

1'b0:q[0]=1'b1; //正的余數(shù)

1'b1:begin //負(fù)的余數(shù)

p=p+div; //恢復(fù)加法

q[0]=1'b0;

end

endcase

end

r=p[width-1:0];

end

assigno=(b==8'h00)?1'b1:1'b0; //溢出檢測(cè)

endmodule3)?8位非重存除法器

//8位非重存除法器divnrd8.v

moduledivnrd8(a,b,q,r,o);

parameterwidth=8; //設(shè)定8位

input[width-1:0]a,b; //a為被除數(shù),b為除數(shù)

output[width-1:0]q,r; //q為商,r為余數(shù)

outputo; //溢出標(biāo)志

reg[width:0]p;

reg[width-1:0]q,div,r;

regsign; //余數(shù)符號(hào)位

integeri;

always@(aorb)

begin

sign=1'b0;q=a;div=b;

p={8'h00,1'b0};

for(i=0;i<width;i=i+1)

begin

p={p[width-1:0],q[width-1]};

q={q[width-2:0],1'b0};

if(sign==1'b1)

p=p+{1'b0,div};

else

p=p+{~{1'b0,div}+1'b1};

case(p[width])

1'b0:beginsign=1'b0;q[0]=1'b1;end

1'b1:beginsign=1'b1;q[0]=1'b0;end

endcase

end

//若余數(shù)為負(fù)數(shù),則修正余數(shù)

if(p[width]==1'b1)

begin

p=p+{1'b0,div};r=p[width-1:0]; //余數(shù)輸出

end

else

r=p[width-1:0];

end

assigno=(b==8'h00)?1'b1:1'b0; //溢出檢測(cè)

endmodule

3.仿真結(jié)果驗(yàn)證

圖6.8是使用QuartusⅡ8.0對(duì)移位除法器div8s進(jìn)行時(shí)序仿真的結(jié)果。當(dāng)被除數(shù)a=122,除數(shù)b=20時(shí),商q應(yīng)為122/20=6,余數(shù)r=2,溢出標(biāo)志o=0,此時(shí)實(shí)際仿真輸出與此完全相同。同理可驗(yàn)證其余值運(yùn)算的仿真結(jié)果也是正確的。8位重存除法器divrd8s和非重存除法器divnrd8s的時(shí)序仿真和結(jié)果分析請(qǐng)讀者自己完成。圖6.88位移位除法器div8s的時(shí)序仿真結(jié)果

4.邏輯綜合分析

根據(jù)第6.1節(jié)所述的方法,請(qǐng)讀者自己進(jìn)行邏輯綜合,查看并分析有關(guān)綜合結(jié)果。

5.硬件邏輯驗(yàn)證

若使用GW48-CKEDA實(shí)驗(yàn)開(kāi)發(fā)系統(tǒng)進(jìn)行硬件邏輯驗(yàn)證,可選擇實(shí)驗(yàn)電路結(jié)構(gòu)圖NO.1,由5.2節(jié)的實(shí)驗(yàn)電路結(jié)構(gòu)圖NO.1和對(duì)應(yīng)程序的輸入輸出端口定義確定引腳的鎖定。如被除數(shù)a[7:0]接PIO15~PIO8(由鍵4、鍵3輸入8位二進(jìn)制數(shù)),除數(shù)b[7:0]接PIO7~PIO0(由鍵2、鍵1輸入6位二進(jìn)制數(shù)),商輸出q[7:0]接PIO31~PIO24,余數(shù)輸出r[7:0]接PIO23~PIO16,溢出信號(hào)o接PIO32。

進(jìn)行硬件驗(yàn)證時(shí)方法為:鍵4和鍵3分別輸入被除數(shù)的高4位和低4位(輸入值顯示于數(shù)碼管4和數(shù)碼管3),鍵2和鍵1分別輸入除數(shù)的高2位和低4位(輸入值顯示于數(shù)碼管2和數(shù)碼管1);商顯示于數(shù)碼管8和數(shù)碼管7,余數(shù)顯示于數(shù)碼管6和數(shù)碼管5,高位在左,溢出信號(hào)顯示于D1。

1.系統(tǒng)設(shè)計(jì)思路

設(shè)計(jì)一個(gè)可調(diào)信號(hào)發(fā)生器,可產(chǎn)生正弦波、方波、三角波和鋸齒波四種信號(hào),能夠?qū)崿F(xiàn)信號(hào)的轉(zhuǎn)換,并具有頻率可調(diào)的功能。

可調(diào)信號(hào)發(fā)生器由三部分構(gòu)成:地址指針、數(shù)據(jù)ROM和D/A。地址指針用來(lái)產(chǎn)生地址;數(shù)據(jù)ROM中存放波形數(shù)據(jù),包括正弦波、方波、三角波和鋸齒波;D/A用來(lái)將波形數(shù)據(jù)轉(zhuǎn)換為模擬波形。6.4可調(diào)信號(hào)發(fā)生器的設(shè)計(jì)2.?VerilogHDL源程序

1)頂層模塊signalgen的設(shè)計(jì)

//頂層模塊signalgen.v

modulesignalgen(clk,control,i,q_out);

inputclk;

input[1:0]control;

input[3:0]i; //讀取數(shù)據(jù)間隔,調(diào)整頻率

output[7:0]q_out; //輸出數(shù)據(jù)

reg[8:0]addr;

reg[7:0]q_out,m,k;

dataromu1(.address(addr),.clock(clk),.q(q_out));

always@(posedge

clk)

begin

case(control) //根據(jù)control的不同控制產(chǎn)生正弦波、鋸齒波、方波和三角波

0:begin //產(chǎn)生正弦波

if(addr>=127)

addr<=0;

else

begin

if(i==0||i==1)

addr<=addr+1;

else

begin

k<=127/i;m<=i*k; addr<=addr+i;

if(addr>=m)addr<=0;

end

end

end

1:begin //產(chǎn)生鋸齒波

if((addr<128)||(addr>=255))

addr<=128;

else

begin

if(i==0||i==1)

addr<=addr+1;

else

begin

k<=127/i;m<=1*k;addr<=addr+i;

if(addr>=(m+128))addr<=128;

end

end

end

2:begin //產(chǎn)生方波

if((addr<256)||(addr>=383))

addr<=256;

else

begin

if(i==0||i==1)

addr<=addr+1;

else

begin

k<=127/i;m<=i*k;addr<=addr+i;

if(addr>=(m+256)) addr<=256;

end

end

end

3:begin //產(chǎn)生三角波

if((addr<256)||(addr>=383))

addr<=256;

else

begin

if(i==0||i==1)

addr<=addr+1;

else

begin

k<=127/i;m<=i*k; addr<=addr+i;

if(addr>=(m+384))addr<=384;

end

end

end

endcase

end

endmodule

2)底層datarom模塊的設(shè)計(jì)

(1)建立ROM初始化文件。ROM的初始化文件用來(lái)完成對(duì)數(shù)據(jù)的初始化,即將所有將要顯示的波形數(shù)據(jù)存放到ROM里。下面是常用的兩種初始化設(shè)計(jì)方法:建立.mf格式文件。首先選擇ROM數(shù)據(jù)文件編輯窗口,即在【File】菜單中選擇【New】,并在【New】對(duì)話框中選擇【Otherfiles】標(biāo)簽,選擇【MemoryInitizationfile】,單擊【OK】按鈕后產(chǎn)生ROM數(shù)據(jù)文件大小選擇對(duì)話框。這里采用512點(diǎn)8位數(shù)據(jù)的情況,可選ROM的數(shù)據(jù)數(shù)(Numer)為512,數(shù)據(jù)寬(Wordsize)為8位。單擊【OK】按鈕,將出現(xiàn)空的mif數(shù)據(jù)表格,表格中的數(shù)據(jù)為十進(jìn)制表達(dá)方式,任一數(shù)據(jù)對(duì)應(yīng)的地址為左列與頂行數(shù)之和。將波形數(shù)據(jù)填入表中,完成后在【file】菜單中單擊【Saveas】,保存此數(shù)據(jù)。建立hex格式文件。建立?.hex格式文件的方法有兩種:第一種方法與建立?.mif格式文件的方法相同,只是在【New】對(duì)話框中選擇【Otherfiles】標(biāo)簽,然后選擇H,最后生成hex格式文件;第二種方法是用C語(yǔ)言或者使用MATLAB等工具生成.hex格式的波形數(shù)據(jù)。datarom的數(shù)據(jù)如下:

128134140146152159165171176182188193199204209213

218222226230234237240243246248250252253254255255

255

255

255254253252250248246243240237234230226222

218213209204199193188182176171165159152146140134

1281221161101049791858074686357524743383430

26221916131010864321111123468101316

1922263034384347525763687480859197104110116122012345678910111213141516171819

2021222324252627282930313233343536373839

4041424344454647484950515253545556575859

6061626364656667686970717273747576777879

8081828384858687888990919293949596979899

100101102103104105106107108109110111112113114115

116117118119120121122123124125126127255255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255255255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

255

2550000000

000000000000000000000000000

000000000000000000000000000

000024681012141618202224262830323436

3840424446485052545658606264666870727476

7880828486889092949698100102104106108110112

114116118120122124126126124122120118116114112110

1081061041021009896949290888684828078767472

7068666462605856545250484644424038363432

302826242220181614121086420

(2)利用MegaWizardPlug-InManager定制正弦信號(hào)數(shù)據(jù)datarom。在【Tools】菜單中選擇【MegaWizardPlug-InManager】,彈出對(duì)話框。選擇【Createanewcustommegafunctionvariation】,即定制一個(gè)新的模塊。單擊該對(duì)話框的【Next】按鈕后,新出現(xiàn)的操作對(duì)話框如圖6.9所示,選擇【MemoryCompiler】項(xiàng)下的【ROM:1-PORT】,再選目標(biāo)器件為CycloneⅡ器件和VerilogHDL語(yǔ)言方式,最后鍵入ROM文件存放的路徑和文件名。圖6.9定制模塊選擇及輸出文件的選擇與設(shè)置選擇根據(jù)依次彈出的操作設(shè)置對(duì)話框,依次選擇設(shè)置ROM控制線、地址、數(shù)據(jù)線,選擇設(shè)置輸出端口,選擇設(shè)置ROM初始文件,聲明元器件庫(kù),直至完成datarom的定制。其中,dataromde1初始文件設(shè)置如圖6.10所示。圖6.10選擇設(shè)置ROM初始文件datarom.mf

3.仿真結(jié)果驗(yàn)證

這里使用SignalTapⅡ嵌入式邏輯分析儀進(jìn)行實(shí)時(shí)測(cè)試。SignalTapⅡ嵌入式邏輯分析儀集成在QuartusⅡ設(shè)計(jì)軟件中,能夠捕獲和顯示可編程片上系統(tǒng)(SOPC)設(shè)計(jì)中實(shí)時(shí)信號(hào)的狀態(tài),還可以實(shí)時(shí)測(cè)試FPGA中的信號(hào)波形。目前,SignalTapⅡ嵌入式邏輯分析儀支持的器件系列包括APEXTⅡ\APEX20KE\APEX20KC\APEX20K\CYCLONE\EXCALIBUR\MERCURY\STRATIXGX\STRATIX等。使用SignalTapⅡ的一般流程是:設(shè)計(jì)人員在完成設(shè)計(jì)并編譯工程后,建立SignalTapⅡ(.stp)文件并加入工程→配置STP文件→編譯并下載設(shè)計(jì)到FPGA→在QuartusⅡ中顯示被測(cè)信號(hào)的波形→測(cè)試完畢后將該邏輯分析儀從項(xiàng)目中刪除。本設(shè)計(jì)中使用SignalTapⅡ進(jìn)行波形實(shí)時(shí)測(cè)試的步驟如下:

(1)選擇【File】菜單中的【New】,在【New】對(duì)話框中選擇【OtherFiles】標(biāo)簽中的【SignalTapⅡLogicAnalyzerFile】,單擊【OK】按鈕,即出現(xiàn)如圖6.11所示的SignalTapⅡ編輯器。圖6.11signaltapⅡ編輯器

(2)調(diào)入待測(cè)信號(hào)及保存文件。首先單擊上排的【Instance】欄內(nèi)的【auto-signaltap_0】,根據(jù)自己的意愿將其改名,這是其中一組待測(cè)信號(hào)。為了調(diào)入待測(cè)信號(hào),在下欄的空白處雙擊,即彈出【NodeFinder】對(duì)話框,單擊【List】即在左欄出現(xiàn)與此工程相關(guān)的所有信號(hào),包括內(nèi)部信號(hào)。此例中要將control、i、q_out信號(hào)調(diào)入,如圖6.12所示。圖6.12調(diào)入待測(cè)信號(hào)不能將工程的主頻時(shí)鐘信號(hào)調(diào)入信號(hào)觀察窗。如果有總線信號(hào),只需調(diào)入總線信號(hào)即可,而慢速信號(hào)可不調(diào)入。調(diào)入信號(hào)的數(shù)量應(yīng)根據(jù)實(shí)際需要來(lái)決定,不可隨意調(diào)入過(guò)多的沒(méi)有實(shí)際意義的信號(hào),這會(huì)導(dǎo)致SignalTapⅡ無(wú)謂地占用芯片內(nèi)過(guò)多的資源。最后,保存SignalTapⅡ文件。選擇【File】菜單中的【SaveAs】命令,鍵入此SignalTapⅡ文件的文件名,擴(kuò)展名是默認(rèn)的“stp”。單擊保存按鈕后將出現(xiàn)一個(gè)提示:“DoyouwanttoenableSignalTapⅡ…”,應(yīng)該單擊【Yes】按鈕,表示同意再次編譯時(shí)將此SignalTapⅡ文件(核)與工程(sindt)捆綁在一起綜合/適配,以便一同被下載進(jìn)FPGA芯片中去。如果單擊【No】按鈕,則必須自己去設(shè)置,方法是,選擇菜單【Assignments】中的【Settings】命令,在【Category】欄中選擇【SignalTapⅡLogicAnalyzer】。在【SignalTapⅡFile】欄選擇已保存的SignalTapⅡ文件名,并選擇【EnableSignalTapⅡLogicAnalyzer】,單擊【OK】按鈕即可。但應(yīng)該特別注意,當(dāng)利用SignalTapⅡ?qū)⑿酒械男盘?hào)全部測(cè)試結(jié)束后,如在構(gòu)成產(chǎn)品前,不要忘了將SignalTapⅡ從芯片中除去。方法是在此窗口中關(guān)閉【EnableSignalTapⅡLogicAnalyzer】,再編譯一次即可。

(3)?SignalTapⅡ的參數(shù)設(shè)置。單擊最大化按鈕和窗口左下角的【Setup】,即出現(xiàn)如圖6.13所示的全屏編輯窗口。首先選擇輸入邏輯分析儀的工作時(shí)鐘信號(hào)Clock,單擊Clock欄左側(cè)的“…”按鈕,選擇工程的主頻時(shí)鐘信號(hào)。接著在【Data】框的【Sample】欄選擇此組信號(hào)的采樣深度(sampledepth)為1?kbit。注意,這個(gè)深度一旦確定,信號(hào)組的每一位信號(hào)就將獲得同樣的采樣深度。然后設(shè)置觀察信號(hào)的要求,在【Bufferacquisitionmode】框的【Circulate】欄設(shè)置既定的采樣深度中起始觸發(fā)的位置,比如選擇中點(diǎn)觸發(fā)(Centertriggerposition)。最后設(shè)置觸發(fā)信號(hào)和觸發(fā)方式,這可以根據(jù)具體需求來(lái)選置。在【Trigger】框的【Triggerlevel】欄選擇1;選擇【TriggerIn】復(fù)選框,并在【Source】欄選擇觸發(fā)信號(hào)。在這里選擇sin工程的內(nèi)部計(jì)數(shù)器最高位輸出信號(hào)address[6]作為觸發(fā)信號(hào),在【Pattern】欄選擇上升沿觸發(fā)方式(RisingEdges),即當(dāng)address[6]為上升沿時(shí),SignalTapⅡ在CLK的驅(qū)動(dòng)下對(duì)信號(hào)組的信號(hào)進(jìn)行連續(xù)或單次采樣(根據(jù)設(shè)置決定)。設(shè)置完畢后保存。圖6.13SignaltapⅡ編輯器設(shè)置

(4)編譯下載。首先選擇【Processing】菜單的【StartCompilation】項(xiàng),啟動(dòng)全程編譯。編譯結(jié)束后,SignalTapⅡ的觀察窗口通常會(huì)自動(dòng)打開(kāi),若沒(méi)有打開(kāi),可選擇【Tools】菜單中的【SignalTapⅡAnalyzer】,以打開(kāi)SignalTapⅡ。通過(guò)右上角的【Setup】按鈕選擇硬件通信模式;然后單擊下方【Device】欄的【scanChain】按鈕,對(duì)實(shí)驗(yàn)板進(jìn)行掃描。如果在欄中出現(xiàn)板上FPGA的型號(hào)名,表示系統(tǒng)JTAG通信情況正常,可以進(jìn)行下載。最后在【File】欄選擇下載文件,單擊下載標(biāo)號(hào),觀察左下角下載信息。

(5)啟動(dòng)SignalTapⅡ進(jìn)行測(cè)試與分析。單擊【Intance】,再單擊【AutorunAnalysis】,啟動(dòng)SignalTapⅡ,然后單擊左下角的【Data】和全屏控制鈕,這時(shí)就能在SignalTapⅡ數(shù)據(jù)窗口通過(guò)JTAG接口觀察到來(lái)自實(shí)驗(yàn)板上的FPGA內(nèi)部實(shí)時(shí)信號(hào)。數(shù)據(jù)窗口的上沿坐標(biāo)是采樣深度的二進(jìn)制位數(shù),全程是1?kbit。如果單擊總線名(如q_out)左側(cè)的“+”號(hào),可以展開(kāi)此總線信號(hào),同時(shí)可用左、右鍵控制數(shù)據(jù)的展開(kāi)。如果要觀察相應(yīng)的模擬波形,右鍵單擊q_out左側(cè)的端口標(biāo)號(hào),在彈出的下拉欄中選擇【BusDisplayFormat】的【UnsignedLineChart】,即可得到如圖6.14~圖6.17所示波形。

(6)對(duì)于各種波形,通過(guò)i設(shè)置頻率的大小。圖6.14正弦波圖6.15鋸齒波圖6.16方波圖6.17三角波

4.邏輯綜合分析

使用QuartusⅡ8.0對(duì)signalgen進(jìn)行邏輯綜合后可查看RTL視圖。圖6.18(a)和(b)分別是選用EPF10K10TC144-3和選用EP2C8T144C6芯片、使用QuartusⅡ8.0對(duì)signalgen進(jìn)行邏輯綜合后的資源使用情況。圖6.19是signalgen的時(shí)鐘性能分析結(jié)果,從結(jié)果可以看出,若選用EPF10K10TC144-3芯片,該系統(tǒng)的最高頻率可達(dá)到35.34?MHz;若選用EP2C8T144C6芯片,該系統(tǒng)的最高頻率可達(dá)到170.88?MHz。從這里可以看出,對(duì)于相同的一個(gè)VerilogHDL設(shè)計(jì),若采用不同的芯片,該系統(tǒng)的最高頻率是不相同的。圖6.18signalgen.v邏輯綜合后的資源使用情況圖6.19signalgen的時(shí)鐘性能分析結(jié)果

5.硬件邏輯驗(yàn)證

請(qǐng)讀者根據(jù)前述方法自行完成硬件邏輯驗(yàn)證工作。

1.系統(tǒng)設(shè)計(jì)思路

PWM即脈沖寬度調(diào)制,是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。PWM從處理器到被控系統(tǒng)信號(hào)都是數(shù)字式的,無(wú)需進(jìn)行數(shù)/模轉(zhuǎn)換。讓信號(hào)保持為數(shù)字形式可將噪聲影響降到最小,因此廣泛應(yīng)用在從測(cè)量、通信到功率控制與變換的許多領(lǐng)域中。6.5PWM信號(hào)發(fā)生器的設(shè)計(jì)采用FPGA產(chǎn)生PWM波形的方法很多,常用的有計(jì)數(shù)器法、存儲(chǔ)查表法等。其中,計(jì)數(shù)器法設(shè)計(jì)的基本原理是:根據(jù)PWM輸出周期計(jì)數(shù)值和PWM輸出占空比控制計(jì)數(shù)值,通過(guò)控制對(duì)應(yīng)的計(jì)數(shù)段的高、低電平輸出,來(lái)產(chǎn)生一個(gè)周期可調(diào)、占空比可調(diào)的PWM信號(hào)。

現(xiàn)欲設(shè)計(jì)一個(gè)控制計(jì)數(shù)值為32位的PWM信號(hào)發(fā)生器,采用計(jì)數(shù)器法進(jìn)行設(shè)計(jì),主要包括六個(gè)處理過(guò)程塊:寫(xiě)PWM輸出周期的時(shí)鐘數(shù)寄存器、寫(xiě)PWM周期占空比寄存器、寫(xiě)控制寄存器、讀寄存器、PWM信號(hào)產(chǎn)生計(jì)數(shù)控制和PWM信號(hào)輸出控制等過(guò)程塊。2.VerilogHDL源程序

//PWM信號(hào)發(fā)生器pwmgen.v

modulepwmgen(clk,rst,ce,addr,write,wrdata,read,bytesel,rddata,pwm);

inputclk,rst,ce;

input[1:0]addr;

inputwrite,read;

input[31:0]wrdata;

output[31:0]rddata;

input[3:0]bytesel;

outputpwm;

reg[31:0]clk_div_reg,duty_cycle_reg;

reg

control_reg;

reg

clk_div_reg_sel,duty_cycle_reg_sel,control_reg_sel;

reg[31:0]pwm_cnt,rddata;

reg

pwm;

wirepwm_ena;

//地址譯碼

always@(addr)

begin

clk_div_reg_sel<=0;duty_cycle_reg_sel<=0;control_reg_sel<=0;

case(addr)

2'b00:clk_div_reg_sel<=1;

2'b01:duty_cycle_reg_sel<=1;

2'b10:control_reg_sel<=1;

default:

begin

clk_div_reg_sel<=0;

duty_cycle_reg_sel<=0;

control_reg_sel<=0;

end

endcase

end

//寫(xiě)PWM輸出周期的時(shí)鐘數(shù)寄存器

always@(posedgeclkornegedgerst)

begin

if(rst==1'b0)

clk_div_reg=0;

else

begin

if(write&ce&clk_div_reg_sel)

begin

if(bytesel[0])

clk_div_reg[7:0]=wrdata[7:0];

if(bytesel[1])

clk_div_reg[15:8]=wrdata[15:8];

if(bytesel[2])

clk_div_reg[23:16]=wrdata[23:16];

if(bytesel[3])

clk_div_reg[31:24]=wrdata[31:24];

end

end

end

//寫(xiě)PWM周期占空比寄存器

always@(posedge

clkornegedge

rst)

begin

if(rst==1'b0)

duty_cycle_reg=0;

else

begin

if(write&ce&duty_cycle_reg_sel)

begin

if(bytesel[0])

duty_cycle_reg[7:0]=wrdata[7:0];

if(bytesel[1])

duty_cycle_reg[15:8]=wrdata[15:8];

if(bytesel[2])

duty_cycle_reg[23:16]=wrdata[23:16];

if(bytesel[3])

duty_cycle_reg[31:24]=wrdata[31:24];

end

end

end

//寫(xiě)控制寄存器

always@(posedge

clkornegedge

rst)

begin

if(rst==1'b0)

control_reg=0;

else

begin

if(write&ce&control_reg_sel)

begin

if(bytesel[0])control_reg=wrdata[0];

end

end

end

//讀寄存器

always@(addrorreadorclk_div_regorduty_cycle_regorcontrol_regorce)

begin

if(read&ce)

case(addr)

2'b00:rddata<=clk_div_reg;

2'b01:rddata<=duty_cycle_reg;

2'b10:rddata<=control_reg;

default:rddata=32'h8888;

endcase

end

//PWM輸出使能的賦值

assignpwm_en=control_reg;

//PWM信號(hào)產(chǎn)生計(jì)數(shù)控制電路

always@(posedge

clkornegedge

rst)

begin

if(rst==1'b0)

pwm_cnt=0;

else

begin

if(pwm_en)

begin

if(pwm_cnt>=clk_div_reg)

pwm_cnt<=0;

else

pwm_cnt<=pwm_cnt+1;

end

else

pwm_cnt<=0;

end

end

//PWM信號(hào)輸出控制電路

always@(posedge

clkornegedge

rst)

begin

if(rst==1'b0)

pwm<=1'b0;

else

begin

if(pwm_en)

begin

if(pwm_cnt<=duty_cycle_reg)

pwm<=1'b1;

else

pwm<=1'b0;

end

else

pwm<=1'b0;

end

end

endmodule

3.仿真結(jié)果驗(yàn)證

圖6.20是使用QuartusⅡ8.0對(duì)PWM進(jìn)行時(shí)序仿真的結(jié)果。從輸入和輸出數(shù)據(jù)的分析可知,仿真結(jié)果是正確的。各個(gè)模塊的時(shí)序仿真和結(jié)果分析請(qǐng)讀者自己完成。圖6.20PWM的時(shí)序仿真結(jié)果

4.邏輯綜合分析

根據(jù)第6.1節(jié),請(qǐng)讀者自己進(jìn)行邏輯綜合,查看并分析有關(guān)綜合結(jié)果。

5.硬件邏輯驗(yàn)證

請(qǐng)讀者根據(jù)前述方法自行完成硬件邏輯驗(yàn)證工作。其中,根據(jù)EDA實(shí)驗(yàn)開(kāi)發(fā)裝置的實(shí)際資源情況,有關(guān)控制計(jì)數(shù)值可修改為16位或8位,而隨預(yù)置數(shù)的變化而變化的輸出波形可利用示波器進(jìn)行觀察。在沒(méi)有示波器時(shí),clk可接不同的低頻率信號(hào),然后接通揚(yáng)聲器,通過(guò)聲音音調(diào)的變化來(lái)了解輸出頻率的變化。

1.系統(tǒng)設(shè)計(jì)思路

圖6.21是8位十進(jìn)制數(shù)字頻率計(jì)的電路邏輯圖,它由一個(gè)測(cè)頻控制信號(hào)發(fā)生器testctl、八個(gè)有時(shí)鐘使能的十進(jìn)制計(jì)數(shù)器cnt10、一個(gè)32位鎖存器reg32b組成。以下分別敘述頻率計(jì)各邏輯模塊的功能與設(shè)計(jì)方法。6.6數(shù)字頻率計(jì)的設(shè)計(jì)圖6.218位十進(jìn)制數(shù)字頻率計(jì)電路邏輯圖

1)測(cè)頻控制信號(hào)發(fā)生器設(shè)計(jì)

頻率測(cè)量的基本原理是計(jì)算每秒鐘內(nèi)待測(cè)信號(hào)的脈沖個(gè)數(shù)。這就要求testctl的計(jì)數(shù)使能信號(hào)tsten能產(chǎn)生一個(gè)1?s脈寬的周期信號(hào),并對(duì)頻率計(jì)的每一計(jì)數(shù)器cnt10的ena使能端進(jìn)行同步控制。當(dāng)tsten高電平時(shí),允許計(jì)數(shù);低電平時(shí),停止計(jì)數(shù),并保持其所計(jì)的數(shù)。在停止計(jì)數(shù)期間,首先需要一個(gè)鎖存信號(hào)load的上跳沿將計(jì)數(shù)器在前1秒鐘的計(jì)數(shù)值鎖存進(jìn)32位鎖存器reg32b中,由外部的七段譯碼器譯出并穩(wěn)定顯示。鎖存信號(hào)之后,必須有一清零信號(hào)clr_cnt對(duì)計(jì)數(shù)器進(jìn)行清零,為下一秒鐘的計(jì)數(shù)操作做準(zhǔn)備。測(cè)頻控制信號(hào)發(fā)生器的工作時(shí)序如圖6.22所示。為了產(chǎn)生這個(gè)時(shí)序圖,需首先建立一個(gè)由D觸發(fā)器構(gòu)成的二分頻器,在每次時(shí)鐘clk上升沿到來(lái)時(shí)其值翻轉(zhuǎn)。其中,控制信號(hào)時(shí)鐘clk的頻率取1Hz,而信號(hào)tsten的脈寬恰好為1s,可以用作閘門(mén)信號(hào)。此時(shí),根據(jù)測(cè)頻的時(shí)序要求,可得出信號(hào)load和clr_cnt的邏輯描述。由圖6.22可見(jiàn),在計(jì)數(shù)完成后,即計(jì)數(shù)使能信號(hào)tsten在1?s的高電平后,利用其反相值的上跳沿產(chǎn)生一個(gè)鎖存信號(hào)load,0.5?s后,clr_cnt產(chǎn)生一個(gè)清零信號(hào)上跳沿。

高質(zhì)量的測(cè)頻控制信號(hào)發(fā)生器的設(shè)計(jì)十分重要,設(shè)計(jì)中要對(duì)其進(jìn)行仔細(xì)的實(shí)時(shí)仿真(timingsimulation),防止可能產(chǎn)生的毛刺。圖6.22測(cè)頻控制信號(hào)發(fā)生器工作時(shí)序

2)寄存器reg32b的設(shè)計(jì)

設(shè)置鎖存器的好處是,顯示的數(shù)據(jù)穩(wěn)定,不會(huì)由于周期性的清零信號(hào)而不斷閃爍。若已有32位BCD碼存在于此模塊的輸入口,則在信號(hào)load的上升沿后即被鎖存到寄存器reg32b的內(nèi)部,并由reg32b的輸出端輸出,然后由實(shí)驗(yàn)板上的七段譯碼器譯成能在數(shù)碼管上顯示的相對(duì)應(yīng)的數(shù)值。

3)十進(jìn)制計(jì)數(shù)器cnt10的設(shè)計(jì)

如圖6.21所示,此十進(jìn)制計(jì)數(shù)器的特殊之處是,有一時(shí)鐘使能輸入端ena,用于鎖定計(jì)數(shù)值。當(dāng)高電平時(shí)計(jì)數(shù)允許,低電平時(shí)計(jì)數(shù)禁止。2.VerilogHDL源程序

1)有時(shí)鐘使能的十進(jìn)制計(jì)數(shù)器的源程序cnt10.v

modulecnt10(ena,clk,clr,co,cq);

inputena,clk,clr;

outputco;

output[3:0]cq;

reg[3:0]cnt;

regco;

always@(posedge

clkorposedge

clr)

begin

if(clr)

cnt<=4'b0;

else

if(ena)

if(cnt==4'h9)

cnt<=4'h0;

else

cnt<=cnt+1;

end

assigncq=cnt;

always@(posedge

clk)

begin

if(cnt==4'h9)

co=4'h1;

else

co=4'h0;

end

endmodule2)?32位鎖存器的源程序reg32b.v

mo

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論