《Xilinx FPGA設(shè)計(jì)與實(shí)踐教程》課件-第3章_第1頁
《Xilinx FPGA設(shè)計(jì)與實(shí)踐教程》課件-第3章_第2頁
《Xilinx FPGA設(shè)計(jì)與實(shí)踐教程》課件-第3章_第3頁
《Xilinx FPGA設(shè)計(jì)與實(shí)踐教程》課件-第3章_第4頁
《Xilinx FPGA設(shè)計(jì)與實(shí)踐教程》課件-第3章_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章VerilogHDL語言基礎(chǔ)3.1基本知識介紹3.2模塊結(jié)構(gòu)和編程框架3.3數(shù)據(jù)類型和基本元素3.4結(jié)構(gòu)化描述3.5TestBench簡介本章小結(jié) 3.1基本知識介紹

VerilogHDL語言是一種硬件描述語言,最初是在1984年由GatewayDesignAutomation(GDA)公司開發(fā)Verilog-XL仿真器時一起開發(fā)出來的。在一個非贏利性組織OpenVerilogInternational(OVI)的不斷推進(jìn)下,1995年IEEE制定了VerilogHDL的標(biāo)準(zhǔn),即IEEE-1364標(biāo)準(zhǔn)定義,也就是我們通常見到的Verilog-1995。后來隨著人們對這個流行語言的進(jìn)一步完善,Verilog語言的功能得到了進(jìn)一步增強(qiáng),就有了VerilogHDL-2001標(biāo)準(zhǔn),在本書中我們使用的是Verilog-2001標(biāo)準(zhǔn)。

VerilogHDL語言是一種硬件描述語言,最初是在1984年由GatewayDesignAutomation(GDA)公司開發(fā)Verilog-XL仿真器時一起開發(fā)出來的。在一個非贏利性組織OpenVerilogInternational(OVI)的不斷推進(jìn)下,1995年IEEE制定了VerilogHDL的標(biāo)準(zhǔn),即IEEE-1364標(biāo)準(zhǔn)定義,也就是我們通常見到的Verilog-1995。后來隨著人們對這個流行語言的進(jìn)一步完善,Verilog語言的功能得到了進(jìn)一步增強(qiáng),就有了VerilogHDL-2001標(biāo)準(zhǔn),在本書中我們使用的是Verilog-2001標(biāo)準(zhǔn)。

Verilog語言可以用來描述復(fù)雜的大型數(shù)字系統(tǒng)的各個層次的設(shè)計(jì),所以功能上是非常強(qiáng)大的。而作為本書講述Verilog語言的目的在于講述如何用它來進(jìn)行硬件電路的設(shè)計(jì),而不是對Verilog語言本身的研究,所以不會像別的教程一樣覆蓋Verilog的方方面面,而只是通過最簡捷的方式引導(dǎo)讀者迅速掌握設(shè)計(jì)的精髓。在實(shí)際工程應(yīng)用中,我們需要掌握Verilog語言的精華部分就足已了,也就是通常我們所說的,語言僅僅是一種描述方式,和開發(fā)工具沒有兩樣,而重要的是數(shù)字電路的設(shè)計(jì)思想和設(shè)計(jì)方法。

