b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...
1.一個(gè)完整版實(shí)例
上一次Verilog學(xué)習(xí)筆記中,我通過幾個(gè)小例子,較為直觀的對(duì)Verilog編程有了一些了解。這次筆記,我開始著重的系統(tǒng)學(xué)習(xí)Verilog編程語法基礎(chǔ)。在我系統(tǒng)學(xué)習(xí)語法之前,我先用一個(gè)實(shí)例,引入這次筆記。
上圖被測(cè)試器件被測(cè)試器件DUT 是一個(gè)二選一多路器。測(cè)試裝置(test testbench or fixture)提供測(cè)試激勵(lì)及驗(yàn)證機(jī)制。TestBench 使用行為級(jí)描述,DUT采用門級(jí)描述。下面將給出 采用門級(jí)描述。下面將給出TestBench的描述、DUT的描述及如何進(jìn)行混合仿真。
1)書寫Verilog程序
上圖依舊是我們?cè)?jīng)提到的經(jīng)典二選一電路,現(xiàn)在我對(duì)其進(jìn)行Verilog編程(以后文章中程序均為筆者在Sublime Text3中書寫):
2)書寫該程序的TestBench
書寫TestBench時(shí)候應(yīng)注意,此驗(yàn)證性程序是沒有端口的,這是因?yàn)門estBench是最頂層模塊,不會(huì)被其他模塊實(shí)例化,所以不需要端口。同時(shí)硬件描述程序中,即MUX2_1.V程序在TestBench中需要進(jìn)行實(shí)例化,應(yīng)注意模塊名字要與引用模塊(即MUX2_1)相同;實(shí)例的名字可以任意,但是要符合標(biāo)記命名規(guī)則;端口列表與引用模塊次序相同(即out ,a,b,sel)。
在書寫TestBench時(shí)候常用initial和always這兩個(gè)過程語句,二者區(qū)別為:initial:只能執(zhí)行一次;always:循環(huán)執(zhí)行。值得注意的是所有過程在時(shí)間0執(zhí)行一次,過程之間是并行執(zhí)行的(FPGA的特點(diǎn))。
激勵(lì)描述:
(本圖同數(shù)字電路中真值表)? 例子中,a, b, sel說明為reg類數(shù)據(jù)。reg類數(shù)據(jù)是寄存器類數(shù)據(jù)信號(hào),在重新賦值前一直保持當(dāng)前數(shù)據(jù)。例子中,a, b, sel說明為reg類數(shù)據(jù)。reg類數(shù)據(jù)是寄存器類數(shù)據(jù)信號(hào),在重新賦值前一直保持當(dāng)前數(shù)據(jù)。
? #5 用于指示等待5個(gè)時(shí)間單位。
? $ stop是結(jié)束仿真的系統(tǒng)任務(wù),也可以寫成$finish。
3)TestBench 響應(yīng)的產(chǎn)生
Verilog 提供了一些系統(tǒng)任務(wù)和系統(tǒng)函數(shù),包括:
? $time 系統(tǒng)函數(shù),給出當(dāng)前仿真時(shí)間;
? $monitor 系統(tǒng)任務(wù),若參數(shù)列表中的參數(shù)值發(fā)生變化,則在時(shí)間單位末顯示參數(shù)值。
格式:$monitor ([“format_specifiers”,] <arguments>);
例如:$monitor($time, o, in1, in2);
$monitor($time, “%b %h%d %o”, sig1, sig2, sig3,sig4);
說明:
a)$time 是一個(gè)系統(tǒng)函數(shù),返回當(dāng)前返回仿真時(shí)間。時(shí)間用64位整數(shù)表示。
b)$monitor 在時(shí)間單位末,若參數(shù)列表中的參數(shù)值發(fā)生變化則顯示所列參數(shù)的值。由$time引起的變化不會(huì)顯示。
c)$monitor系統(tǒng)任務(wù)支持不同的數(shù)基。缺省數(shù)基是十進(jìn)制。支持的數(shù)基還有二進(jìn)制、八進(jìn)制、十進(jìn)制。
4)完整的TestBench
2.模塊的結(jié)構(gòu)
Verilog的基本設(shè)計(jì)單元是“模塊”(block) 。一個(gè)模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。
Verilog 模塊的結(jié)構(gòu)由在module和endmodule 關(guān)鍵詞之間的四個(gè)主要部分組成:
1)模塊端口的定義
模塊的端口聲明了模塊的輸入輸出口。其格式如下:
module 模塊名(口1,口2,口3,口4, ………);
模塊名(標(biāo)識(shí)符)的命名規(guī)則:
? 標(biāo)識(shí)符是用戶在描述時(shí)給 標(biāo)識(shí)符是用戶在描述時(shí)給Verilog對(duì)象起的名字;
? 標(biāo)識(shí)符必須以字母 標(biāo)識(shí)符必須以字母(a-z, A-Z) 或( _ ) 開頭,后面可以是字母、數(shù)字、( $ )或( _ )。
? 最長可以是1023個(gè)字符個(gè)字符。
? 標(biāo)識(shí)符區(qū)分大小寫,標(biāo)識(shí)符區(qū)分大小寫,sel 和SEL是不同的標(biāo)識(shí)符。
? 模塊、端口和實(shí)例的名字都是標(biāo)識(shí)符。
? 標(biāo)識(shí)符要區(qū)別與關(guān)鍵字,這個(gè)命名規(guī)則和C語言大同小異。
2)編程命名規(guī)范
a)匈牙利命名:
開頭字母用變量類型的縮寫,其余部分用變量的英文或英文的縮寫,要求單詞第一個(gè)字母大寫。
int iMyAge; “i”是int類型的縮寫; char cMyName[10]; “c”是char類型的縮寫; float fManHeight; “f”是float類型的縮寫;
b)駝峰式命名法:
又叫小駝峰式命名法。第一個(gè)單詞首字母小寫,后面其他單詞首字母大寫。
int myAge;
char myName[10];
float manHeight;
c)帕斯卡命名法:
又叫大駝峰式命名法。每個(gè)單詞的第一個(gè)字母都大寫。
int MyAge;
char MyName[10];
float ManHeight;
個(gè)人比較喜歡駝峰命名法和下劃線結(jié)合來用。
3)模塊內(nèi)容
模塊的內(nèi)容包括I/O說明、內(nèi)部信號(hào)聲明、功能定義。
I/O說明的格式:
輸入口:input[信號(hào)位寬-1:0] 端口名1;
input[信號(hào)位寬-1:0] 端口名2;
…
input[信號(hào)位寬-1:0] 端口名i; //(共有i個(gè)輸入口)
輸出口:output[信號(hào)位寬-1:0] 端口名1;
output[信號(hào)位寬-1:0] 端口名2;
…
output[信號(hào)位寬-1:0] 端口名j; //(共有j個(gè)輸出口)
輸入/輸出口:inout[信號(hào)位寬-1:0] 端口名1;
inout[信號(hào)位寬-1:0] 端口名2;
…
inout[信號(hào)位寬-1:0] 端口名k; //(共有k個(gè)雙向總線端口)
注:I/O說明也可以寫在端口聲明語句里。其格式如下:
module module_name(input port1,input port2,… output port1,output port2… );
4)內(nèi)部信號(hào)說明
在模塊內(nèi)用到的和與端口有關(guān)的wire 和 reg 變量的聲明。
如: reg [width-1 :0] R變量1,R變量2 …;
wire [width-1 : 0] W變量1,W變量2 …;
5)功能定義
模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產(chǎn)生邏輯。
a)用 assign 語句(數(shù)據(jù)流描述):assign a = b & c ;
b)用實(shí)例元件(結(jié)構(gòu)化描述):and2 and_inst ( q, a, b);
c)用 “always” 塊(行為描述):
always @ (posedge clk or
posedge clr)//敏感性列表
begin
if (clr) q<= 0;
else if (en) q<= d;
end //begin……end相當(dāng)于C語言中的()
說明:上述三條語句是并行的,他們產(chǎn)生獨(dú)立的邏輯電路;而在always塊中:begin和end之間是順序執(zhí)行的。
3.數(shù)據(jù)類型及常量和變量
1)常量
在程序運(yùn)行過程中,其值不能被改變的量稱為常量。
I.數(shù)字:
(1)整數(shù)
在Verilog HDL中,整型常量即整常數(shù)有以下四種進(jìn)制表示形式:
a)二進(jìn)制整數(shù)(b或B)
b) 十進(jìn)制整數(shù)(d或D)
c) 十六進(jìn)制整數(shù)(h或H)
d) 八進(jìn)制整數(shù)(o或O)
數(shù)字表達(dá)方式有以下三種:
a) <位寬><進(jìn)制><數(shù)字>這是一種全面的描述方式。
b) <進(jìn)制><數(shù)字>在這種描述方式中,數(shù)字的位寬采用缺省位寬(這由具體的機(jī)器系統(tǒng)決定,但至少32位)。
c) <數(shù)字>在這種描述方式中,采用缺省進(jìn)制十進(jìn)制。
(2)X,Z,0,1的含義
在數(shù)字電路中,x代表不定值,z代表高阻值。一個(gè)x可以用來定義十六進(jìn)制數(shù)的4位二進(jìn)制數(shù)的狀態(tài),八進(jìn)制數(shù)的3位,二進(jìn)制數(shù)的1位。z的表示方式同x類似。z還有一種表達(dá)方式是可以寫作“?”。
(3)負(fù)數(shù)
一個(gè)數(shù)字可以被定義為負(fù)數(shù),只需在位寬表達(dá)式前加一個(gè)減號(hào),減號(hào)必須寫在數(shù)字定義表達(dá)式的最前面。注意減號(hào)不可以放在位寬和進(jìn)制之間也不可以放在進(jìn)制和具體的數(shù)之間。
-8'd5 //這個(gè)表達(dá)式代表5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)
8‘d-5 //非法格式
(4)下畫線(underscore_)
下劃線可以用來分隔開數(shù)的表達(dá)以提高程序可讀性。但不可以用在位寬和進(jìn)制處,只能用在具體的數(shù)字之間。
16'b1010_1011_1111_1010 //合法格式
8'b_0011_1010 //非法格式
當(dāng)常量不說明位數(shù)時(shí),默認(rèn)值是32位,每個(gè)字母用8位的ASCII值表示。
(5)基數(shù)符號(hào)及其合法的表示值
舉例:
(6)實(shí)型數(shù)及其表示
Verilog中的實(shí)數(shù)可以用十進(jìn)制與科學(xué)計(jì)數(shù)法兩種格式來表示,如果采用十進(jìn)制格式,小數(shù)點(diǎn)兩邊必須都有數(shù)字,否則為非法的表示形式。
實(shí)例:
排版太困難了,原諒我用圖片了II. 參數(shù)型(parameter)
a)用參數(shù)聲明一個(gè)可變常量,常用于定義延時(shí)及寬度變量。
b)參數(shù)定義的語法:parameter <list_of_assignment>;
c)可一次定義多個(gè)參數(shù),用逗號(hào)隔開。
d)在使用文字(literal)的地方都可以使用參數(shù)。
e)參數(shù)的定義是局部的,只在當(dāng)前模塊中有效。
f)參數(shù)定義可使用以前定義的整數(shù)和實(shí)數(shù)參數(shù)。
2)變量
變量即在程序運(yùn)行過程中其值可以改變的量。常用的網(wǎng)絡(luò)數(shù)據(jù)類型包括wire型和tri型。wire型變量通常是用來表示單個(gè)門驅(qū)動(dòng)或連續(xù)賦值語句驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù),tri型變量則用來表示多驅(qū)動(dòng)器驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù)。
a)wire型
wire型數(shù)據(jù)常用來表示用于以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。其格式如下:
wire [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i; //共有i條總線,每條總線內(nèi)有n條線路,或
wire [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i;
b)reg型
寄存器是數(shù)據(jù)儲(chǔ)存單元的抽象。寄存器數(shù)據(jù)類型的關(guān)鍵字是
reg。 reg類型數(shù)據(jù)的默認(rèn)初始值為不定值x。reg型數(shù)據(jù)常用來表示用于“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型。
reg型數(shù)據(jù)的格式如下:
reg [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;
或
reg [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;
c)memory型
Verilog HDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。 memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:
reg [n-1:0] 存儲(chǔ)器名[m-1:0];
或
reg [n-1:0] 存儲(chǔ)器名[m:1];
3)如何選擇正確的數(shù)據(jù)類型
a)輸入口(input)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動(dòng),但它本身只能驅(qū)動(dòng)網(wǎng)絡(luò)連接。
b)輸出口 (output)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動(dòng),但它本身只能驅(qū)動(dòng)網(wǎng)絡(luò)連接。
c)輸入/輸出口(inout)只可以由網(wǎng)絡(luò)連接驅(qū)動(dòng),它本身也只能驅(qū)動(dòng)網(wǎng)絡(luò)連接。
d)如果信號(hào)變量是在過程塊 (initial塊或always塊)中被賦值的,必須把它聲明為寄存器類型變量。
『文末說明』
本文作者:小強(qiáng)子
知乎ID:Power小強(qiáng)
一個(gè)細(xì)膩不油膩,嗜好多能力小的普通人,專注于分享電子電氣相關(guān)知識(shí)的打雜碩士生
總結(jié)
以上是生活随笔為你收集整理的b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keystore文件_如何手动给APK文
- 下一篇: 实数系的基本定理_初中篇1|知实数-为什