Verilog語法和C語言非常相似,這樣一來對我們有好處也有壞處,好處在于我們有了C語言的基礎(chǔ),上手起來非常容易,所以很容易掌握它的語法,而壞處在于我們可萬萬不能用C語言的設(shè)計(jì)思路進(jìn)行Verilog語言的設(shè)計(jì),因?yàn)閂erilog語言是一種硬件描述語言,其最大的特點(diǎn)在于硬件電路的并行執(zhí)行特性,不像C語言是面向過程來執(zhí)行的,所以這中間有一些細(xì)微的差別,往往會導(dǎo)致初學(xué)者在設(shè)計(jì)時達(dá)不到自己想要的結(jié)果。我們要帶著設(shè)計(jì)硬件電路的初衷來學(xué)習(xí)Verilog的描述方法。在本書中,將語言描述和實(shí)際電路緊密結(jié)合,自始至終都貫穿著代碼設(shè)計(jì)結(jié)構(gòu)清晰、可綜合性強(qiáng)、良好的編碼風(fēng)格等原則,這樣更有利于讀者更快地掌握這門語言的精髓而少走彎路。學(xué)習(xí)一門語言最快速的方法就是立即使用它進(jìn)行編程。我們首先用一個最簡單的比較器來描述Verilog程序的框架,在描述中僅僅使用邏輯操作符來描述門級的組合邏輯。這樣也有利于讀者對VerilogHDL硬件描述功能的深刻理解。本章我們采用門級電路做入門描述,目標(biāo)在于理解VerilogHDL語言描述的結(jié)構(gòu)和方法。在第四章中我們還將詳細(xì)介紹Verilog的相關(guān)細(xì)節(jié),包括運(yùn)算操作符、結(jié)構(gòu)組成以及寄存器級的組合邏輯描述等。 3.2模塊結(jié)構(gòu)和編程框架

3.2.1模塊的結(jié)構(gòu)

我們以1位比較器為例。比較器包含兩個輸入:分別為i0和i1,輸出為eq;當(dāng)i0和i1相等時,eq輸出為1,否則,eq輸出為0。真值表如表3-1所示。

如果用基本邏輯門電路(非門、與門、或門、異或等)來完成此電路功能,采用數(shù)字電路常用的描述方法來描述如下:大家若有數(shù)字電路和C語言的基礎(chǔ),則理解程序3-1所示這段代碼不會有什么問題。我們通過這段簡單代碼的學(xué)習(xí),掌握VerilogHDL的語言描述結(jié)構(gòu)。

【程序3-1】1位比較器的Verilog語言描述。

moduleeq1

//I/O端口

(

inputwirei0,i1,

outputwireeq

);

//信號聲明

wirep0,p1;

//主體部分

//將兩項(xiàng)結(jié)果相或

assigneq=p0|p1;

//賦值p0和p1;

assignp0=~i0&~i1;

assignp1=i0&i1;

endmodule

學(xué)習(xí)和理解硬件描述語言最好的辦法就是要思考所描述的電路具體是什么樣的構(gòu)造,比如當(dāng)前這段代碼,我們可以從三個方面進(jìn)行考慮:

(1)?I/O端口部分描述了電路的輸入輸出端口,輸入端口包括i0和i1,輸出端口為eq。

(2)信號聲明部分描述電路的內(nèi)部連接信號,它們是p0和p1。

(3)主體部分描述了內(nèi)部電路的組織結(jié)構(gòu),代碼中有三個阻塞賦值語句,每一句可以理解為一個簡單功能的描述,所以一般的模塊結(jié)構(gòu)可以簡單總結(jié)如下:

module<模塊名>(<端口列表>)

<信號聲明>

<主體描述>

endmodule圖3-11位比較器模塊框圖3.2.2編程框架

Verilog語言是一種硬件描述語言,所以它和其他的描述一樣,理解起來都不困難。但是在讀Verilog代碼時,必須要用硬件思維方式,才能更準(zhǔn)確地理解Verilog語言的含義。因?yàn)閂erilog語言描述的是一種“硬件組織結(jié)構(gòu)”而不是我們所理解的純粹意義上的“數(shù)學(xué)邏輯”。

在本書,我們所有的Verilog代碼都遵循如下的編程結(jié)構(gòu),包括三個部分:端口聲明、信號定義和程序?qū)嶓w。

1.端口聲明

在例3-1程序中,模塊的端口聲明如下:

moduleeql

(

inputwirei0,il,

outputwireeq

);

I/O端口聲明包括如下三個部分:端口方向、數(shù)據(jù)類型、模塊端口名稱。簡單模塊如下:

module[模塊名稱]

(

[mode][數(shù)據(jù)類型][端口名稱1],

[mode][數(shù)據(jù)類型][端口名稱2],

[mode][數(shù)據(jù)類型][端口名稱n]

);

其中,[mode]包括input、output、inout,它們分別代表輸入、輸出、雙向端口。注意列舉最后一個端口的聲明后面不用逗號。另外,如果數(shù)據(jù)類型為wire型,則可以省略。如果是使用Verilog-1995標(biāo)準(zhǔn)的端口聲明,則端口名稱,端口類型以及端口數(shù)據(jù)類型都分開聲明。比如在程序3-1中,我們聲明如下:

moduleeql(i0,il,eq);//列舉端口信號

inputi0,il; //聲明輸入類型

outputeq; //聲明輸出類型

wirei0,il; //聲明數(shù)據(jù)類型

wireeq; //聲明數(shù)據(jù)類型

2.程序?qū)嶓w

Verilog語言的執(zhí)行過程和C語言的不一樣,在C語言中,語句是順序執(zhí)行的,而可綜合Verilog語言可以被理解為電路元件的搭建和組裝,所有的模塊是并向執(zhí)行的。

每個模塊的描述方法一般來說有如下3種:

(1)持續(xù)賦值語句;

(2)?always塊語句;

(3)?module語句。第一種描述方法是用持續(xù)賦值語句。這種方法一般用在描述簡單的組合邏輯電路,其描述格式如下:

assign[信號名]=[表達(dá)式];

每個持續(xù)賦值語句都是一個完整電路模塊,左邊信號為輸出,右邊表達(dá)式運(yùn)算值為輸入。需要注意的是,“=”為賦值符號。我們可以用下面的例子來描述這種功能:

assigneq=p0&pl;

描述了一個“與”操作,當(dāng)p0或者p1值發(fā)生改變時,此賦值語句就被立即激活并執(zhí)行,eq立即被賦予新值,僅僅只有電信號的傳播延遲。程序3-1中有三條持續(xù)賦值語句。描述的電路結(jié)構(gòu)如圖3-1所示,由于持續(xù)賦值語句描述的是電路的結(jié)構(gòu)關(guān)系,所以與描述語句的順序是沒有關(guān)系的。

第二種描述方法是用always模塊描述。在always模塊里面描述的語句是順序執(zhí)行的,可以用來描述復(fù)雜的電路結(jié)構(gòu)。在后面章節(jié)將做詳細(xì)介紹。

第三種描述方式是用module模塊例化,模塊例化是指在當(dāng)前模塊中調(diào)用別的模塊,形成模塊調(diào)用的層次結(jié)構(gòu)。這種描述方式在復(fù)雜數(shù)字系統(tǒng)中使用非常廣泛,在后面章節(jié)將作詳細(xì)闡述。

3.信號聲明

信號聲明的對象包括在模塊當(dāng)中需要的內(nèi)部信號和參數(shù),內(nèi)部信號可以理解為內(nèi)部電路模塊之間的互聯(lián)線,如圖3-1所示的幾個小模塊之間的互連線p0和p1。信號聲明的格式如下:

[數(shù)據(jù)類型][信號名稱];

程序3-1中的信號聲明為

wirep0,pl;

這里需要注意的是,還有一種隱含信號。在Verilog中,并不是所有的信號都必須要聲明了才能使用,有的信號聲明是可以被忽略的,這就屬于隱含信號。隱含信號默認(rèn)的數(shù)據(jù)類型是wire型??梢詫⒊绦?-1中的代碼修改成隱含信號描述方式來加深對隱含信號概念的理解,如程序3-2所示。

【程序3-2】帶隱含聲明的比較器聲明。

moduleeql_implicit

(

inputi0,il, //沒有數(shù)據(jù)類型聲明

outputeq

);

//此處沒有內(nèi)部數(shù)據(jù)聲明

assignp0=-i0&-il; //隱含聲明

assignpl=i0&il; //隱含聲明

assigneq=p0|pl; //兩個信號的或運(yùn)算

endmodule

雖然隱含聲明顯得代碼更加簡潔,但是可讀性不好。所以在非常直觀的情況下建議使用隱含聲明,而在程序較為復(fù)雜的情況下,為了避免錯誤,盡量進(jìn)行聲明。這樣一來,程序讀起來更加清晰。

我們將程序3-1描述的比較器擴(kuò)展成2bit輸入,假設(shè)輸入為a、b,輸出為eq_ab,當(dāng)a、b信號相等時,eq_ab信號賦值,代碼如程序3-3所示。

【程序3-3】擴(kuò)展程序3-1描述的比較器為2bit輸入。

moduleeq2_top

(

inputwire[1:0]a,b,

outputwireeq_ab

);

wirep0,p1,p2,p3; //內(nèi)部信號聲明

assigneq_ab=p0|p1|p2|p3; //各個模塊進(jìn)行或操作

assignp0=(~a[1]&~b[1])&(~a[0]&~b[0]); //模塊p0描述

assignp1=(~a[1]&~b[1])&(a[0]&b[0]); //模塊p1描述

assignp2=(a[1]&b[1])&(~a[0]&~b[0]); //模塊p2描述

assignp3=(a[1]&b[1])&(a[0]&b[0]); //模塊p3描述

endmodule

仔細(xì)分析上面代碼,可以發(fā)現(xiàn),其實(shí)它與1位比較器有相似之處。信號a、b都聲明為2bit信號,信號p0、p1、p2、p3代表四個模塊的輸出,信號eq_ab為四個模塊輸出值的或運(yùn)算值。如此描述相當(dāng)繁瑣,是不是可以利用程序3-1所描述的一位比較器來完成這個復(fù)雜的比較器呢?讀完本章大家就明白了。 3.3數(shù)據(jù)類型和基本元素

3.3.1基本概念

1.標(biāo)識符

標(biāo)識符是描述對象唯一的名字,如程序3-1中的p0、p1、i0、i1等。標(biāo)識符只能由大小寫英文字母、下劃線(_)、美元符號($)以及阿拉伯?dāng)?shù)字組成。標(biāo)識符的第一個字符必須是大小寫英文字母或者下劃線,而不能是數(shù)字,$通常在系統(tǒng)任務(wù)或者系統(tǒng)函數(shù)中用。

每個對象的標(biāo)識符盡量選擇可以描述其功能的名字,比如,men_addr_en,我們一眼就可看出是描述存儲地址的使能信號。

Verilog語言對大小寫敏感,所以Data_bus和data_bus是代表不同的對象。為了避免沖突,一般情況下不允許通過大小寫來區(qū)分兩個標(biāo)識符。

2.關(guān)鍵字

關(guān)鍵字是Verilog語言已經(jīng)定義過的一系列保留字,關(guān)鍵字不可用在標(biāo)識符,在開發(fā)中也建議將不確定是否關(guān)鍵字的標(biāo)識符首字母大寫,因?yàn)樗械年P(guān)鍵字都是小寫的。在本書中,所有的關(guān)鍵字都用黑體表示,如程序3-1中的module和wire。

3.空格

空格包括Space、Tab、換行鍵,用來將標(biāo)識符分開。經(jīng)常在Verilog代碼中用來調(diào)整代碼格式,使得代碼可讀性好。

4.注釋

Verilog的注釋方式和C語言是一樣的。有兩種注釋方式,一種是單行注釋,在所注釋的語句之前加“//”;另外一種注釋方式是針對段落注釋,將所注釋的文字放在“/*和*/”之間。3.3.2基本數(shù)據(jù)類型值

大多數(shù)數(shù)據(jù)類型包括四種基本值:

0:代表邏輯0,或者錯誤;

1:代表邏輯1,或者正確;

Z:代表高阻狀態(tài);

X:代表不確定值,用作信號狀態(tài)時表示未知,當(dāng)用作條件判斷時(在casez或者casez中)表示不關(guān)心。

Z值指的是三態(tài)緩沖器的輸出,X通常用在仿真模塊中,代表一個不是0、1和Z的值,比如沒有初始化的輸入輸出端口。在Verilog語言中,所有數(shù)據(jù)都是由以上四種基本邏輯值“0”、“1”、“X”、“Z”構(gòu)成的,同時,“X”和“Z”是不區(qū)分大小寫的。3.3.3數(shù)據(jù)類型

1.wire型

描述硬件組件之間的物理連線,經(jīng)常用在持續(xù)賦值語句的輸出和模塊之間的連接信號,比如說定義1bit的信號:

wirep0,p1;//兩個1bit信號

如果描述的是總線型的信號,則可以用一維數(shù)組來表示,例如:

wire[7:0]datal,data2; //8bit數(shù)據(jù)

wire[31:0]addr; //32bit地址

wire[0:7]revers-data; //增長式索引也是允許的

索引可以是遞增式,也可以是遞減式,前者表示方法對應(yīng)于二進(jìn)制中的大端表示。

2.reg型

描述reg型數(shù)據(jù)常用來表示always模塊內(nèi)的信號。

reg型信號的定義格式如下:

reg[n-1:0]

數(shù)據(jù)名1,數(shù)據(jù)名2,…,數(shù)據(jù)名N;

例如:

reg[9:0]a,b,c; //a,b,c都是位寬為10的寄存器

reg型數(shù)據(jù)的默認(rèn)值是未知的,reg型數(shù)據(jù)可以為正值或負(fù)值,但是當(dāng)reg型數(shù)據(jù)是一個表達(dá)式中的操作數(shù)時,它的值被當(dāng)作無符號值,即正值。如果一個4位的reg型數(shù)據(jù)被寫入-1,在表達(dá)式運(yùn)算時,其值被認(rèn)為是+15。

reg型和wire型的區(qū)別在于,reg型保持最后一次的賦值,而wire型需要持續(xù)的驅(qū)動。

3.memory型

memory型表示方法是通過二維數(shù)組方式來表示的,其定義格式如下:

reg[n-1,0]

存儲器名[m-1,0];

其中,reg[n-1,0]定義了存儲器中每一個存儲單元的大小,即該寄存器單元是一個n位位寬的寄存器;存儲器后面的[m-1,0]定義了存儲器的大小,即該存儲器中有多少個這樣的寄存器單元。

例如,一個32?×?4的memory,也就是說有32個存儲單元,每個存儲單元位寬是4bit,那么可以表示為

wire[3:0]men1[31:0]; //32?×?4memory

注意,對存儲器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。盡管memory型和reg型數(shù)據(jù)的定義比較接近,但二者有很大的區(qū)別,例如一個由n個1位寄存器構(gòu)成的存儲器是不同于一個n位寄存器的。

reg[n-1,0]rega; //一個n位的寄存器

regmema[n-1,0]; //一個由n個1位寄存器構(gòu)成的存儲器組

一個n位的寄存器可以在一條賦值語句中直接賦值,但是存儲器則不行。例如:

rega=0; //合法賦值

mema=0; //非法賦值

如果要多個memory進(jìn)行賦值,則必須要指定地址。例如:

mema[0]=1;

reg[3:0]xrom[4:1];

xrom[1]=4'h0;

xrom[2]=4'h1;

4.parameter型

parameter用來定義常量。常用parameter來定義一個標(biāo)識符表示一個常數(shù)。采用該類型可以提高程序的可讀性和可維護(hù)性。

parameter型信號的定義格式如下:

parameter

參數(shù)名1=數(shù)據(jù)名1;

例如:

parameters1=1;

parameter[3:0]state0=4‘h0,

state1=4’h1,

state2=4‘h2,

state3=4'h3;3.3.4常量

verilog語言中常量分為3類:整數(shù)型、實(shí)數(shù)型以及字符串型。下劃線可以隨意在整數(shù)和實(shí)數(shù)中使用,不會影響數(shù)值,只是用來提高代碼的可讀性。

1.整數(shù)

整數(shù)描述的通用格式如下:

[數(shù)據(jù)位寬]?'?[進(jìn)制表示][值]

[進(jìn)制表示]?有四種:

(1)?b或者B,表示二進(jìn)制;

(2)?o或者O,表示八進(jìn)制;

(3)?h或者H,表示十六進(jìn)制;

(4)?d或者D,表示十進(jìn)制;

[數(shù)據(jù)位寬]?表示數(shù)值的位寬值,如果沒有數(shù)據(jù)位寬,則表示數(shù)據(jù)位寬未知。

例如:

6‘b0010016位二進(jìn)制數(shù);

5’o75位八進(jìn)制數(shù);

9‘d69位十進(jìn)制數(shù);

8'hz8位十六進(jìn)制數(shù)。

2.實(shí)數(shù)

實(shí)數(shù)可以用下面兩種形式定義;

1)十進(jìn)制計(jì)數(shù)法

例如:

2.0

16.369

2)科學(xué)計(jì)數(shù)法

例如:

234-12e2值為23412

5e-4值為0.00005

根據(jù)Verilog語言的定義,實(shí)數(shù)通過四舍五入隱式地轉(zhuǎn)換為最相近的整數(shù)。

3.字符串

字符串是雙引號內(nèi)的字符序列,字符串不能分出多行書寫,例如:

"counter"

用8位ASCII值表示的字符可以看做是無符號整數(shù),因此字符串是8位ASCII值的序列。為存儲字符串"counter",變量需要8?×?7位。

reg[1:8*7]Char;

Char="Conter"; 3.4結(jié)?構(gòu)?化?描?述

在數(shù)字系統(tǒng)中,一個復(fù)雜的系統(tǒng)往往是由好多個子系統(tǒng)組成的。我們在設(shè)計(jì)復(fù)雜系統(tǒng)時,盡量會調(diào)用已經(jīng)驗(yàn)證過的子系統(tǒng)來進(jìn)行設(shè)計(jì),而不是每次都要重新設(shè)計(jì)子模塊。Verilog語言為我們提供了模塊例化來實(shí)現(xiàn)這個工作,我們稱這種使用了例化模塊電路的描述語句為結(jié)構(gòu)描述。

現(xiàn)在重新來考慮2位比較器,使用1位比較器模塊將它實(shí)現(xiàn)。結(jié)合圖3-2,我們可以設(shè)想:用兩個1位比較器分別檢查2位比較器的輸入信號a和b的bit0位和bit1位是否相等,然后再進(jìn)行與操作,結(jié)果賦值給eq_ab。這樣我們調(diào)用了前面設(shè)計(jì)的1位比較器模塊,對應(yīng)的代碼如程序3-4所示。

【程序3-4】使用1位比較器模塊來實(shí)現(xiàn)2位比較器。

moduleeq2

(

inputwire[1:0]a,b,

outputwireeq_ab

);

wiree0,e1; //內(nèi)部信號聲明

//主體部分

eq1eq_bit0_unit(.i0(a[0]),.i1(b[0]),.eq(e0)); //例化1位比較器

eq1eq_bit1_unit(.eq(e1),.i0(a[1]),.i1(b[1]));//例化1位比較器

assigneq_ab=e0&e1; //若a[0]和b[0]相等,a[1]和//b[1]相等,則a和b信號相等

endmodule

圖3-2兩個1位比較器組成的兩位比較器框圖程序3-4中,包含了兩個模塊例化。模塊例化的格式如下:

[被例化模塊名稱][例化名稱]

(

·[端口名稱]([型號名稱]),

·[端口名稱]([型號名稱]),

);第一部分是模塊例化。其中,[被例化模塊名稱]指的是將在被系統(tǒng)中調(diào)用的那個模塊,通常這個模塊是在另外一個?.v文件中;【例化名稱】指的是在本系統(tǒng)中為模塊起一個代號名稱。第二部分是端口映射關(guān)系,表示了被例化模塊端口與本系統(tǒng)中的信號之間的連線關(guān)系,端口聲明只表示連接關(guān)系,所以與它們的描述順序沒有關(guān)系。

例如在程序3-4中,第一個例化語句是:

eq1eq_bit0_unit(.i0(a[0]),.i1(b[0]),.eq(e0));

而且eq1是在程序3-1中是模塊名稱,端口映射關(guān)系如圖3-2所示。因此,對于本系統(tǒng)來說,被例化模塊是一個“黑盒子”,其實(shí)際的功能是在另外一個module文件中定義的。

1.關(guān)于按順序例化

如果在描述第二部分的端口連接時,也可以按照子模塊模塊聲明順序來連接,則子模塊的端口名稱就可以省略掉,僅僅需要按照與子模塊對應(yīng)連接關(guān)系聲明的信號順序列舉出來就可以了。程序3-4就可以被重新寫為

eq1eq_bit0_unit(.(a[0]),.(b[0]),.(e0));

eq1eq_bit1_unit(.(a[1]),.(b[1]),.(e1));

這時a[0]和b[0]之間的先后順序是不可以更改的。我們發(fā)現(xiàn),代碼結(jié)構(gòu)精簡了很多,可是在讀代碼時還是不夠清晰直觀,尤其在模塊調(diào)用很多時,出了問題很難查錯。所以還是不建議大家采用這種方法進(jìn)行模塊例化。

2.關(guān)于Verilog原語

在Verilog當(dāng)中,允許預(yù)先定義原語,然后在模塊中進(jìn)行例化調(diào)用。這些原語往往描述為一個簡單的門電路模塊,比如and、or或者not、and4等,比如說eq1可以聲明為一個原語,如圖3-3所示,相對應(yīng)的RTL程序如程序3-5所示。圖3-31位比較器的底層結(jié)構(gòu)圖

【程序3-5】使用預(yù)定義方式描述1位比較器。

moduleeq1_primitive

(

input

wirei0,i1,

output

wireeq

);

wirei0_n,i1_n,p0,p1; //內(nèi)部信號聲明

//原語門例化

notunit1(i0_n,i0); //i0_n=~i0;

notunit2(i1_n,i1); //i1_n=~i1;

andunit3(p0,i0_n,i1_n); //p0=i0_n&i1_n;

andunit4(p1,i0,i1); //p1=i0&i1;

orunit5(eq,p0,p1); //eq=p0|p1;

endmodule

這樣的代碼有些冗長,完全可以用簡單的邏輯來代替,所以一般不采用這種方式來描述。

除了預(yù)定義原語之外,我們還可以自定義原語,稱為(user-defineprimitevesUDPs),比如說,可以用原語方式定義1位比較器電路。如程序3-6所示。

【程序3-6】自定義方式定義1位比較器電路。

primitiveeq1_udp(eq,i0,i1);

outputeq;

inputi0,i1;

table

//i0i1:eq

00:1;

01:0;

10:0;

11:1;

endtable

endprimitive 3.5TestBench簡介

第一章中我們講了FPGA的開發(fā)流程,當(dāng)代碼開發(fā)結(jié)束時,可以在計(jì)算機(jī)里面將代碼進(jìn)行仿真,仿真結(jié)果正確再進(jìn)行物理綜合。仿真往往需要在一定的環(huán)境中進(jìn)行,所以需要編寫一個特殊的叫TestBench的程序模擬一個測試平臺,來驗(yàn)證設(shè)計(jì)的電路。比如說,2位比較器的TestBench如圖3-4所示,其中設(shè)計(jì)(eq2)模塊為被測試模塊單元,測試向量產(chǎn)生模塊產(chǎn)生測試輸入?yún)?shù),監(jiān)視器模塊檢查輸出結(jié)果,一個簡單的2位比較器測試TestBench如程序3-7所示。圖3-4測試平臺結(jié)構(gòu)圖

【程序3-7】2位比較器的TestBench。

'timescale1ns/10ps//表示時序仿真時間單位是1ns,時序仿真精度是10ps

moduleeq2_testbench;

reg[1:0]test_in0,test_in1; //信號聲明

wiretest_out; //信號聲明

eq2uut(.a(test_in0),.b(test_in1),.aeqb(test_out)); //例化被測試模塊

//測試向量生成

initial

begin

//測試向量1

test_in0=2'b00;

test_in1=2'b00;

#200;

//測試向量2

test_in0=2'b01;

test_in1=2'b00;

#200;

//測試向量3

test_in0=2'b01;

test_in1=2'b11;

#200;

//測試向量4

test_in0=2'b10;

test_in1=2'b10;

#200;

//測試向量5

test_in0=2'b10;

test_in1=2'b00;

#200;

//測試向量6

test_in0=2'b11;

test_in1=2'b11;

#200;

//

溫馨提示

  • 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

提交評論